SQL WHERE子句执行顺序

时间:2018-04-03 23:23:35

标签: where-clause sql-execution-plan

如何确定SQL语句中WHERE子句的执行?

例如:

第一个查询在8秒内执行。

SELECT c.claimnum, 
       cd.procedurecode, 
       cd.charges, 
       cd.contractamount, 
       dbo.Fn_getfeeschedamount(cd.pk_claimdetail) 
FROM   claim c WITH(nolock) 
       INNER JOIN claimdetail cd WITH(nolock) 
               ON cd.fk_claim = c.pk_claim 
WHERE  c.dateprocessed BETWEEN dbo.Fn_datenotime(Getdate()) AND Replace( 
                                      Cast(dbo.Fn_datenotime(Getdate()) AS 
                                           VARCHAR), '12:00AM', '11:59PM') 
ORDER  BY c.claimnum 

第二个查询在10秒内执行。

SELECT * 
FROM   (SELECT c.claimnum, 
               cd.procedurecode, 
               cd.charges, 
               cd.contractamount, 
               dbo.Fn_getfeeschedamount(cd.pk_claimdetail) AS [CalcAmount] 
        FROM   claim c WITH(nolock) 
               INNER JOIN claimdetail cd WITH(nolock) 
                       ON cd.fk_claim = c.pk_claim 
        WHERE  c.dateprocessed BETWEEN dbo.Fn_datenotime(Getdate()) AND Replace( 
                                               Cast(dbo.Fn_datenotime(Getdate()) 
                                                    AS 
                                                    VARCHAR), '12:00AM', 
                                       '11:59PM')) AS 
       c1 
WHERE  c1.contractamount <> c1.[calcamount] 
ORDER  BY c1.claimnum 

这第三个查询需要花费更长的时间才能执行(我没等到看多久;超过4分钟)。

SELECT c.claimnum, 
       cd.procedurecode, 
       cd.charges, 
       cd.contractamount, 
       dbo.Fn_getfeeschedamount(cd.pk_claimdetail) 
FROM   claim c WITH(nolock) 
       INNER JOIN claimdetail cd WITH(nolock) 
               ON cd.fk_claim = c.pk_claim 
WHERE  c.dateprocessed BETWEEN dbo.Fn_datenotime(Getdate()) AND Replace( 
                                      Cast(dbo.Fn_datenotime(Getdate()) AS 
                                           VARCHAR), '12:00AM', '11:59PM') 
       AND cd.contractamount <> dbo.Fn_getfeeschedamount(cd.pk_claimdetail) 
ORDER  BY c.claimnum 

我在SQL Server 2016数据库上运行它。

第一个查询显示今天的所有索赔及其处理金额及其重新计算的金额。

最后一个问题是我的目标是在我的where子句中再添加一个条件,仅显示重新计算的金额与处理时计算的金额不匹配的索赔。

似乎在上一个查询中,SQL Server正在执行where子句的第二部分,然后第一部分导致查询运行的时间更长。

有没有办法强制SQL Server首先执行where子句的第一部分而不必求助于第二个查询?

0 个答案:

没有答案