80万条记录的优化问题

时间:2022-07-31 14:43:54
网站是用asp+sql2000做的,现在数据有80万条了。以前数据少了还要以,但现在打开需要查询sql的网页非常慢。请高手指点!
如:sql="select count(*) as num from prod where (available_time + update_time > CONVERT(DATETIME, getdate(), 102)) and  pro_status=1 "
就需要4-6秒。请高手指点。或者需要什么样的技术可以提高网站的速度!分数不多,请包函!

24 个解决方案

#1


索引!

#2


谢谢楼上的回复,我做过索引!!

#3


dd

#4


4-6秒查询80万的数据,需要这么时间我觉得是正常的
这么多数据也不算小了,

如果想要更快,你可试一下加索引
create index idx_prod on prod (available_time,update_time )

#5



CONVERT(DATETIME, getdate(), 102) 这里转换无效果吧,等价于getdate()

单键索引
available_time ,update_time
pro_status 如果状态很多也建索引

select count(1) as num from prod where available_time  > getdate()-update_time  and  pro_status=1

试试看哈

#6


引用 5 楼 yanleiyigan 的回复:
SQL code
CONVERT(DATETIME, getdate(), 102) 这里转换无效果吧,等价于getdate()

单键索引
available_time ,update_time
pro_status 如果状态很多也建索引

select count(1) as num from prod where available_time  > getdate()-update_time  and  pro_status=1

试试看哈

贊同.

#7


1. 你先在prod后面加with(nolock) 看看是不是更新太多,以至于查表的时候引起锁等待

如果1不行,那么试试
2.
create view v_test
as
select available_time+update_time as time1,pro_status
from dbo.prod 


create  index ix_v_test
on test(time1,pro_status)

select count(1) from v_test with(nolock) where time1>CONVERT(DATETIME, getdate(), 102))  and pro_status=1



#8


select count(1) as num 
from prod 
where available_time > getdate()-update_time
and  pro_status=1 

这样应该会好点,如果update_time是个定值效果更好.因为索引列在参与算术运算时索引会失效.

#9


重新找人开发

#10


1.先从网站的Cache着手.

2.不给出表结构、索引情况,你的语句很难优化。

#11


你做过哪些索引和视图,请贴上来看看.

总的建议就是把
查询最频繁的表做索引,
把更新最频繁的单独做运算.


比如将available_time ,update_time 做单独的索引
pro_status 如果状态很多也可以单独建索引

另外条件语句 
where available_time > getdate()-update_time
也换下位置,利用运算. 

看效果是不是好些?

#12


我看到别人的网站打开速度非常快,只有二秒左右。不知道用的是什么方法或技术。好像还生成的静态面页。

#13


高手们,请顶一下!!!
有没有可以告诉我方法也行呀!!
索引我是用过了,有没有其它技术可以实现。不一定非得用sql200!!

#14


1. 页面尽量要静态化。只要能够静态化的地方就一定静态化
2. 适当的索引
3. 如果sql="select count(*) as num from prod where (available_time + update_time > CONVERT(DATETIME, getdate(), 102)) and  pro_status=1 "需要很长的时间,那么干脆就不要用它!可以在prod数据表上建立触发器,用来计数符合你上面查询中条件的记录数,病存放到另外一个表里,需要的时候,你直接一个很简单的sql语句就查询出来了。用触发器的目的,就是把负载平均在平时的对prod数据表的insert,delete或update操作上,而不是把运算的负载集中在查询的时候。
4. 优化SQL语句
5. 80w条记录的数据表不算大,一定要树立可以优化的的信心,性能的问题是肯定可以解决的。

#15


14L更正:
 = 并

#16


谢谢楼上的回复,但我求的是在这个时间以后的记录,用触发器不在现实!!
谢谢!!继续等待中!!!

#17


 回帖是一种美德!每天回帖即可获得 10 分可用分!

#18


关注

#19


关注,学习。。。

#20


谢谢大家的回复,我有查一此资料,说用lucene 可以更快些,请各位老大指点!!

#21


跪求!!!

#22


哈哈,看来比较难了!!
各位老大!!学习中!!!

#23


引用 9 楼 csharpvb 的回复:
重新找人开发



還是從來好點。2000有點老了。用2008sql

#24


谢谢各位了,虽然没有找到办法!现在结帖!

#1


索引!

#2


谢谢楼上的回复,我做过索引!!

#3


dd

#4


4-6秒查询80万的数据,需要这么时间我觉得是正常的
这么多数据也不算小了,

如果想要更快,你可试一下加索引
create index idx_prod on prod (available_time,update_time )

#5



CONVERT(DATETIME, getdate(), 102) 这里转换无效果吧,等价于getdate()

单键索引
available_time ,update_time
pro_status 如果状态很多也建索引

select count(1) as num from prod where available_time  > getdate()-update_time  and  pro_status=1

试试看哈

#6


引用 5 楼 yanleiyigan 的回复:
SQL code
CONVERT(DATETIME, getdate(), 102) 这里转换无效果吧,等价于getdate()

单键索引
available_time ,update_time
pro_status 如果状态很多也建索引

select count(1) as num from prod where available_time  > getdate()-update_time  and  pro_status=1

试试看哈

贊同.

#7


1. 你先在prod后面加with(nolock) 看看是不是更新太多,以至于查表的时候引起锁等待

如果1不行,那么试试
2.
create view v_test
as
select available_time+update_time as time1,pro_status
from dbo.prod 


create  index ix_v_test
on test(time1,pro_status)

select count(1) from v_test with(nolock) where time1>CONVERT(DATETIME, getdate(), 102))  and pro_status=1



#8


select count(1) as num 
from prod 
where available_time > getdate()-update_time
and  pro_status=1 

这样应该会好点,如果update_time是个定值效果更好.因为索引列在参与算术运算时索引会失效.

#9


重新找人开发

#10


1.先从网站的Cache着手.

2.不给出表结构、索引情况,你的语句很难优化。

#11


你做过哪些索引和视图,请贴上来看看.

总的建议就是把
查询最频繁的表做索引,
把更新最频繁的单独做运算.


比如将available_time ,update_time 做单独的索引
pro_status 如果状态很多也可以单独建索引

另外条件语句 
where available_time > getdate()-update_time
也换下位置,利用运算. 

看效果是不是好些?

#12


我看到别人的网站打开速度非常快,只有二秒左右。不知道用的是什么方法或技术。好像还生成的静态面页。

#13


高手们,请顶一下!!!
有没有可以告诉我方法也行呀!!
索引我是用过了,有没有其它技术可以实现。不一定非得用sql200!!

#14


1. 页面尽量要静态化。只要能够静态化的地方就一定静态化
2. 适当的索引
3. 如果sql="select count(*) as num from prod where (available_time + update_time > CONVERT(DATETIME, getdate(), 102)) and  pro_status=1 "需要很长的时间,那么干脆就不要用它!可以在prod数据表上建立触发器,用来计数符合你上面查询中条件的记录数,病存放到另外一个表里,需要的时候,你直接一个很简单的sql语句就查询出来了。用触发器的目的,就是把负载平均在平时的对prod数据表的insert,delete或update操作上,而不是把运算的负载集中在查询的时候。
4. 优化SQL语句
5. 80w条记录的数据表不算大,一定要树立可以优化的的信心,性能的问题是肯定可以解决的。

#15


14L更正:
 = 并

#16


谢谢楼上的回复,但我求的是在这个时间以后的记录,用触发器不在现实!!
谢谢!!继续等待中!!!

#17


 回帖是一种美德!每天回帖即可获得 10 分可用分!

#18


关注

#19


关注,学习。。。

#20


谢谢大家的回复,我有查一此资料,说用lucene 可以更快些,请各位老大指点!!

#21


跪求!!!

#22


哈哈,看来比较难了!!
各位老大!!学习中!!!

#23


引用 9 楼 csharpvb 的回复:
重新找人开发



還是從來好點。2000有點老了。用2008sql

#24


谢谢各位了,虽然没有找到办法!现在结帖!