我有一个表,该表由每日预定作业填充,删除最近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
这是实际执行计划:
你不会相信这一点。事实上我没有,因为它几乎没有逻辑意义,但最终,有效的解决方案......是添加索引。
\n\n这要归功于我当地的 DBA“有考虑过添加索引吗?我只是做了测试,果然它有效”。
\n\n这是添加的索引:
\n\nCREATE\xc2\xa0 INDEX ixDBO_fir104d__SOURCE_LOCATION__Include\nON [dbo].[fir104d] ([SOURCE_LOCATION])\nINCLUDE ([Transaction_Date],[PULL_DATE])\nGO\nRun Code Online (Sandbox Code Playgroud)\n\n我让工作按计划进行,果然,一切都按原样进行。
\n\n我的猜测是,解释计划中有一些内容表明它没有使用索引/错误的索引,但我的开发人员思维无法理解这种详细程度。
\n\n感谢大家所花费的时间和精力。
\n\n更新
\n\n从另一位开发人员那里收到消息,该表中的数据还损坏到“需要 DBA 参与几个小时才能解决”的程度,并且开发人员必须执行一些其他数据修复(读取:数据文件重新加载)。
\n\n归根结底,虽然考虑到计划作业的运行方式,添加索引可能是一件好事,但显然,故事还有更多内容!
\n| 归档时间: |
|
| 查看次数: |
760 次 |
| 最近记录: |