WHERE子句中的SQL查询子选择优化(SQL Server)

时间:2014-02-03 10:30:03

标签: sql sql-server select subquery query-optimization

我写了以下SELECT语句:

SELECT DISTINCT someColumn1
FROM someTable
WHERE someColumn2 = (SELECT MAX(someColumn2) FROM someTable)
    AND someColumn3 IN ('Value1','Value2','Value3','Value4','Value5')
ORDER BY someColumn1

该表包含约1 000 000条记录。 WHERE子句将此数字减少到50 000.(someColumn2已编入索引)

如果我将WHERE子句中的子选择替换为具体值,则查询执行得更快。

该子选择执行多次?如何才能在这样的查询中实现只执行一次子查询?

2 个答案:

答案 0 :(得分:0)

我假设你正在讨论(SELECT MAX子查询(但你的问题并不是很清楚)。

更快地对值进行硬编码而不是运行子查询的原因是子查询必须至少读取一些数据库以获取最大值,这将比仅告诉它更慢42,或者无论价值如何。查看你的查询,(someColumn2, some someColumn3)上的索引会很好:col2帮助它获得最大值,一旦得到它,它可以继续通过Col3值来找到你想要的那些,可能在同一个索引上页面,而不是每个Col2匹配的数据页面:这将节省一点磁盘IO。

答案 1 :(得分:0)

你的查询完全有可能返回零记录...为什么,你没有内部的标准来匹配外部。让我澄清一下。您的内部查询正在查找max(somecolumn2),并且可以说someColumn2 = 123的最大值。但是,您的主要条件仅适用于someColumn3是值1-5之一的记录。如果是这种情况,则可能是1-5值,最高someColumn2可能是87,因此永远不会找到匹配的123,更不用说获得第1列值。

所以,为了更好地限定,将someColumn3移动到内部查询中并确保你有覆盖索引(someColumn3,someColumn2,someColumn1)

SELECT DISTINCT 
      someColumn1
   FROM 
      someTable
        JOIN ( SELECT MAX(someColumn2) JustOne
                 FROM someTable
                WHERE someColumn3 IN ('Value1','Value2','Value3','Value4','Value5')) QualRecs
         on someTable.someColumn2 = QualRecs.JustOne
   WHERE 
      someColumn3 IN ('Value1','Value2','Value3','Value4','Value5')
   ORDER BY 
      someColumn1

评论反馈......

让我澄清原始查询的问题。假设您有以下数据。

someColumn1  someColumn2   someColumn3
1            1             value1
2            5             value2
3            8             value3
4            12            value5
5            28            value7
6            48            value8

现在,您的原始查询获得了第2列的最大值...在此数据方案中,最大值为48,但在某些列3中与“value8”相关联。

现在,您的查询的其余部分。您只需要不同的ID,其中someColumn2等于该值48,但也必须是“值1-5”。在这种情况下,不会返回任何记录,因为48与value8关联且超出其他条件。< / p>

所以我的查询说...最终查询基于值1-5,因此从中获取最大值,从而返回#12,然后返回匹配以获得不同的someColumn1值。