有视图如下定义,即使e表的LastUpdateDateTime列建立索引,SQLServer依旧无法使用索引。
我确认f表只能查出一条数据。
当改为存储过程时,把 e.LastUpdateDateTime >‘constant’常量时,就利用索引。
在不改变为存储过程的前提下,如何优化此类的SQL。
alert view V as select * FROM e WITH ( NOLOCK ) WHERE e.LastUpdateDateTime > ( SELECT [LastUpdateTime] FROM f WHERE PC='IP'
1. select * 是不是可以指明具体的字段,不需要的不要select 出来,这个比较重要的,很可能会引起 key lookup.
2. SELECT [LastUpdateTime] FROM f WHERE PC='IP',select 后加 top 1 试试。
3. e 表和 f 表上,lastupdatetime如果都有索引的话,性能也会好很多。
Top1也是不行。
查询变量时,会先扫描出E全表,千万行数据,然后再扫描出F表的一行数据,用千万行数据和这1行标量去比。
查询常量时,则直接用常量去对比E表,由于E表LastUpdate存在索引,所以IndexSeek十分快。
问题是,如何用让这个语句执行第二种执行计划,而不是扫描全表。
加个 index= 咯
加了确实有用。但这个导致程序和索引耦合了。程序是独立的。我现在建议,开发人员,修改SQL。