我创建了一个表 T ,它在列 C (btree index) 上创建了一个索引,但是当我运行选择查询时,该索引没有被使用。
前任:
Explain select * from T where C='xxx'
这会按顺序搜索所有段,而不考虑我创建的索引。
我使用了以下标志
enable_seqscan = off
enable_bitmapscan = off
enable_indexscan = on
我错过了什么吗?请解释一下?
谢谢 Ganesh.R
w/oexplain analyze
很难说出原因,但有几点:
enable_seqscan = off
不会完全关闭 seq 扫描。seq 扫描受到严重与传统的 RDBMS 不同,索引可能不是在 Greenplum 中访问数据的首选方式。
Greenplum 开箱即用,更喜欢表扫描而不是索引扫描,你必须做很多调整才能改变它。您可以设置其他参数来帮助 GP 优化器选择索引,包括set enable_nestloop on, cpu_index_tuple_cost
和其他。查看 GP 管理员指南的附录 D 以获取完整的可调参数集。
另外,您如何分配数据?这可以在优化器如何选择处理您的查询中发挥作用。
如果您的表是分区的,那么您的索引未被使用还有一个可能的原因:您的表有一个索引,但您的部分或全部分区没有。您可以查看系统视图来检查它pg_indexes
。是否有分区条目?
此问题的根本原因可能是它alter table TABLE add partition...
不会自动创建您为 TABLE 定义的索引。
有两种解决方案:
create index INDEXNAME on PARTITIONTABLENAME(ROWLIST..)
添加分区后。搜索系统查看pg_partitions
获取PARTITIONTABLENAME
!它与PARTITIONNAME
.create index
到您添加了您需要的所有分区的地步。这是因为在表上创建索引会自动在所有现有分区上创建索引。顺便说一句,删除表上的索引不会删除分区上的索引。
很抱歉,我无法向您提供任何关于 GP 管理指南的参考,因为我要么是盲人要么是错误的,或者管理指南完全忽略了这个问题。