微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgres:是否应用 where 子句过滤器以便它们返回

如何解决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 举报,一经查实,本站将立刻删除。