2010-05-20 32 views
5

我有复合主键的一些问题和列的基数。我搜索了网页,但没有找到任何明确的答案,所以我再次尝试。这些问题是:复合主和基数

背景:大(50M - 500M行)OLAP准备表,而不是NOSQL,不是柱状。 MySQL和DB2

1)请问键在PK事情的顺序?

2)如果列的基数重而变化,这应该被首先使用。例如,如果我有CLIENT/CAMPAIGN/PROGRAM,其中CLIENT是非常主要的,CAMPAIGN是温和的,PROGRAM几乎就像是一个位图索引,什么顺序最好?

3)哪些订单是最好的加入,如果有一个WHERE子句和时,有没有WHERE子句(用于视图)

在此先感谢。

回答

2

1)请问键在PK事情的顺序?

是的,它改变了用于警告PRIMARY KEY的索引记录的顺序。

2)如果列的基数变化很大,应首先使用。举例来说,如果我有CLIENT/CAMPAIGN/PROGRAM,其中客户端是高基数,运动是温和的,程序是几乎像一个位图索引,什么样的顺序是最好的?

对于select查询,这完全取决于您要使用的查询。如果您一次搜索所有三栏,则顺序并不重要;如果你正在搜索两个或一列,他们应该在索引中领先。

对于插入,最好使前导列与插入记录的顺序相匹配。

3)哪些订单是最好的加入,如果有一个WHERE子句和时,有没有WHERE子句(用于视图)

同样,这依赖于WHERE条款。

+0

谢谢你,所以如果我只在客户端和竞选加盟,我应该在运动(低基数)第一,然后客户端(高基数) – 2010-05-20 16:23:09

+0

@srini加盟:没有“第一”和“最后一个“,你总是同时加入两列。这些列应该在索引'(客户端,活动,程序)'中领先,以使联接更加高效。 – Quassnoi 2010-05-20 16:24:38

+0

对不起,我的意思是WHERE子句的顺序。 – 2010-05-20 16:36:19

3

你有“MySQL DB2”。这个答案是针对DB2的,MySQL没有这个。

是的,当然这是合乎逻辑的,但优化程序不仅仅考虑到这一点。

通常,WHERE子句(加入)中列的顺序不会(也不应该)重要。

但是,有两个项目与谓词的顺序有关,这可能是您的问题的原因。

  1. 事情是什么,是列的索引,针对的WHERE子句的处理顺序。是的,最好按照最高基数到最低的顺序指定列。这使得优化器可以定位更小范围的行。

    • 并且沿着这些路线不要打扰实施单列,低基数列(没有用)的索引。如果索引是正确的,那么它将被更频繁地使用。
  2. 表的顺序被连接(不列在加入)事项非常多,这可能是最重要的考虑因素。实际上,Join Transitive Closure是自动的,优化器评估所有可能的连接顺序,并根据统计信息(这是UPDATE STATS如此重要的原因)选择它认为最好的。

    无论表格中的行数是否为零,如果您在table_B上在索引中包含1,000,000行的错误索引时从table_A连接了100行,您需要的订单为A:B,而不是B:A。如果您获得的最大IOPS低于此值,您可能需要对此做些事情。

    的步骤的正确的顺序是,并不奇怪:

    • 检查索引是按照正确的(1)。不要只添加另一个索引,改正你的索引。正在执行

    • 检查更新统计规律

    • 总是先尝试优化器的默认操作。设置统计并测量I/O。使用代表性的一组值(用户将在生产中使用)。

    • 检查shoowplan,确保代码正确。当然,这也将确定选择的连接顺序。

    • 如果表现不够好,你认为由优化那些值的集合选择的连接顺序是次优的,SET JTC OFF(语法取决于您使用的DB2版本)然后在WHERE子句中指定所需的顺序。测量I/O。使用代表组

    • 形成意见。选择哪一个更好的整体表现。从不调谐单个查询。