执行此操作并保持性能的正确方法需要对您的物理表设计进行一些修改。
如果您可以向每个包含指示符列的表添加一列并在该列上添加检查约束,则可以在查询中实现“分区”消除。
DDL:
create table table_a (
c1 ...
,c2 ...
,c3 ...
,table_ind char(1) not null generated always as 'A'
,constraint ck_table_ind check (table_ind = 'A')
);
create table table_b (
c1 ...
,c2 ...
,c3 ...
,table_ind char(1) not null generated always as 'B'
,constraint ck_table_ind check (table_ind = 'B')
);
create view v1 as (
select * from table_a
union all
select * from table_b
);
如果您执行查询select c1,c2,c3 from v1 where table_ind = 'A'
,DB2 优化器将使用检查约束来识别没有任何行table_b
可以匹配table_ind = 'A'
谓词,因此它将完全从访问计划中删除该表。
在 DB2 for Linux/UNIX/Windows 支持 Range Partitioning 之前,已经使用(并且在某些情况下仍然如此)。您可以在 2002 年由一些 IBM DB2 开发人员撰写的这篇研究论文 [PDF]中阅读有关此技术的更多信息。