首页 新闻 会员 周边

不改变SQL情况下,此语句如何优化?可以添加Hint,Option。

0
[待解决问题]

有视图如下定义,即使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'
 
水手paul2008的主页 水手paul2008 | 菜鸟二级 | 园豆:204
提问于:2017-07-23 13:50
< >
分享
所有回答(2)
0

1. select * 是不是可以指明具体的字段,不需要的不要select 出来,这个比较重要的,很可能会引起 key lookup.

2. SELECT [LastUpdateTime] FROM f WHERE PC='IP',select 后加 top 1 试试。

3. e 表和 f 表上,lastupdatetime如果都有索引的话,性能也会好很多。

寻自己 | 园豆:285 (菜鸟二级) | 2017-07-23 19:05

Top1也是不行。

查询变量时,会先扫描出E全表,千万行数据,然后再扫描出F表的一行数据,用千万行数据和这1行标量去比。

查询常量时,则直接用常量去对比E表,由于E表LastUpdate存在索引,所以IndexSeek十分快。

问题是,如何用让这个语句执行第二种执行计划,而不是扫描全表。

支持(0) 反对(0) 水手paul2008 | 园豆:204 (菜鸟二级) | 2017-07-24 10:54
0

加个 index= 咯

czd890 | 园豆:14414 (专家六级) | 2017-07-23 21:03

加了确实有用。但这个导致程序和索引耦合了。程序是独立的。我现在建议,开发人员,修改SQL。

支持(0) 反对(0) 水手paul2008 | 园豆:204 (菜鸟二级) | 2017-07-24 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册