sql - 了解 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 索引在日期范围搜索方面是如何工作的吗?
谢谢...
解决方案
索引本质上是索引键的有序列表,其中附有它们引用的行的地址。您可以使用相等条件来相对快速地跳转到索引的任何点,方法是遵循您正在搜索的值。一旦达到这一点,您将继续阅读有序数据,直到它不再满足您的访问搜索。对于范围谓词,这仅意味着跳到范围中的最小值并开始读取,直到出现大于最大范围值的值。
推荐阅读
- javascript - Node和npm在执行JS文件时抛出错误?
- amazon-web-services - 如何将数组作为环境变量放入 boto3 Lambda 函数
- python - 为本地工作 git 存储库创建一个 requirements.txt,而不用 .py 代码对导入进行 grepping
- javascript - 将类添加到按钮后,我的单击功能不适用于按钮
- java - 为什么我的 Thymeleaf 视图 HTML 文件不显示 Spting 应用程序中的对象列表?
- javascript - ThemeProvider:“主题”道具是必需的。→ React.js
- symfony - EasyAdminBundle 计数和统计
- python - 为什么在将 django_celery_beat 安装到我的虚拟环境并将其放入 INSTALLED_APPS 后出现“没有名为 'django_celery_beat' 的模块”?
- sql - 如何通过 SQL 上的第二个表属性过滤表
- airflow - 气流:带有 NULL 日期时间字段的 SQL 到 GCS 错误