【发布时间】:2013-04-02 23:28:13
【问题描述】:
我想知道是否有人有任何通用指南(除了反复试验),用于为 Greenplum 中的一系列查询类型定义最佳分区/索引的良好策略?
Greenplum 对他们的管理指南有一些建议......但事实是,这几乎是 postgres 文档的复制粘贴,虽然其中一些建议似乎很明显(IE:当表太大而无法放入内存时进行分区),仅仅定义一个好的策略来实现这一点是不够的。
通常 Greenplum 数据库有非常大的表(超过数百 GB),虽然硬件是专门为这种用途选择的,但大多数时候我在处理非常大的数据库时遇到了麻烦(IE:曾经有一个包含 60 个字段的表和超过 2 亿行的数据库,每天增加 4-8 百万个注册表)。
我知道选择合适的分区有一些技巧,比如选择可预测的范围,这些范围将以几乎相等的大小分隔(如日期范围)。但还有一个事实是,当我尝试依赖索引的任何其他数据库时,Greenplum 通过给予某些设置更大的权重来完全不鼓励它们,比如它的随机页面成本,因此根本不使用索引。
但我读过一些完全适得其反的情况:假设您有三个节点,每个节点 64GB 内存,根据 GP,您不应该分区,直到表超过 192,但由于不使用索引,您最终将 seq 扫描每个节点高达 64gb! --- 虽然这仍然可以很快,但如果你强制使用索引,你可以从 20 多秒减少到几毫秒。
另一种已知情况是,在分区时,开销使查询比应有的速度慢很多。
那么,回到原来的问题:
有人对如何定义分区/索引策略有任何好的、坚定的建议吗?
使用我们的一些 ETL,来自源的测试查询可能需要半小时到一整小时,因此跟踪和错误确实会降低生产力。
谢谢。
【问题讨论】:
标签: database bigdata database-performance greenplum