Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing Informix中的组索引_Indexing_Informix - Fatal编程技术网

Indexing Informix中的组索引

Indexing Informix中的组索引,indexing,informix,Indexing,Informix,我有一个名为hitlist的表,它有3列: int id long hitlisted_date long deleted_date 我将根据以下列查询此表: histlisted_date (frequent) hitlisted_date && deleted_date (frequent) deleted_date (not frequent) 在这种情况下,我应该使用什么样的索引 在被列入名单的日期和被删除日期上单独索引 hitlisted\u日期的组索引&delet

我有一个名为
hitlist
的表,它有3列:

int id
long hitlisted_date
long deleted_date
我将根据以下列查询此表:

histlisted_date (frequent)
hitlisted_date && deleted_date (frequent)
deleted_date (not frequent)
在这种情况下,我应该使用什么样的索引

  • 在被列入名单的日期和被删除日期上单独索引
  • hitlisted\u日期的组索引
    &
    deleted\u日期
  • 更新

    该表只有1000-5000行。
    这些是将要使用的查询模式

    1) HITU日期介于
    2) 希图日期 如果表中只有很少的行,那么甚至可能不值得为列编制索引,但是有很多行是的。因为这个表中只有3列,所以索引大量的行不会有问题

    例如:

    我有一个静态只读表,有13个VARCHAR列和2个DATE列

    行长=557,nrows=12398250


    在7个单独的列上建立索引,因为没有涉及多个列的频繁查询,但是如果经常查询一个特定的列组合,则为这些查询创建一个复合列索引。

    因为将频繁使用,您希望在两列上使用
    hitlisted\u date
    首先创建一个复合索引:

    CREATE INDEX i1_hitlist ON hitlist(hitlisted_date, deleted_date);
    
    此索引可以(并且将)单独用于
    hitlisted\u date
    上具有适当条件的查询,或者用于两个日期

    您可能会发现在删除日期上有第二个索引是有益的:

    CREATE INDEX i2_hitlist ON hitlist(deleted_date);
    
    这可用于搜索刚刚删除的日期。如果您有时搜索单个已删除日期和一系列已命中日期,那么您可能会发现最好使用与
    i1_hitlist
    相反的复合索引:

    CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date);
    
    这不太可能有帮助,但唯一确定的方法是尝试一下,看看结果。这取决于您的查询模式和查询使用的实际条件

    仅仅在日期上建立索引并没有什么真正的好处;它只是妨碍了优化器(因为它必须查看两个索引并决定哪一个更好,而且在插入、更新和删除行时还有更多的工作要做)。列入名单的日期不太可能是唯一的索引。如果可以的话,那么保留单列索引和重复索引的原因就不同了。(另见。)


    更改索引后,请确保统计信息是最新的(这些天或多或少是自动的,但它过去很重要),然后使用SET EXPLAIN on运行查询,以检查索引是否正在使用(以及正在使用哪些索引)。

    hdaidx将不起作用。是的;集群索引可以用于hdaidx可以用于的任何内容。如果对于任何给定的hitlisted date,都有大量的删除日期,那么有时最好使用单列索引,但如果使用单列索引会非常有用。如果表是动态的(大量活动),那么额外的索引在更新时的成本可能比在选择时的成本更高;如果表几乎是静态的(很少有活动),那么情况可能正好相反。列入名单的日期不太可能是唯一的索引;如果可以的话,可能还有其他原因。那么为什么不在(a,B,C)上创建一个综合指数呢?在交叉引用的问题中,已经有一个关于(A,B,C)的索引;问题是仅仅(A,B)上的指数是否也有好处。答案是“不,除非(A,B)是唯一的”。几个因素:列基数、频繁查询模式、nrows、行长、静态或频繁表更新等。确定如何索引以及索引哪些列?@JonathanLeffler我根据您的输入,用表和索引的一些信息更新了我的问题。如果看起来不错,请告诉我。所有4种查询模式都会由索引提供服务吗?它在“灰色范围”中。如果表的行数少于100行,那么索引可能就不值得费心了。如果这张桌子上有数百万行,那就值得了。如果这个表有数千个,那么索引很可能是有益的。要考虑的一个选项包括<代码> ID >代码>作为索引中的第三列。然后,查询引擎可以使用仅索引搜索,而不必读取索引和数据页。(如果有一个小表,并且没有索引,您将对一到两页进行顺序扫描,这比读取索引页和数据页要快。)注意日期(-1)是1899-12-30。如果一切都是最新的,不会发生干扰,那你就没事了,但不久之前,在《普通流通》中就有比这更老的人了。日期列是
    long
    数据类型(纪元时间),所以它们不是日期类型。它们是整数列。Informix中的日期类型具有特定的含义。(1969-12-31 23:59:59比1899-12-30更近;尽管如此,这可能不是问题,但要小心。)看起来您需要将较长的纪元转换为日期时间或日期类型列,以便正确执行日期算术查询。
    CREATE INDEX i2_hitlist ON hitlist(deleted_date, hitlisted_date);