@H_404_8@
在一个相当大的表(几百万条记录)中,我们最近开始看到一些性能问题.该表有一些特殊的行为/条件.@H_404_8@
>它主要写一次然后再也不会改变
>在第一天左右,记录从0..N分类(让我们称之为列类).记录可能会在第一天内重新分类几次
>新的条目添加了0级,意思是“尚未归类”
>每小时左右,一个过程对新的reocrds进行分类,并为他们提供1..N的新类
>所有读者都只对第1课感兴趣
>所有超过一天的记录几乎不会改变他们的班级,>几天后,1会被清理干净@H_404_8@
现在,由于大多数访问是对类1进行的,因此该列通常与其他条件一起涉及查询(class = 1).我们在类列上有一个索引,然后在某些其他列上有索引.@H_404_8@
对于我的问题:我们现在正在考虑按类对该表进行分区.据我所知,这将使索引/处理数据更快,因为class = 1已经与其余数据分开,因此对它的访问隐含更高效.它是否正确?@H_404_8@
如果您同意这是一个好主意,我会进一步阅读该主题!@H_404_8@
谢谢
干杯@H_404_8@
更新2010.11.30@H_404_8@
非常感谢您的投入.我不知道它是一个额外的选项:)感谢指出(在我投入太多时间之前).但除了许可证问题之外,在我看来,分区在这种情况下不一定是一个好的解决方案.@H_404_8@
解决方法
@H_404_8@
如果按类进行分区,则会减慢更新行的类的过程.由于这会强制一行从一个分区移动到另一个分区,因此您将更新为从第一个分区删除并插入第二个分区.如果你的每小时进程很慢而且速度慢,因为找到所有新记录需要时间,这里的性能权衡可能是非常合理的.如果你的每小时进程很慢,因为计算新类应该是什么并且更新所有行需要时间,另一方面,这种权衡可能是一个非常糟糕的想法.@H_404_8@
由于分区是企业版许可证之上的额外成本选项,因此我建议您确保不能使用某些基于功能的索引来以相对较低的成本获得您所针对的大部分性能改进.例如,如果您有两个基于函数的索引@H_404_8@
@H_404_8@
CREATE INDEX idx_new_entries ON your_table( (CASE WHEN class = 0 THEN primary_key ELSE null END) ); CREATE INDEX idx_class1_entries ON your_table( (CASE WHEN class = 1 THEN primary_key ELSE null END) );
以及几个观点@H_404_8@
@H_404_8@
CREATE VIEW vw_new_entries AS SELECT (CASE WHEN class = 0 THEN primary_key ELSE null END) primary_key,<<list of columns>> FROM your_table WHERE class = 0 CREATE VIEW vw_class1_entries AS SELECT (CASE WHEN class = 1 THEN primary_key ELSE null END) primary_key,<<list of columns>> FROM your_table WHERE class = 1
然后,针对在PRIMARY_KEY上过滤的新视图的任何查询都将使用基于函数的索引,而这些索引又只会索引基础表中的相应行.这可以让您提高查找性能,而无需求助于分区.@H_404_8@