短路SQL语句

时间:2011-12-01 15:56:00

标签: sql

MAIN_TABLE有超过1亿条记录; SECURITY_TABLE拥有超过2.5亿条记录。我正在尝试从MAIN_TABLE中检索与过滤条件匹配的对象,并且当前用户也可以访问(访问记录存储在security_table中)。我正在使用类似于以下的内容来查询它:

01 select col1, col2, col3 from main_table
02 where (col4 like '%something%' 
03    or col4 like '%something else%' 
04    or col4 like "%some other thing%')
05 AND
06 col1 in (select st_col1 from security_table 
07    where st_id in (
08        select col1 from main_table
09        where (col4 like '%something%' 
10        or col4 like '%something else%' 
11        or col4 like "%some other thing%'
12        )
13    )
14    AND
15    st_user_id = current_user_id
16)

如果我在第2-4行(标准A)中的过滤条件上有五个匹配,第9-11行(标准B)中的过滤条件是否会重新扫描MAIN_TABLE中的整个1亿条记录,或者只包含五条记录从第2-4行返回?

3 个答案:

答案 0 :(得分:2)

它取决于很多东西™,包括你的RDBMS(SQL Server,Oracle,MySQL等)。

但是,其中大多数问题的答案是maybe?

例如,如果查询分析器根据索引和基数确定它将更快,则SQL Server可以检查第二个条件。它们也很可能并行检查,并且在哈希表中比较两个检查的内容以找到交集。

对于您的特定情况,查询的性质需要进行表扫描,因此无关紧要。

答案 1 :(得分:0)

您的标准:

OR LIKE '% ... %' 

将需要扫描,并针对每个其他类似的OR标准进行额外扫描。

当您在第05行后附加AND子句时,可以从上一个条件返回的集合中完成。 但是您无法控制SQL Server首先使用的标准。它会尝试自己优化。

检查您的查询计划,了解它实际上在做什么。

答案 2 :(得分:0)

它将重新扫描整个表 - 内部子查询与主查询完全分离,即使它完全相同(因此看起来完全是多余的 - 如果你有不同内部子查询中的标准,它不会是多余的。)