2017-11-13 1 views
0

セットアップ

いくつかのソースからオートコンプリートの電子メールアドレスをフィルタリングするために複数のテーブルを結合しています。私は単純化のためにこの例では2つしか含んでいませんが、実際には現在6つ使用しています。合計結果を制限する前に結合クエリを制限する方が効率的ですか?

使用してSQL Server 2008の

現在のクエリ

SELECT TOP 20 * FROM (
    SELECT 
    ID AS id, 
    LastName + ', ' + FirstName AS label, 
    Email AS identifier, 
    'person' AS source_type 
    FROM Persons 
    WHERE (LastName + ', ' + FirstName LIKE 'a%' OR FirstName + ' ' + LastName LIKE 'a%') 
    AND DATALENGTH(Email) > 0 AND Email IS NOT NULL 
UNION 
    SELECT 
    Company AS id, 
    Name AS label, 
    Email AS identifier, 
    'company' AS source_type 
    FROM Companies 
    WHERE (Name LIKE 'a%') 
    AND DATALENGTH(Email) > 0 AND Email IS NOT NULL 
) temp ORDER BY label ASC 

質問

それは&制限ユニオンクエリを-注文は事前に、より効率的またはよりパフォーマンスだろうか?次のようなものがあります。

SELECT TOP 20 * FROM (
    SELECT TOP 20 
    ID AS id, 
    LastName + ', ' + FirstName AS label, 
    Email AS identifier, 
    'person' AS source_type 
    FROM Persons 
    WHERE (LastName + ', ' + FirstName LIKE 'a%' OR FirstName + ' ' + LastName LIKE 'a%') 
    AND DATALENGTH(Email) > 0 AND Email IS NOT NULL 
    ORDER BY LastName ASC, FirstName ASC 
UNION 
    SELECT TOP 20 
    ID AS id, 
    Name AS label, 
    Email AS identifier, 
    'company' AS source_type 
    FROM Companies 
    WHERE (Name LIKE 'a%') 
    AND DATALENGTH(Email) > 0 AND Email IS NOT NULL 
    ORDER BY Name ASC 
) temp ORDER BY label ASC 

答えて

0

絶対にUNIONです。

UNIONは重複を除去するためのオーバーヘッドが発生し - これはハッシュベースまたはソートベース重複除去アルゴリズムのいずれかです。いずれにしても、記録が少ないほど高速です。

状況はUNION ALLと少し異なります。 SQL Serverは、外側のクエリから内側のサブクエリに述語をプッシュすることについてかなり優れています。ただし、サブクエリで索引を使用(またはパーティション化)することがあり、サブクエリ内に論理を含めると、オプティマイザがそのような改善を簡単に見つけることができます。

関連する問題