相关子查询性能

时间:2012-03-22 21:33:03

标签: sql sql-server performance

我在我的一个存储过程中发现了一个似乎是瓶颈的查询。 @Results是表变量,行数约为17K。它包括TimeStamp(DateTime)列和Value(十进制)列。

相关子查询方法是我能想到的第一个完成此任务的方法,但性能非常差。除了使用针对同一个表的相关子查询“计算”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

任何建议或协助都将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:0)

这是怎么回事:首先,选择行的总数到变量中。接下来,选择索引处的行(@Percent / 100.0 * countOfRowsTotal),按值排序。

这将扫描表格1至2次。

答案 1 :(得分:0)

有助于更好地了解尝试实现的目标,用用户域术语而不是SQL表示。

此外,未提供所查询数据的整个范围和结构,但可能包括确定性能所涉及的关系。

首先,有这个Results表变量,它有自己的派生。这种技术可能存在风险,因为它构建在一个隐式临时表中,这通常是一个去优化器。这就像你试图为查询优化器指定策略。

看来您只需要聚合查询中的一个最大值,该值应该是可优化的。实际上,优化甚至不应该是只有17K记录的问题。

您能否以下列形式重申:

SELECT MAX(Value)
FROM some-aggregate-query
GROUP BY fields
HAVING COUNT(something)/COUNT(1) * 100 > @percent

提示:根据我的经验,当你开始分解SQL时,你通常会走错方向(这与程序代码的最佳策略完全相反。)