作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有三个表:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
最多有几十条记录。 BigTable
有几百万,实际上是一个将该数据库中的表与同一服务器上另一个数据库中的表 UNIONS 的 View 。
这是连接逻辑:
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 bool 计算不保证运算符短路。请参阅On SQL Server boolean operator short-circuit一个清晰的例子展示了假设运算符(operator)短路如何导致正确性问题和运行时错误。
另一方面,我的链接中的示例显示了 SQL Server 的作用:提供 SQL 可以使用的访问路径。因此,与所有 SQL 性能问题和疑问一样,真正的问题不在于 SQL 文本的表达方式,而在于存储的设计。 IE。查询优化器可以使用哪些索引来满足您的查询?
关于sql-server - SQL查询执行快捷方式OR逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2135626/
我是一名优秀的程序员,十分优秀!