加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL查询执行快捷方式OR逻辑?

发布时间:2020-12-12 07:02:26 所属栏目:MsSql教程 来源:网络整理
导读:我有三张桌子: SmallTable (id int,flag1 bit,flag2 bit)JoinTable (SmallTableID int,BigTableID int)BigTable (id int,text1 nvarchar(100),otherstuff...) SmallTable最多只有几十条记录. BigTable有几百万,实际上是一个视图,UNIONS在这个数据库中的一个
我有三张桌子:
SmallTable
   (id int,flag1 bit,flag2 bit)
JoinTable
   (SmallTableID int,BigTableID int)
BigTable
   (id int,text1 nvarchar(100),otherstuff...)

SmallTable最多只有几十条记录. BigTable有几百万,实际上是一个视图,UNIONS在这个数据库中的一个表与同一服务器上的另一个数据库中的表.

这是连接逻辑:

SELECT * FROM
    SmallTable s
    INNER JOIN JoinTable j ON j.SmallTableID = s.ID
    INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
    (s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
    AND (s.flag2=1 OR b.text1 <> 'value1')

平均连接大小是几千个结果.显示的所有内容都已编入索引.

对于大多数SmallTable记录,flag1和flag2设置为1,因此实际上甚至不需要访问BigTable.text1上的索引,但SQL Server无论如何都会这样做,导致代价高昂的索引扫描和嵌套循环.

是否有更好的方法来提示SQL Server,如果flag1和flag2都设置为1,它甚至不应该看着text1?

实际上,如果在这些情况下我可以完全避免加入BigTable(管理JoinTable,这不会产生问题),这将使这个关键查询更快.

解决方法

SQL布尔评估不保证运算符短路.有关如何假设运算符短路可能导致正确性问题和运行时错误的清晰示例,请参见 On SQL Server boolean operator short-circuit.

另一方面,我链接中的示例显示了对SQL Server有用的功能:提供SQL可以使用的访问路径.因此,与所有SQL性能问题和问题一样,真正的问题不在于表达SQL文本的方式,而在于存储的设计. IE浏览器.查询优化器可以使用哪些索引来满足您的查询?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读