日期:2014-05-17  浏览次数:20483 次

SQL 2000 才3万1千条数据,查询需要24秒,好心的大侠救命~!
就一个表table。但表有点大,内容很多,字段106个(除ID外还有105个)。
53个 int(4) 类型字段
26个 nvarchar(50)类型字段
5个 nvarchar(250)类型字段
17个 ntext(16)类型字段
1个 varchar(5000)类型字段
1个 char(10)类型字段
2个 datetime(8)类型字段
只有在ID上建立了聚焦索引。
查询只用到23个字段(id、addtime、title、4个int(4)、2个nvarchar(50)、3个nvarchar(250)、1个varchar(5000)、10个ntext(16))。
排序用到3个字段([id]主键+聚集int(4)、[title]nvarchar(250)、[addtime]datetime(8))。
"select 【23个字段】 from table where DATEDIFF(getdate(),[addtime]) = 0 and int1 = 0 and int2 > 0 Order By addtime asc,title asc,id asc"
where 中3个条件,DATEDIFF(getdate(),[addtime]) = 0(3万1千条就可以剩2000条左右),int1 = 0 and int2 > 0(剩1600条左右)
这就是整个过程,试测试10次6次在24秒,3次23秒,1次22秒。显示的内容是有点多的。
有没有办法可以更好的优化呢。。。

------解决方案--------------------
给几个私人建议:
1、在where中,能不对列做函数的就不做,开销很明显。比如你datediff那个。
2、只对ID做索引,但是只在排序时才用到,典型的浪费索引,建议把where中的字段都加到索引中去,对要运算的列、经常查询的列、具有高选择性的列,都应该考虑添加索引,这种情况最好用复合索引,而不是一列一个索引。
3、如果是2005以后的SQLServer,可以考虑分区,减少数据量。
4、再思考一下是否还有可用的筛选条件?因为你的where子句中列的筛选性不高。
5、实在不行的话把你的执行计划贴出来,具体看看是哪一步耗时。
------解决方案--------------------
探讨

引用:
引用:

引用:
语句改成下面的 addtime 上面加索引

SQL code

select *
from tb
where [addtime]>DATEADD(dd,DATEDIFF(dd,0,getdate()),0)
and int1 = 0
and int2 > 0
Order By addtime ……

------解决方案--------------------
探讨

引用:
你这主要是列太多,而且太多text 数据类型

虽然行不算多,但是每页存储的数据少


你可以看一下这个表有多大

EXEC SP_SPACEUSED TABLEAname, 'TRUE'

另外
贴一下你的执行计划看看


还想弱弱的问一下,[addtime]>DATEADD(mm,DATEDIFF(mm,0,getdate()),0) ……

------解决方案--------------------
这样有数据量吧?执行时间多少?
SQL code
declare @month varchar(6)
set @month= convert(varchar(6),getdate(),112)
select 【23个字段】 from table where convert(varchar(6),addtime,112)=@month
 and int1 = 0 and int2 > 0 Order By addtime asc,title asc,id asc