暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL查询中的过滤器顺序

ASKTOM 2020-04-09
249

问题描述

你好,问一下汤姆团队。

我想知道在SQL查询中的过滤器中放置正确的顺序。我是说,在那里的条件下。

1.我们如何帮助优化器以获得最佳性能?我知道它会根据自己的统计数据尝试执行最佳计划,但我想以最佳方式执行。

例如,我有一个带有强制性日期过滤器的查询,然后是一些其他条件:

SELECT t1.col1,t1.col2,t1.col3,t2.col4
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id=t2.id
WHERE t1.first_date >= TO_DATE('01/04/2020','dd/mm/yyyy')
AND t1.last_date < TO_DATE('09/04/2020','dd/mm/yyyy')
AND t1.col1='some_value'
AND t2.col4='some_value'
复制


2.建议对日期列进行索引,并将它们放在查询的第一位?

提前感谢。

问候,

专家解答

1.优化器决定应用条件的顺序您在WHERE子句中放置过滤器的顺序不起作用。依靠这一点可能会导致一些意想不到的结果:



也就是说...

该查询外部连接T2并在WHERE子句中对其进行过滤:

SELECT ...
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id=t2.id
WHERE t2.col4='some_value'
复制


这将查询变成内部联接。如果要过滤外部联接行,则需要在联接中执行此操作...在...子句:

SELECT ...
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id=t2.id
AND t2.col4='some_value'
WHERE ...
复制


2.假设您正在搜索日期范围,该日期范围是表中行的 “一小部分”,则索引日期可能会有所帮助。

对于该查询,我会考虑在以下位置创建索引:

create index i on table1 ( col1, first_date, last_date );
复制


在另一张表上:

create index i2 on table2 ( id, col4 );
复制


WHERE子句中这些列的位置不相关。尽管它们所在的哪个子句 (WHERE,JOIN,ORDER等) 确实很重要,数据库是否会使用索引以及它的有效性如何。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论