0

from 句にネストされた select を持つ大きな SQL クエリがありました。

これに似ています:

SELECT * FROM 
     ( SELECT * FROM SOME_TABLE WHERE some_num = 20) 
    WHERE some_num = 20

私のSQLクエリでは、外側の「some_num」= 20を削除すると、5倍の時間がかかります。これらのクエリをほぼ同時に実行する必要があります。

SQL クエリの仕組みについて理解していないことは何ですか?

これが問題の元のクエリです

SELECT a.ITEMNO                                                       AS Item_No,
       a.DESCRIPTION                                                  AS Item_Description,
       UNITPRICE / 100                                                AS Retail_Price,
       b.UNITSALES                                                    AS Units_Sold,
       ( Dollar_Sales )                                               AS Dollar_Sales,
       ( Dollar_Cost )                                                AS Dollar_Cost,
       ( Dollar_Sales ) - ( Dollar_Cost )                             AS Gross_Profit,
       ( Percent_Page * c.PAGECOST )                                  AS Page_Cost,
       ( Dollar_Sales - Dollar_Cost - ( Percent_Page * c.PAGECOST ) ) AS Net_Profit,
       Percent_Page * 100                                             AS Percent_Page,
       ( CASE
           WHEN UNITPRICE = 0 THEN NULL
           WHEN Percent_Page = 0 THEN NULL
           WHEN ( Dollar_Sales - Dollar_Cost - ( Percent_Page * c.PAGECOST ) ) > 0 THEN 0
           ELSE ( ceiling(abs(Dollar_Sales - Dollar_Cost - ( Percent_Page * c.PAGECOST )) / ( UNITPRICE / 100 )) )
         END )                                                        AS Break_Even,
       b.PAGENO                                                       AS Page_Num
FROM   (SELECT PAGENO,
               OFFERITEM,
               UNITSALES,
               UNITPRICE,
               ( DOLLARSALES / 100 )                                      AS Dollar_Sales,
               ( DOLLARCOST / 10000 )                                     AS Dollar_Cost,
               (( CAST(STUFF(PERCENTPAGE, 2, 0, '.') AS DECIMAL(9, 6)) )) AS Percent_Page
        FROM   OFFERITEMS
        WHERE  LEFT(OFFERITEM, 6) = 'CH1301'
               AND PERCENTPAGE > 0) AS b
       INNER JOIN ITEMMAST a
         ON a.EDPNO = 1 * RIGHT(OFFERITEM, 8)
       LEFT JOIN OFFERS c
         ON c.OFFERNO = 'CH1301'
WHERE  LEFT(OFFERITEM, 6) = 'CH1301'
ORDER  BY Net_Profit DESC 

二人に注目

WHERE left(OFFERITEM,6) = 'CH1301'

外側の Where を削除すると、クエリに 5 倍の時間がかかります

要求された実行計画は、くだらないアップロードを許します

http://i.imgur.com/1PqmpVf.png

4

1 に答える 1

1

列 OFFERITEM はインデックスにありますが、PERCENTPAGE はそうではありませんか?

内側のクエリではこれらの両方の列を参照し、外側のクエリでは OFFERITEM のみを参照します。

実行計画を見ずに言うのは難しいですが、外側のクエリが原因でオプティマイザが「インデックス スキャン」を実行しているのに対し、内側のクエリがフル テーブル スキャンを実行している可能性があります。

別の注意として、次のことを必ず変更する必要があります。

WHERE left(OFFERITEM,6) ='CH1301' 

に:

where offeritem like 'CH1301%'

これにより、offeritem にインデックスがある場合にインデックス シークが可能になります。

于 2013-09-13T15:19:40.363 に答える