如何解决postgres:是否应用 where 子句过滤器以便它们返回
下面是查询在 where 条件下有 3 个过滤器,哪个过滤器首先应用于表?在查询中按从右到左的顺序对表应用过滤器。
我希望先过滤掉 product_key,然后再过滤掉剩余的过滤器。
select *
from order_history
where product_key in (select product_key from products
where status = 'avilable' )
and province = 'Texas'
and category_key in (3,4,5)
解决方法
哪个过滤器首先应用于表格?
如评论中所述,优化器确定顺序。它应该以一种明智的方式进行——我假设不断比较将在 in
之前。其中一些可能会转换为索引。
您可以使用 case
表达式坚持自己的顺序:
select oh.*
from order_history oh
where (case when province is distinct from 'Texas' then false
when category_key not in (3,4,5) then false
else product_key in (select product_key
from products
where status = 'available'
)
end);
我强烈建议您永远不要使用这种方法,因为它会阻止优化器选择更好的执行计划——例如,查询不会使用索引或分区。
但是,case
表达式确实按顺序计算条件,因此您可以坚持使用这种构造的特定顺序。
哪个过滤器首先应用于表?在查询中按从右到左的顺序对表应用过滤器。
由于“AND”是可传递的,因此顺序没有意义。这就像说“1+2”和“2+1”是一样的。 "x=1 and y=2" 等价于 "y=2 and x=1"。这与运算符 && 不可传递的 C/C++ 不同:“if(pointer && *pointer)”首先测试指针是否为空,这就是你想要的,与“if(*pointer && pointer)”完全不同" 如果指针为空就会崩溃。
优化器将尝试按照它认为能提供最佳性能的顺序应用条件。这通常意味着首先选择最具选择性的可索引条件。例如,如果“province='Texas'”只选择表的 1%,并且上面有一个索引,那么首先使用它并且只将其余的过滤条件应用于表的 1% 是一个很大的胜利通过第一个过滤器的行。如果表统计信息是最新的(运行 VACUUM ANALYZE),优化器通常会给出不错的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。