Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么当我两次包含where子句时,使用嵌套select的查询速度更快_Sql_Sql Server - Fatal编程技术网

Sql 为什么当我两次包含where子句时,使用嵌套select的查询速度更快

Sql 为什么当我两次包含where子句时,使用嵌套select的查询速度更快,sql,sql-server,Sql,Sql Server,我有一个大型sql查询,在from子句中有一个嵌套的select 与此类似: SELECT * FROM ( SELECT * FROM SOME_TABLE WHERE some_num = 20) WHERE some_num = 20 在我的sql查询中,如果删除外部“some_num”=20,则需要5倍的时间。这些查询是否应该几乎完全同时运行,如果不是的话,是否有额外的where会稍微减慢它 关于sql查询如何工作,我还不了解什么 这是有问题的原始查询 SELEC

我有一个大型sql查询,在from子句中有一个嵌套的select

与此类似:

SELECT * FROM 
     ( SELECT * FROM SOME_TABLE WHERE some_num = 20) 
    WHERE some_num = 20
在我的sql查询中,如果删除外部“some_num”=20,则需要5倍的时间。这些查询是否应该几乎完全同时运行,如果不是的话,是否有额外的where会稍微减慢它

关于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,则查询所需的时间是外部Where的5倍

按照要求,执行计划原谅了糟糕的上传


是索引中的“基准”列,但百分比页不是

在内部查询中引用这两列,在外部查询中只引用OFFERITEM

如果看不到执行计划,很难说,但可能是外部查询导致优化器运行“索引扫描”,而内部查询将导致全表扫描

另外,您应该明确修改:

WHERE left(OFFERITEM,6) ='CH1301' 
致:


由于这将允许在offeritem上有索引时进行索引查找。

在回答您的问题之前,我只想了解,当您已经从内部查询中获得结果时,为什么在外部查询中应用相同的条件。显示实际的查询和执行计划。在您给出的示例中,“where”子句不会产生任何影响。另外,“where”子句会使您的查询速度变慢的原因之一是您没有在列上适当地建立索引。我同意Martin的观点-这不会产生任何影响。只要看看这两个执行计划,看看它是否真的有区别。你看过执行计划了吗?--你能把它包括在这里吗?谢谢你接受我的回答-对于其他用户,你能指出我回答的哪一部分对你有帮助吗?我猜是全部吧?:)
where offeritem like 'CH1301%'