0

我创建了一个表 T ,它在列 C (btree index) 上创建了一个索引,但是当我运行选择查询时,该索引没有被使用。

前任:

Explain select * from T where C='xxx'

这会按顺序搜索所有段,而不考虑我创建的索引。

我使用了以下标志

enable_seqscan = off
enable_bitmapscan = off
enable_indexscan = on

我错过了什么吗?请解释一下?

谢谢 Ganesh.R

4

4 回答 4

1

无论出于何种原因,查询优化器都可能认为最好不要使用索引。此外,如果统计元数据已过期,您可能需要ANALYZE在表格上执行操作。有关更多详细信息,请参阅本文(或其他类似文章)。

于 2011-07-27T14:25:51.250 回答
1

w/oexplain analyze很难说出原因,但有几点:

  • GP 使用非常高的 random_page_cost 并且 seq_page_cost 为 1。random_page_cost 的默认值为 100,这完全不鼓励优化器使用索引扫描
  • enable_seqscan = off不会完全关闭 seq 扫描。seq 扫描受到严重
    惩罚
  • 如果表很小(100 - 10k 条记录),按顺序读取它并完全忽略索引可能会更快
于 2012-11-16T14:11:45.407 回答
0

与传统的 RDBMS 不同,索引可能不是在 Greenplum 中访问数据的首选方式。

Greenplum 开箱即用,更喜欢表扫描而不是索引扫描,你必须做很多调整才能改变它。您可以设置其他参数来帮助 GP 优化器选择索引,包括set enable_nestloop on, cpu_index_tuple_cost 和其他。查看 GP 管理员指南的附录 D 以获取完整的可调参数集。

另外,您如何分配数据?这可以在优化器如何选择处理您的查询中发挥作用。

于 2011-11-04T19:39:56.687 回答
0

如果您的表是分区的,那么您的索引未被使用还有一个可能的原因:您的表有一个索引,但您的部分或全部分区没有。您可以查看系统视图来检查它pg_indexes。是否有分区条目?

此问题的根本原因可能是它alter table TABLE add partition...不会自动创建您为 TABLE 定义的索引。

有两种解决方案:

  • create index INDEXNAME on PARTITIONTABLENAME(ROWLIST..)添加分区后。搜索系统查看pg_partitions获取PARTITIONTABLENAME!它与PARTITIONNAME.
  • 在您的表上延迟create index到您添加了您需要的所有分区的地步。这是因为在表上创建索引会自动在所有现有分区上创建索引。

顺便说一句,删除表上的索引不会删除分区上的索引。

很抱歉,我无法向您提供任何关于 GP 管理指南的参考,因为我要么是盲人要么是错误的,或者管理指南完全忽略了这个问题。

于 2013-05-31T09:19:43.737 回答