SQL Server DELETE和SELECT与不同的WHERE子句表现不同

Mar*_*ytz 18 sql sql-server

我有一个表,该表由每日预定作业填充,删除最近7天的数据,然后重新填充来自其他来源(大型机)的最近7天的数据.

最近,用户报告了一些重复数据,可追溯到2011年10月初......数十万行.

我注意到每个作业运行的删除都有奇怪的行为:

DELETE FROM fm104d 
 WHERE location = '18'
   AND (CONVERT(datetime,CASE WHEN ISDATE(pull_date)=0 THEN '19000101' 
                 ELSE pull_date END)) >  DATEADD(day, -7, getdate())
Run Code Online (Sandbox Code Playgroud)

以上返回"(0行(s)受影响)".

当我用SELECT*替换DELETE后运行上面的操作时,我获得了32,000多行作为回报.

为什么SELECT和DELETE的行为会有所不同?

UPDATE

这是实际执行计划:

http://pastie.org/2869202

Mar*_*ytz 1

你不会相信这一点。事实上我没有,因为它几乎没有逻辑意义,但最终,有效的解决方案......是添加索引。

\n\n

这要归功于我当地的 DBA“有考虑过添加索引吗?我只是做了测试,果然它有效”。

\n\n

这是添加的索引:

\n\n
CREATE\xc2\xa0 INDEX ixDBO_fir104d__SOURCE_LOCATION__Include\nON [dbo].[fir104d] ([SOURCE_LOCATION])\nINCLUDE ([Transaction_Date],[PULL_DATE])\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

我让工作按计划进行,果然,一切都按原样进行。

\n\n

我的猜测是,解释计划中有一些内容表明它没有使用索引/错误的索引,但我的开发人员思维无法理解这种详细程度。

\n\n

感谢大家所花费的时间和精力。

\n\n

更新

\n\n

从另一位开发人员那里收到消息,该表中的数据还损坏到“需要 DBA 参与几个小时才能解决”的程度,并且开发人员必须执行一些其他数据修复(读取:数据文件重新加载)。

\n\n

归根结底,虽然考虑到计划作业的运行方式,添加索引可能是一件好事,但显然,故事还有更多内容!

\n