了解DateTime列上的SQL索引



我有大约100万条记录。在日期范围内搜索时,速度慢得惊人。然后我在谷歌上搜索,有人建议在";DateTime";柱我不相信,因为我一直认为索引是用于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();

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

谢谢。。。

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

对于此where子句:

where (rec.CurrencyId == CurrencyId) && (rec.OrderDate >= startDate) && (rec.OrderDate < endDate)

您需要一个前两列为(CurrencyId, OrderDate)的复合索引。

最新更新