sql-server - 基于 SELECT TOP 1 的 UPDATE 查询性能缓慢
问题描述
我正在尝试提高运行时间很长的查询的性能,并且希望有任何关于我需要采取不同措施以使性能合理的指针。(索引和估计的执行计划信息包括在下面。)
正在更新的表 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%
这个查询可以用更好的方式来优化吗?我需要在索引方面有所不同吗?提前感谢您的任何指导!
解决方案
我最终做了什么:
SELECT ID, val, entryDate
INTO #tmpT2
FROM table2
WHERE ID IN (SELECT ID FROM table1)
AND valID = 123
然后稍作调整,在原始查询中将 #tmpT2 替换为 table2:
UPDATE table1
SET firstVal = (
SELECT TOP 1 val
FROM #tmpT2
WHERE table1.ID = ID
ORDER BY entryDate
)
原因:刚刚意识到索引到位看起来与它应该的完全一样,并且 table1 非常小,我可以尝试简单地使用临时表并将 valID = 123 的所有 ID、vals 和 entryDates 检索到临时表中. 这一步需要一秒钟,并且使用原始查询是瞬时的。感谢您花时间思考这个问题并提供想法!
推荐阅读
- c# - 将基于属性名称和值的过滤器表达式转换为 Linq Where 子句 Func
? - reactjs - 通过高阶组件的反应搜索过滤器(钩子)不起作用
- java - Firebase 实时数据库 - 检索数据 Android Studio
- azure - 当另一个流水线在另一个数据工厂上完成时运行流水线
- hadoop - 决定为 Hadoop map reduce 程序中最快处理指定的最佳 reducer 数量
- node.js - sequelize-hierarchy 未找到
- python - 尝试通过计数多字段 Django 对标签进行排序
- python - 用于文本分类的词嵌入
- reactjs - 停止挂载/卸载,通过防止卸载来保持组件存活
- laravel - laravel 尝试存储多个图像,但只存储它们多次