【发布时间】:2015-06-30 08:01:12
【问题描述】:
我有这样一个场景:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN ('BOX','CARD')
该表由PACKAGE_TYPE 字段分区。假设PACKAGE_TYPE 字段有二十个可能的值。所以有二十个分区,包括BOX、CARD和DEFAULT分区。运行上述查询时,分区消除正确发生,仅扫描 BOX 和 CARDpartitions。结果很快。
然而,当同样的查询写成这样时:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN (SELECT PACKAGE_TYPE FROM PACKAGE_LIST_TABLE),其中PACKAGE_LIST_TABLE 中的PACKAGE_TYPE 列包含BOX 和CARD 两个值。
当上述查询运行时,所有 20 个分区都被扫描。它会降低性能。
编译器似乎未能正确识别第二个查询,因此所有分区都被访问了。
有什么办法可以解决这个问题?
提前致谢。
【问题讨论】:
-
分区消除通常发生在查询执行的编译阶段。目前需要的分区列表未知。
-
谢谢。任何解决方法来完成这项工作?无法对我的查询中的值进行“硬编码”。
标签: sql postgresql partition greenplum