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行返回?
答案 0 :(得分:2)
它取决于很多东西™,包括你的RDBMS(SQL Server,Oracle,MySQL等)。
但是,其中大多数问题的答案是maybe?
。
例如,如果查询分析器根据索引和基数确定它将更快,则SQL Server可以检查第二个条件。它们也很可能并行检查,并且在哈希表中比较两个检查的内容以找到交集。
对于您的特定情况,查询的性质需要进行表扫描,因此无关紧要。
答案 1 :(得分:0)
您的标准:
OR LIKE '% ... %'
将需要扫描,并针对每个其他类似的OR
标准进行额外扫描。
当您在第05行后附加AND
子句时,可以从上一个条件返回的集合中完成。 但是您无法控制SQL Server首先使用的标准。它会尝试自己优化。
检查您的查询计划,了解它实际上在做什么。
答案 2 :(得分:0)
它将重新扫描整个表 - 内部子查询与主查询完全分离,即使它完全相同(因此看起来完全是多余的 - 如果你有不同内部子查询中的标准,它不会是多余的。)