SQLServer求优化

来源:百度知道 编辑:UC知道 时间:2024/07/05 00:01:33
绝对要优化,1000万条数据的历史表,每查询一次数据库都要被锁半天!

select * from sms_history
where (servertel='059512345678' or usertel='059512345678')
and sendtime between '2009-08-01' and '2009-09-01'

这条是最经常用的查询语句,查询发送时间为8月份的,指定手机号码的发送和接收记录。

目前此表有三个索引
PK_sms_history 聚集索引 smid
IX_sms_history1 普通索引 sendtime,servertel,serviceid
IX_sms_history2 普通索引 sendtime,usertel,serviceid

求各位高人帮忙优化一下,目的就是使查询时间尽可能缩短,数据库不会假死,至于后台操作多些没关系。
尽可能的优化吧
估计是索引没建好,并且语句中用了OR据说也比较慢

select * from sms_history
where servertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'
union all
select * from sms_history
where usertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'

这句不错啊,相对来讲有快了很多。

因为你的查询使用的是 【or】,这样虽然你的数据库上建了索引但是实际上,数据库并没有用到这个索引建议,拆开写。

如:
select * from sms_history
where servertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'
union
select * from sms_history
where usertel='059512345678'
and sendtime between '2009-08-01' and '2009-09-01'

再在(servertel,sendtime)和(usertel,sendtime)分别建个索引,估计能快些。

---
以上,希望对你有所帮助。

我一不太会优化,提供你一些优化的方法吧

操作符优化

in 操作符

用in写出来的sql的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

但是用in的sql性能总是比较低的,从oracle执行的步骤来分析用in的sql与不用in的sql有以下区别:

oracle试图将其转换成多个表的连接,如果转换不成功则先执行in里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用in的sql至少多了一个转换的过程。一般的sql都可以转换成功,但对于含有分组统计等方面的sql就不能转换了。

推荐方案:在业务密集的sql当中尽量不采用in操作符。

not in操作符

此操作是强列推荐不使用的,因为它不能应用表的索引。

推荐方案:用not exists 或(外连接+判断为空)方案代替

<> 操作符(不等于)

不等于操作符是永远不