我有一个包含创建日期的 OLE 自动化格式的小数(15,10)列。当你执行一个查询时

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 方法后的执行计划

最佳答案

可能是这里正在进行的数据转换阻止了索引的使用。最好的办法是查看 SSMS 为这两个查询生成的查询计划,并查看是否正在对较慢的查询而不是搜索进行扫描。

如果两个查询都在进行查找,则可能是缓存的情况。行(和查询计划)已经在内存中,缓存,以便更快的查询。

关于SQL Server 2008 : Decimal column in where clause decimal part effects query speed,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21406670/

10-13 08:09