SELECT的SELECT的性能

时间:2012-01-08 21:48:53

标签: sql sql-server

我想知道SELECT SELECT是否会产生任何其他性能,或者数据库是否足够智能以优化此功能。

例如,我有一些选择我喜欢以下内容:

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
        DATEPART(month, transactionTime) as month,
        DATEPART(day, transactionTime) as day,
        SUM(volume) as totalVolume FROM DOW30
        GROUP BY DATEPART(year, transactionTime),
                 DATEPART(month, transactionTime),
                 DATEPART(day, transactionTime)) a
order by a.year, b.month, c.day

所有这些特定查询都按日期对Dow30中的所有交易进行分组,并总计总交易量。我使用这个是因为该表以每秒为基础存储每笔交易,我想每天进行累计。

这不是完整的查询,只是一个例子。我知道我可以简单地从一个SELECT执行此操作,但我想知道执行SELECT SELECT是否会导致某种性能损失,或者如果这一切都得到优化神奇。

我以这种方式制定查询的原因是因为我是如何将查询可视化的,我实际上将此顶级select与另一个表连接起来,并从基础{{1}中选择列使我更容易可视化查询。但是由于没有正式的DBA背景,我不确定这是不是错了,如果我需要找出更好的编写查询的方法。

4 个答案:

答案 0 :(得分:3)

嵌套这样的SELECT被认为是优化器的一个语句。

您可以在此处看到:Why use Select Top 100 Percent?How can I query 'between' numeric data on a not numeric field?在这些示例中,除非您强制,否则此处的嵌套无效,这通常是一个坏主意

答案 1 :(得分:2)

使用派生表或CTE可能会在解析阶段增加非常小的开销。为了便于阅读,我宁愿忽略它。

更新我说的是技术上不必使用它的情况(如你的问题所示)

答案 2 :(得分:1)

将这2个查询放入查询窗口

SELECT a.year, b.month, c.day, totalVolume from 
(SELECT DATEPART(year, transactionTime) as year, 
        DATEPART(month, transactionTime) as month,
        DATEPART(day, transactionTime) as day,
        SUM(volume) as totalVolume FROM DOW30
        GROUP BY DATEPART(year, transactionTime),
                 DATEPART(month, transactionTime),
                 DATEPART(day, transactionTime)) a
order by a.year, b.month, c.day

SELECT DATEPART(year, transactionTime) as year, 
        DATEPART(month, transactionTime) as month,
        DATEPART(day, transactionTime) as day,
        SUM(volume) as totalVolume FROM DOW30
        GROUP BY DATEPART(year, transactionTime),
                 DATEPART(month, transactionTime),
                 DATEPART(day, transactionTime)) a
order by DATEPART(year, transactionTime), DATEPART(month, transactionTime), DATEPART(day, transactionTime)

然后查看实际的执行计划,

http://technet.microsoft.com/en-us/library/ms189562.aspx

它会显示两个查询的执行计划加上两个查询的相对成本,我猜他们两个都是50%意味着两者都有相同的成本(但我可能错了,请告诉我们你发现了什么)

答案 3 :(得分:0)

它可以减慢查询速度,但这取决于您实际选择的内容。在这种情况下,主级别选择不做任何花哨的事情,甚至不需要它。服务器可能会优化此查询,就好像它只是一个选择一样。但情况并非总是如此,这取决于查询。而且在数据库上也是如此。 MySQL,Oracle和SQL Server都有很好的优化,但优化的种类差异很大。