【发布时间】:2016-09-14 17:15:09
【问题描述】:
我有一个数据库,其中有超过 2m 行。它有startIpNum 和endIpNum 列(范围不重叠)。我正在对该表进行一些查询:
表:
Id | startIpNum(Numeric(0,18)) | endIpNum(Numeric(0,18)) | locId
查询 1:
select locId from Blocks
where startIpNum <= 1550084098 and endIpNum >= 1550084098
查询 2(添加此查询希望得到更好的结果):
select top 1 locId from Blocks
where endIpNum >= 1550084098
这些查询需要合理的时间,没有问题。但是每次打开网页时我都需要获取大约 100 条不同的行,这大约需要 15 秒,这可能是预期的,但不是我们想要的。
我相信通过使用索引可以提高性能,因此我添加了 2 个索引,一个到 start(asc) 一个到 end(desc),但性能是相同的。
我还能做些什么来获得更好的查询性能?
更新
我已经运行了你们提出的create index 查询。暂时没有变化。
根据要求,我在下面包含了 sql 查询执行计划(由于我不熟悉执行计划的事情,我只是从 ssms 中截取屏幕截图,请继续询问是否需要其他内容来回答我的情况):
Query1的执行计划:
Query2的执行计划:
【问题讨论】:
-
CREATE INDEX ix ON dbo.tbl (start, end) INCLUDE (id, value) -
更详细的答案请提供您的实际执行计划
-
SSMS 可以在索引缺失时为您建议索引 - 只需包括执行计划并单击显示缺失的索引详细信息。
-
您也可以让表格只返回所需的列而不是所有列,如果您不使用所有列,这通常会节省时间。将值显式转换为
Numeric(0,18)也可能值得,否则它可能会尝试将值解析为 int 并将其隐式转换为数字。您可能还会看到使用where start >= 123123123 AND end <= 123123123的改进,因为它不需要在每一行上运行两次计算(尽管执行计划应该即时转换它,它可能不再那么明确可能会有所帮助)。跨度> -
它正在使用索引,因此在相对较小的表上运行查询需要 15 秒的时间。您可以在
select查询之前运行set statistics io on和set statistics time on并发布结果(来自“消息”选项卡)吗?
标签: sql-server indexing lookup