【发布时间】:2014-02-19 19:33:45
【问题描述】:
我有一个十进制 (15,10) 列,其中包含创建日期的 OLE 自动化格式。当您执行类似的查询时
SELECT * FROM SOMETABLE WHERE RECORDTIMEOA BETWEEN 41667 AND 41667.9999999999 --Decimal Part is 10 characters
查询在 8 或 9 秒内返回所有结果。但不是使用 41667 整数值,而是使用 41667.0000000000,然后查询返回 1 秒内的所有结果。当您将 9 或 8 个字符放在第二个小数部分时也会发生这种情况,例如
SELECT * FROM SOMETABLE WHERE RECORDTIMEOA BETWEEN 41667 AND 41667.99999999 --Decimal part is 8 characters
我在该列上有一个非聚集索引,也许它会影响这个问题,所以我想知道下面的查询之间有什么区别,为什么第一个在 8 秒内返回而其他在 1 秒内返回?
SELECT * FROM SOMETABLE WHERE RECORDTIMEOA BETWEEN 41667 AND 41667.9999999999
SELECT * FROM SOMETABLE WHERE RECORDTIMEOA BETWEEN 41667 AND 41667.9999999
SELECT * FROM SOMETABLE WHERE RECORDTIMEOA BETWEEN 41667.0000000000 AND 41667.9999999999
如果你能帮忙,请告诉我..
更新:我正在为查询添加两个执行计划
UPDATE : 这是应用 CAST 方法后的执行计划
【问题讨论】:
-
能否请您发布两种情况下的查询执行计划?
-
好的,我已经添加了两个执行计划,第一个是慢的,底部是快的。
-
这表现如何?
SELECT * FROM sometable WHERE recordtimeoa >= Cast(41667 As decimal(15,10)) AND recordtimeoa < Cast(41668 As decimal(15,10)) -
P.S. RID 查找是罪魁祸首。阅读 Aaron Bertrand 的这篇文章:mssqltips.com/sqlservertip/2195/…“...[RID] 查找发生在索引不满足查询(非覆盖查询)时,因此需要从聚集索引或堆中检索其他数据。. 。”
-
如果你使用 cast 方法,那么你可能需要很长时间才能处理大行,我们在这里谈论多少行?您可以发布应用了演员阵容的执行计划吗?
标签: sql sql-server sql-server-2008 tsql database-performance