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

前端之家收集整理的这篇文章主要介绍了sql-server – SQL查询执行快捷方式OR逻辑?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有三张桌子:
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浏览器.查询优化器可以使用哪些索引来满足您的查询

猜你在找的MsSQL相关文章