如何确定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子句的第一部分而不必求助于第二个查询?