首页 > 解决方案 > 了解 DateTime 列上的 SQL 索引

问题描述

我有大约 100 万条记录。在日期范围内搜索时,速度非常慢。然后我进行谷歌搜索,有人建议在“日期时间”列上做索引。我不相信,因为我一直认为索引是用于 O(1) 搜索——这意味着相等搜索;并且由于我的查询是日期范围搜索,如何才能提高性能?

但是,出于好奇,我还是尝试了,令我惊讶的是,它确实显着提高了性能。

这是我的桌子

tblOrder
--------
OrderId (Primary Key)
CurrencyId
ProductId
...
...
...
OrderDate DATETIME

我正在使用 linqtosql,代码是:

return (from rec in tblOrders.AsNoTracking()
        where (rec.CurrencyId == CurrencyId) && (rec.OrderDate >= startDate) && (rec.OrderDate < endDate)
        select rec).ToList();

CurrencyId我在和上都创建了 SQL 索引OrderDate。结果是巨大的进步。我的问题是,这怎么可能?为什么索引适用于范围搜索(不等于但 >= 或 <=)。有人可以向我解释一下 SQL 索引在日期范围搜索方面是如何工作的吗?

谢谢...

标签: sqlsql-serverlinq-to-sqldatabase-indexes

解决方案


索引本质上是索引键的有序列表,其中附有它们引用的行的地址。您可以使用相等条件来相对快速地跳转到索引的任何点,方法是遵循您正在搜索的值。一旦达到这一点,您将继续阅读有序数据,直到它不再满足您的访问搜索。对于范围谓词,这仅意味着跳到范围中的最小值并开始读取,直到出现大于最大范围值的值。


推荐阅读