ric*_*ent 7 t-sql sql-server performance short-circuiting sql-execution-plan
我有三张桌子:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
平均连接大小是几千个结果.显示的所有内容都已编入索引.
对于大多数SmallTable
记录,flag1
并flag2
设置为1
,所以实际上甚至不需要访问BigTable.text1上的索引,但SQL Server无论如何都会这样做,导致代价高昂的索引扫描和嵌套循环.
有没有更好的方式来暗示到SQL Server,如果flag1
和flag2
都被设置为1
,它不应该甚至懒得看text1
?
实际上,如果我可以在这些情况下完全避免加入BigTable(管理JoinTable,这不会产生问题),这将使这个关键查询更快.
SQL布尔评估并不保证运营商短路.有关如何假设操作员短路可能导致正确性问题和运行时错误的明确示例,请参阅On SQL Server布尔运算符短路.
在另一方面我的链接非常例子说明了什么呢工作的SQL Server:提供SQL可以使用的访问路径.因此,与所有 SQL性能问题和问题一样,真正的问题不在于表达SQL文本的方式,而在于存储的设计.IE浏览器.查询优化器可以使用哪些索引来满足您的查询?
归档时间: |
|
查看次数: |
2987 次 |
最近记录: |