我们有一个巨大的SQL Server 2005数据库(75GB),它基本上只是一个表中包含销售价值(每天,商店和文章)的数据。我们希望通过将每周超过一年的记录(每个商店和文章分组)的每周销售价值相加来实现。因此,理论上对于超过一年的数据,我们可以删除6条记录中的6条。
编写一个程序来执行此操作并不是一个真正的问题,但它会像永远一样运行。所以我一直在寻找一种可以在合理的时间内运行的策略。
为您提供一个想法:运行SELECT count(*)
运行超过4分钟
我们确实有一些索引(在日期(群集)和商店,文章和日期组合)。添加更多索引也需要永远。
任何人都有如何执行此任务的良好策略?有关TSQL方法的建议比基本DML语句更好吗?
答案 0 :(得分:1)
如果您使用SQL Server 2005 Enterprise Edition,则应考虑使用partitioning功能。优点:
如果您不使用Enterprise Edition,请使用此link查看不基于SQL Server 2005分区功能的分区(分片或水平分区)功能。
对于存储过程优化:
离题提示:如果使用Enterprise Edition,请考虑压缩表,因为SQL Server 2005通常擅长压缩事实表 - 如果你有足够的CPU能力,你可能会获得性能和磁盘空间。
答案 1 :(得分:0)
你能分享一下架构吗?
您是否尝试过使用WITH(NOLOCK)或将ISOLATION LEVEL设置为READ UNCOMMITTED?
有时我们会注意到我们无法进行任何架构更改这一事实,我们必须找到解决方案而不做任何重大更改。您始终可以在基础表中进行更改,然后将视图公开给使用客户端。如果您有存储过程,那么表模式可以自由更改,因为存储过程将封装对表的访问。如果你说你不能改变存储过程,你也无法创建任何观点 - 我会质疑为什么你处于如此严格的政策之下,你认为你能用这样的政策生存多久。如果数据库在一年内增长到200GB会怎么样?那么你会采取严厉的方法,花费更多的时间和金钱来修复它吗?或者,当它还很小时,我们现在应该这样做吗?
我的建议是:
对于短期“修复”来缓解一些痛苦,你现在可以尝试:
答案 2 :(得分:0)
您能告诉我们有关服务器硬件的更多信息吗?基本上,当数据大量放入大量快速磁盘时。
同样在标准版上,您仍然可以创建子表和视图,以便进行分区。通常,较旧的数据不会像新数据那样经常被查询,您可以通过将查询得最多的数据放在比较旧的数据更快的磁盘上来获得广告。
不确定数据访问模式是什么,但您是否查看了Analysis Services?您已经为此付费,它可以显示分析查询的显着加速,因为它使用了大量聚合。同样以excel作为前端,精明的用户可以自己创建大量报告,从而有时间去做有趣的事情。
我的一些想法,
Rgds Gert-Jan