1

我正在尝试在 Informix 中没有适用索引的非常大的表上执行选择。不幸的是,在该项目需要完成时添加适用的索引是不可能的 - 数据库更改有严格的程序,并且在我的组织中获得所需的签名需要很长时间。

该表是碎片化的,我之前从 Oracle 数据库中的特定分区中进行了选择。有没有办法在SELECT查询中指定片段?

4

2 回答 2

1

只是间接...

如果您的搜索条件部分地根据分区中使用的表达式确定要选择的行,那么 Informix 将执行“片段消除”以避免扫描不可能对答案做出贡献的分区(片段)。如果您有循环分区,则不可能消除碎片。如果您有表达式或区间碎片,那么您可以从碎片消除中受益。(因为碎片消除是性能上的一大胜利,所以只要有可能就会这样做。)

但是,最终,如果您不能放置正确的索引,查询性能可能会很慢,因为它可能需要表扫描,而这些可能比索引访问操作慢。也就是说,有时表扫描是处理查询的最快方法。只是这种情况并不常见。

于 2012-06-22T21:32:15.160 回答
0

如何确定表是否使用循环分片?两种方式:

一种简单的方法是使用 dbschema 获取表/索引的架构

UNIXprompt> dbschema -d <db name> -ss -t <table name>

如果您在表创建 DDL 中看到“循环”字样,那么您就会知道。

另一种,查询SMI:

database <db name>;
select unique(strategy) from sysfragments
 where fragtype = 'T'  
   and tabid = (select tabid from systables where tabname = '<table name>';

这是策略列的值键:
R = 循环分片策略
E = 基于表达式的分片策略
I = IN DBSPACE 子句指定特定位置作为分片策略的一部分
T = 基于表的分片策略
H = 表是一个具有表层次结构 (IDS) 的子表,或基于哈希的分片策略 (XPS)。

最后但并非最不重要的一点是,我使用 XLDB(迄今为止最大的表是 1.5k 宽,600 多列,600 亿条记录,是的,十亿),并且索引确实会产生巨大的差异,就像秒与小时一样(当然,我有≈100 个 vCPU 专用于我的数据库服务器)所以我建议你向你的变更控制委员会提出申请并创建你的索引,当你获得许可时,只要确保你使用“在线”子句,确定你的正确fillfactor 并且不要忘记更新统计信息(使用 Art 的 dostat)。

我的2美分...

于 2013-03-26T20:03:08.723 回答