我有三张桌子:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
最多有几十条记录。BigTable
有几百万,实际上是一个视图,它将这个数据库中的一个表与同一服务器上另一个数据库中的一个表联合起来。
这是连接逻辑:
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 是托管的,所以这不会产生问题),那将使这个键查询更快。