【发布时间】:2012-03-23 13:37:03
【问题描述】:
我在我的一个存储过程中发现了一个瓶颈查询。 @Results 是具有约 17K 行的表变量。它包括一个时间戳(日期时间)列和一个值(十进制)列。
相关子查询方法是我首先想到的完成这项任务的方法,但性能非常差。除了使用针对同一个表的相关子查询“计算” WHERE 子句之外,我想不出更好的方法来构造这个查询。关于如何写得更好的任何建议......
我基本上是在尝试从完整结果的子集中选择最高值。现在,通过计算小于或等于该值的所有值、将其乘以 100、除以 @Count,并查看它是否大于某个百分比,结果记录被包含在子集中。
这是查询:
SELECT TOP 1 @Result = Results.Value
FROM @Results Results
WHERE (100.0 * (SELECT COUNT(1)
FROM @Results Results2
WHERE Results2.Value <= Results.Value) / @Count) >= @Percent
ORDER BY Results.Value ASC
任何建议或帮助将不胜感激。
谢谢!
【问题讨论】:
-
不,Results.Value 上没有索引。结果是一个表变量。可以为表变量添加索引吗?
-
看起来你不能,除非你在第一次创建它时声明一个 PRIMARY KEY 或 UNIQUE 约束:sqlserverplanet.com/sql/create-index-on-table-variable - 如果这不是一个选项,也许你应该将
@Results存储在 @987654324 @ table first,你可以索引。
标签: sql sql-server performance