使用asp+ACCESS在租用的服务器上写了一个数据库网站应用,以前一直好用,最近因为加入了以下一个查询后服务器立马吃不消“Service Unavailable”,请教有什么解决方法?硬件方面暂时不可能变动,希望从数据库和查询优化上帮我想想办法,拜托!!!ACCESS文件大概9M,TB1表约2万条记录,ID、fld都做了索引。
下面查询目的是同时检出符合条件的几条连续记录。
sql ="SELECT ID FROM TB1 as T WHERE fld='d' AND EXISTS(SELECT * FROM TB1 WHERE fld='c' AND ID=T.ID+1) AND EXISTS(SELECT * FROM TB1 WHERE fld='c' AND ID=T.ID+2) AND EXISTS(SELECT * FROM TB1 WHERE fld='a' AND ID=T.ID+3)"
rs.open sql,conn,1,1
response.write rs("id")
下面查询目的是同时检出符合条件的几条连续记录。
sql ="SELECT ID FROM TB1 as T WHERE fld='d' AND EXISTS(SELECT * FROM TB1 WHERE fld='c' AND ID=T.ID+1) AND EXISTS(SELECT * FROM TB1 WHERE fld='c' AND ID=T.ID+2) AND EXISTS(SELECT * FROM TB1 WHERE fld='a' AND ID=T.ID+3)"
rs.open sql,conn,1,1
response.write rs("id")
这种查询能不能分拆?现在的这个貌似一次要查4个SELECT,开销肯定不小的
SELECT ID FROM TB1 as T
INNER JOIN TB1 T2 ON T.ID=T2.ID-1 AND T2.FLD='c'
AND fld='d'
INNER JOIN TB1 T3 ON T.ID=T3.ID-2 AND T2.FLD='c'
INNER JOIN TB1 T4 ON T.ID=T4.ID-3 AND T2.FLD='E'
INNER JOIN TB1 T2 ON T.ID=T2.ID-1 AND T2.FLD='c'
AND fld='d'
INNER JOIN TB1 T3 ON T.ID=T3.ID-2 AND T2.FLD='c'
INNER JOIN TB1 T4 ON T.ID=T4.ID-3 AND T2.FLD='e'
我在本地机试了一下,相同的查询,原来采用EXISTS的 cpu占用99%(持续),改成内连接后cpu约56%(一闪而过),可见优化效果明显!!!
引申一下:对于单张表的递归查询,内连接比EXISTS有效得多!教训深刻,希望能对其他同学有用。
在此感谢各位的帮助!