2008-11-27 56 views
1

我无法尝试优化以下查询sql server 2005.有谁知道我该如何改进它。这里使用的每个表格都有大约4000万行。我尽了最大的努力来优化它,但我设法做到完全相反。优化工会

感谢

SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2005 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2006 
    union all 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2007 
    UNION ALL 
    SELECT 
     cos 
     , SIN 
    FROM 
     ConSisHis2008 

也许我应该说其他有关架构的东西,这里使用的所有表都历史表,他们不参考任何其他表。这些已经是cos和SIN的索引了。我只是想知道是否有任何其他方式来优化查询......你可以想象160millon记录很难得到:s

+0

如果不知道架构以及要实现的目标,通常无法优化查询。 – Rowan 2008-11-27 14:17:18

+0

什么样的报告可能需要1.6亿行,没有总计,没有组,没有排序 - 它可能会有什么用处? – dkretz 2008-11-28 05:39:02

+0

你有/需要重复输入吗?也许你可以过滤得到更少的行? – Fredou 2008-11-27 14:39:44

回答

2

似乎查询只是将分离的历史表合并到包含所有数据的单个结果集。在这种情况下,查询已经是最优的。

1

在每个表上放置一个cos和sin的复合索引。这与您在不重新设计表格设计时一样好(在这个例子中,它看起来应该只有一张表格)

+0

索引如何帮助,因为他没有被任何东西过滤。 – Rowan 2008-11-27 14:19:50

+0

既然你只选择了那两列,那么SQL服务器就可以直接从组合索引中获取数据,而不必实际记录数据。只有在表格中有其他列的情况下才会有所改进。 – 2008-11-27 14:23:00

1

由于没有WHERE子句,我不相信你可以做任何事情来提高这个PoV的性能。

你已经正确使用了UNION ALL,所以这里没有帮助。

我能想到的唯一的其他事情是表格上是否有更多列?如果是这样,您可能会从磁盘获取比您需要更多的数据,从而减慢查询速度。

2

另一种方法是解决你为什么需要全部1.6亿行的问题?如果您正在进行某种报告,则可以创建单独的报告表格,这些报告表格已经汇总了一些数据。或者您是否真的需要数据仓库来支持您的报告需求。

1

这可能值得尝试索引视图。你可以把上面的语句放到Dave建议的索引的视图中。这需要一点时间才能开始构建,但会更快地返回结果(这是假设数据集变化不大,因此您可以承担额外的事务开销)。

0

您可能会考虑使用带有年份指示符的单个分区表。

我还是好奇 - 这个代码是在一个视图中还是SP在160m行上运行,或者它实际上是否会沿着导线返回160m行。如果是这样,这是一个非常多的数据返回,这是一个有效的提取,它只是需要一段时间才能走下线。

0

没有优化要完成。由于您要从所有表中选择所有记录,根据定义,您可以从一个结果集中的所有表中获取所有记录。

这样做的原因是什么?