在实践中,许多Oracle SQL调优 专业人士将重新排序 表行成相同的物理 订购作为主要指标。
来源:http://www.remote-dba.net/t_op_sql_index_access.htm
如何在磁盘上按物理顺序重新排序表行?这是“索引组织表”吗?
答案 0 :(得分:4)
如果您正在对主键索引进行范围扫描,然后在表中执行单行查找,那么希望堆表中的数据与主键索引物理排序是有意义的。这往往相对不常见 - 例如,您通常不想从ORDER_ID
表中获取ORDER
1-100的所有数据。如果您使用自然的多列主键可能更常见,但这有点不寻常。
如果您确实发现自己的表经常在主键上进行索引范围扫描,并且您希望优化该特定访问路径,那么使用索引组织表或散列簇几乎肯定会更好。为了让Oracle自动处理行的物理排序。当您可以简单地指示Oracle维护订单时,通过定期重新组织表来为自己创建维护问题是没有意义的。当然,优化此访问路径会降低通过任何其他索引访问表的效率,因此它远非免费选项。
即使在主键上有索引范围扫描并且优化该访问路径的权衡超过其他索引访问方法的成本,表中的行的物理顺序也将具有对执行查询的成本影响相对较小。绝大多数查询和进程都有可能实现更高级别的优化,而使用标准SQL调优技术的问题要少得多,而不是打扰表中的行顺序。
警告1:如果您正在尝试压缩表(不使用“高级压缩”选项),则表中行的顺序可能很重要,因为更容易压缩更有序的数据。这是我唯一一次发现自己关心数据的物理顺序。
警告2:如果您的表格符合所列出的所有标准,并且您在表格中对数据进行了物理排序,而您碰巧使用了RAC,则最终可能会通过集中“有趣”的行来创建更多的互连流量更少的热块必须不断地在节点之间传递。这很容易抵消从一开始就重新组织表所获得的任何边际收益。
答案 1 :(得分:3)
一般情况下,你没有。
可以使用
CREATE TABLE ... AS SELECT .... ORDER BY
但是你开始抛弃旧表并重新命名新表 - 加上补助金,约束等等。
但必须在主键上组织物联网。如果您指的是用于表格上大多数范围扫描的索引,那么这可能不是“主要”索引。
考虑一个带有ID作为主键和客户名称的CUSTOMERS表。如果您正在寻找基于id的客户,那么群集没有任何好处,因为您对ID高于或低于此值的客户并不感兴趣。如果您正在寻找名为“Seinfeld”的客户,那么您将进行范围扫描,并且在一个区块中拥有所有Seinfeld表记录可能会有好处。如果您要对first_name进行过滤,那么最好只在索引中包含它,这样您就不需要访问表记录了。
在'ORDER_LINES'表中,您可能无论如何都会在同一个块上找到特定订单的所有行,因为它们可能是同时创建的。索引上的聚类因子会告诉你。
如果您对特定客户的所有发票有大量查询,则CUSTOMER_INVOICES表可能会受益于群集在客户ID上。在这种情况下,可能会查看Single Table Hash Clusters,以便在列值上对数据进行聚类。但这将是我要做的事情列表
答案 2 :(得分:2)
通常使用sql-loader来卸载和加载表。但是,请参阅Tom Kyte关于表重新加载和不平衡指数的文章,了解它们的副作用。
索引组织表是一把双刃剑:是的,它将表数据放在与(主键)索引相同的块中,从而避免了1个磁盘I / O.这也意味着只要需要以任何其他顺序访问,读取访问该表的数据量就会增加。
IOT的最佳目的是作为查找表或验证表,除了键值之外几乎没有其他信息。