9

SQL Server 2008 R2 に顧客と注文のテーブルがあります。どちらも顧客 ID ( と呼ばれる) にインデックスを持っていますid。顧客テーブル内のすべての顧客に関する詳細と、最初の注文の詳細など、注文テーブルからの情報を返す必要があります。

私は現在、注文テーブルのサブクエリで顧客テーブルに参加し、サブクエリは注文について必要な情報を返します。例えば:

SELECT c.id
        ,c.country      
        ,First_orders.product
        ,First_orders.order_id
FROM customers c

LEFT JOIN   SELECT( id, 
                    product 
            FROM (SELECT    id
                            ,product
                            ,order_id
                            ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY Order_Date asc) as order_No 
                        FROM orders) orders
            WHERE Order_no = 1) First_Orders
ON c.id = First_orders.id

私はSQLにまったく慣れていないので、これを効率的に行っているかどうかを理解したいと思っています。このようなかなりの数のサブクエリを 1 つの選択クエリで customers テーブルに結合することになり、実行に数十分かかることがあります。

それで、私はこれを効率的に行っていますか、それとも改善できますか? たとえば、注文テーブルの id のインデックスが役に立つかどうかはわかりません。最初にサブクエリの内容の一時テーブルを作成し、id の一意のインデックスを作成することで、クエリを高速化できるかもしれません。 SQL Serverがid一意の列であることを認識し、顧客テーブルをこの一時テーブルに結合するための一時テーブルですか? 通常、顧客テーブルと注文テーブルには 100 万から 200 万行あります。

よろしくお願いします!

4

3 に答える 3

7

サブクエリの1つを削除して、もう少し効率的にすることができます。

SELECT c.id
        ,c.country      
        ,First_orders.product
        ,First_orders.order_id
FROM customers c
   LEFT JOIN  (SELECT id
                    ,product
                    ,order_id
                    ,ROW_NUMBER() OVER (PARTITION BY id ORDER BY Order_Date asc) as order_No 
               FROM orders) First_Orders
     ON c.id = First_orders.id AND First_Orders.order_No = 1

上記のクエリでは、かっこを配置する場所に注意する必要があります。これは機能しないと思います。また、結果には製品が返されますが、ネストされたサブクエリには含まれません。

于 2013-02-26T17:17:05.173 に答える
2

SQLを学んでいるだけの人にとって、クエリはかなり見栄えがします。

顧客のインデックスは、クエリに使用される場合と使用されない場合があります。実行プランを確認する必要があります。インデックスorders(id, order_date)は、関数に非常に効果的に使用できますrow_number

1つのコメントは、フィールドの命名に関するものです。フィールドorders.idは顧客IDであってはなりません。'orders.Customer_Id`のようになります。ネーミングシステムをテーブル間で一貫性を保つことは、将来的に役立ちます。

于 2013-02-26T17:16:25.983 に答える