【发布时间】:2018-05-29 15:01:06
【问题描述】:
我正在尝试提高运行时间较长的查询的性能,并且希望能提供任何有关我需要采取不同措施以使性能合理的指针。 (索引和估计的执行计划信息包括在下面。)
正在更新的表 table1 的记录数不足 1000 条,但正在查询的表的记录数在 1 亿条范围内。奇怪的是,我对最旧值和最新值使用几乎相同的查询,但对最新值的查询会在两秒内返回。这是对最旧值的查询;运行时间超过两分钟:
UPDATE table1
SET firstVal = (
SELECT TOP 1 val
FROM table2
WHERE table1.ID = ID
AND valID = 123
ORDER BY entryDate
)
查询最近的,两秒后返回:
UPDATE table1
SET lastVal = (
SELECT TOP 1 val
FROM table2
WHERE table1.ID = ID
AND valID = 123
ORDER BY entryDate DESC
)
索引:
CREATE NONCLUSTERED INDEX [table2_IX9] ON [dbo].[table2]
(
[valID] ASC,
[entryDate] ASC,
[ID] ASC
)
INCLUDE ( [val]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [AB]
GO
索引搜索(非集群)成本:68%
最高成本:29%
这个查询可以用更好的方式来优化吗?我需要在索引方面有所不同吗?提前感谢您的任何指导!
【问题讨论】:
-
entryDate中有 NULL 值吗? -
好问题!但没有
-
我在这里可能是错的,但尝试将索引从
valID, entryDate, ID更改为valId, ID, entryDate(或添加第二个索引) - 我假设你想要 2 列where子句在您的索引中order by之一之前,否则,您的搜索无法完全按原样使用索引...但我是 SQL 新手... -
感谢您的建议。我会研究它,但我需要一段时间才能真正看到这是否有效,因为我的测试环境并没有这么多,我必须对生产环境进行更改控制
-
约翰对索引的评论是正确的
标签: sql-server indexing query-performance