我在尝试优化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的索引。我只是想知道是否有任何其他方法来优化查询......因为你可以想象160毫米的记录很难得到:s
答案 0 :(得分:2)
似乎查询只是将分离的历史表组合成一个包含所有数据的结果集。在这种情况下,查询已经是最优的。
答案 1 :(得分:2)
另一种方法是解决为什么需要拥有所有1.6亿行的问题?如果您正在进行某种报告,可以创建已经汇总了一些数据的单独报告表。或者你真的需要一个数据仓库来支持你的报告需求。
答案 2 :(得分:1)
在每个表上放置cos和sin的复合索引。如果没有重组表设计,那就好了(在这个例子中,看起来你应该只有一个表开始)
答案 3 :(得分:1)
由于没有WHERE子句,我不相信你可以采取任何措施来改善这个PoV的性能。
你已经正确使用了UNION ALL,所以那里没有任何帮助。
我唯一能想到的是桌子上是否有更多列?如果是这样,您可能从磁盘中获取的数据超出了您的需求,从而减慢了查询速度。
答案 4 :(得分:1)
可能值得尝试使用索引视图。您可以将上述语句放入Dave建议的索引视图中。这可能需要一些时间来构建,但会更快地返回结果(这是假设数据集没有太大变化,因此您可以忍受额外的事务开销)。
答案 5 :(得分:0)
您可以考虑使用带有年份指标的单个分区表。
我仍然很好奇 - 这个代码是在一个视图中还是SP,它在160米的行上运行,或者实际上它会在线路上返回160米的行。如果是这样的话,这将是一个非常多的数据返回,这实际上是一个提取物,它需要一段时间才能下线。
答案 6 :(得分:0)
没有优化要做。由于您选择了所有表中的所有记录,因此根据定义,您可以从一个结果集中的所有表中获取所有记录。
这样做的原因是什么?