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)的筛选条件上有5个匹配项,那么第9-11行(条件B)的筛选条件是重新扫描MAIN_TABLE中的全部1亿条记录,还是只包括从第2-4行返回的5条记录?
发布于 2011-12-02 00:07:02
它依赖于很多东西,包括你的关系型数据库系统(SQL Server,Oracle,MySQL,等等)™。
然而,大多数问题的答案是maybe?。
例如,如果查询分析器根据索引和基数确定第二个条件会更快,SQL Server可能会检查第二个条件。它们也很可能被并行检查,并将两个检查的内容在哈希表中进行比较,以找到交叉点。
对于您的特定环境,查询的性质需要表扫描,因此这是不相关的。
发布于 2011-12-02 00:01:17
你的标准是:
OR LIKE '% ... %' 将需要一次扫描,对于每个额外的相似OR标准,都需要额外的扫描。
当您将AND子句附加到第05行之后时,可以在从前一个条件返回的集合中执行此操作。然而,,您无法控制SQL Server将首先使用哪个标准。它将尝试自己进行优化。
检查您的查询计划,了解它实际在做什么。
发布于 2011-12-02 00:05:17
它将重新扫描整个表-内部子查询与主查询完全分开,即使它做的是完全相同的事情(因此看起来是完全冗余的-如果在内部子查询中有不同的条件,它就不是冗余的)。
https://stackoverflow.com/questions/8344246
复制相似问题