首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >短路SQL语句

短路SQL语句
EN

Stack Overflow用户
提问于 2011-12-01 23:56:00
回答 3查看 72关注 0票数 2

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

代码语言:javascript
复制
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条记录?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-02 00:07:02

它依赖于很多东西,包括你的关系型数据库系统(SQL Server,Oracle,MySQL,等等)™。

然而,大多数问题的答案是maybe?

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

对于您的特定环境,查询的性质需要表扫描,因此这是不相关的。

票数 2
EN

Stack Overflow用户

发布于 2011-12-02 00:01:17

你的标准是:

代码语言:javascript
复制
OR LIKE '% ... %' 

将需要一次扫描,对于每个额外的相似OR标准,都需要额外的扫描。

当您将AND子句附加到第05行之后时,可以在从前一个条件返回的集合中执行此操作。然而,,您无法控制SQL Server将首先使用哪个标准。它将尝试自己进行优化。

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

票数 0
EN

Stack Overflow用户

发布于 2011-12-02 00:05:17

它将重新扫描整个表-内部子查询与主查询完全分开,即使它做的是完全相同的事情(因此看起来是完全冗余的-如果在内部子查询中有不同的条件,它就不是冗余的)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8344246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档