我正在尝试在非常大的表上执行select,而Informix中没有适用的索引。遗憾的是,在项目需要完成时无法添加适用的索引 - 对于数据库更改存在严格的程序,并且在组织中获得所需的签名需要很长时间。
该表是碎片化的,之前我从Oracle数据库中的特定分区中进行了选择。有没有办法在SELECT
查询中指定片段?
答案 0 :(得分:1)
只是间接......
如果您的搜索条件根据分区中使用的表达式识别要部分选择的行,那么Informix将执行“片段消除”以避免扫描不可能对答案做出贡献的分区(片段)。如果您有循环分区,则无法删除片段。如果您有表达式或区间碎片,那么您可以从碎片消除中受益。 (因为片段消除是性能上的一大胜利,所以尽可能地完成。)
但最终,如果你不能放置正确的索引,查询性能可能会很慢,因为它可能需要表扫描,而且这些索引可能比索引访问操作慢。也就是说,有时表扫描是处理查询的最快方法。事情并非如此。
答案 1 :(得分: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 = Table是表层次结构(IDS)或基于散列的碎片策略(XPS)的子表。
最后但并非最不重要的是,我与XLDB合作(目前最大的表是1.5k宽,600多列,600亿recs,是,十亿),索引会造成巨大的差异,以秒与小时(授予,我有≈100vCPU专用于我的数据库服务器)所以我建议你向变更控制委员会提交请求并创建索引,当你获得许可时,请确保你使用“在线”子句,确定正确的填充因子,不要忘记更新统计数据(使用Art的dostat)。
我的2美分......