对于postgresql and的简单猜想

SQL查询优化实证
本文通过具体实验验证了SQL查询中where子句内表达式的顺序对查询结果的影响,并探讨了数据库如何通过内部优化来避免除以零错误。
今天做了这样的实验,目的是验证where条件后的a_expr and a_expr的顺序。
准备:
sql语句为:
create table a1 (a int);
create table a2 (a int);
create table a3 (a int, b int);
create table a4 (a int, b int);

insert into a1 values (0),(1);//(被除数)(除数)
insert into a2 values (0),(0);// (被除数)(除数)
insert into a3 values (0,0),(1,1);// (被除数,测试数)(除数,测试数)
insert into a4 values (0,1),(1,0);// (被除数,测试数)(除数,测试数)

需要知道的:
select 4/0;
ERROR:  division by zero
select * from a1 where (4 / a > 2) and (a > 0);// (4 / a > 2) a有可能为0
返回1;
select * from a1 where (4 / a > 2) and (a > a-1);
ERROR:  division by zero
select * from a2 where (4 / a > 2) and (a > 0);
无返回;
select * from a3 where (4 / a > 2) and (b > 0);
返回1;
select * from a4 where (4 / a > 2) and (b > 0);
ERROR:  division by zero

由此猜想select查询应该是有一步优化,首先对a处理,这样会加快速度,减少重复运算,从而,没有进行/0操作。

当没有and时,执行计划会根据通过语法解析的节点复杂度进行重新排序,而有or的时候,就会按照手写的顺序。

转载于:https://my.oschina.net/Suregogo/blog/135665

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值