以下SQL中的查询是有效查询,但由于表上的约束,表中的数据永远不会与where子句匹配。
我在Postgres的两个查询上运行解释,看起来CBO不知道这个事实,并打算执行这些查询。我原以为它会认识到没有任何数据,甚至没有尝试过。
create table myTest ( a char(1) not null, b integer);
insert into myTest values ('A',1), ('B',2), ('C',3);
select * from myTest where A = ‘Texas’;
select * from myTest where A is null;
我搜索了一些信息,我发现了很多关于CBO如何运作的深层信息,但没有提到这一点。我期待看到一个CBO参数说“跳过不可能的查询”。
我知道不同的CBO会有不同的工作方式,但总的来说,优化者真的不会考虑这些信息吗?如果没有,为什么不呢?
答案 0 :(得分:0)
这似乎不太可能。基于成本的优化器几乎完全符合其名称 - 他们使用表中的统计信息(或估计的统计信息)来选择运行查询的最佳算法。
他们对约束的使用非常有限 - 实际上可能没有。他们可能会考虑到唯一的约束,但这可能是通过索引而不是约束。
他们为什么不这样做?我认为编写数据库优化器的人正试图解决“更难”的问题。问题。如果将单个字符与'Texas'
进行比较,那么查询编写者应该知道这些内容。
此外,可以缓存查询计划。可以删除约束。一般来说,我不认为添加或删除约束会使缓存的查询计划无效。