2016-09-24 5 views
-1

私のデータベースにはDomesticSalesOrdersInternationalSalesOrdersの2つのテーブルが含まれています。どちらの表にも1億以上の行が含まれています。各テーブルには、SalesOrderIdという名前の主キー列があります。 2つのテーブルのデータは、互いに異なっています。SQL Unionすべての質問

ビジネスユーザーは、グローバル売上の合計数と合計売上金額の合計情報を含むレポートが必要です。可能な限り最小限の時間でクエリが実行されるようにする必要があります。どのクエリを使用する必要がありますか?

オプション1:

SELECT 
    COUNT(*) AS NumberOfSales, 
    SUM(SalesAmount) AS TotalSalesAmount 
FROM 
(
    SELECT 
     SalesOrderId, 
     SalesAmount 
    FROM 
     DomesticSalesOrders 

    UNION ALL 

    SELECT 
     SalesOrderId, 
     SalesAmount 
    FROM 
     InternationalSalesOrders 
) AS p 

オプション2:

SELECT 
    COUNT(*) AS NumberOfSales, 
    SUM(SalesAmount) AS TotalSalesAmount 
FROM 
    DomesticSalesOrders 

UNION ALL 

SELECT 
    COUNT(*) AS NumberOfSales, 
    SUM(SalesAmount) AS TotalSalesAmount 
FROM 
    InternationalSalesOrders 

私は両方が正しいと思いますが、私は違うのか理解できないのですか?おかげ

+3

試しましたか?どのような結果を観察しましたか? – nicomp

+1

これは宿題のように聞こえます。 – Dai

答えて

0

それが唯一の単一行返すため、最初の答えが正しい:

NumberOfSales   | TotalSalesAmount 
-----------------------+---------- 
COUNT(of subquery 1) | SUM(of subquery 1) 
COUNT(of subquery 2) | SUM(of subquery 2) 

が良い答えがスプリットを使用することであろう。第二の答えが2つの行を返す一方

NumberOfSales  | TotalSalesAmount 
---------------------+---------- 
COUNT(of subquery) | SUM(of subquery) 

をオプション2のサブクエリを使用して並列化を利用し、最後に第2レベルの集計を計算します。

SELECT 
    SUM([inner].NumberOfSales) AS NumberOfSales, 
    SUM([inner].SalesAmount ) AS TotalSalesAmount 
FROM 
(
    SELECT 
     COUNT(*) AS NumberOfSales, 
     SUM(SalesAmount) AS TotalSalesAmount 
    FROM 
     DomesticSalesOrders 

    UNION ALL 

    SELECT 
     COUNT(*) AS NumberOfSales, 
     SUM(SalesAmount) AS TotalSalesAmount 
    FROM 
     InternationalSalesOrders 
) AS [inner] 

もちろん、RDBMSの実行方法や実行計画の比較が必要です。十分にスマートなエンジンは、質問のオプション1と同じクエリーの実行計画を生成しますが、必ずしもそうすることはできません。

+0

親愛なるDaiあなたの答えは非常に有用ですありがとう! –