我有三张桌子:
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,这不会产生问题),这将使这个关键查询更快.