使用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")

解决方案 »

  1.   

    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)" 既然后面的exists是同一个表,那就应该有优化余地sql ="SELECT ID FROM TB1 as T WHERE fld='d' AND EXISTS(SELECT * FROM TB1 WHERE (fld='c' AND ID=T.ID+1 AND ID=T.ID+2) AND ( fld='a' AND ID=T.ID+3)" 看看
      

  2.   

    真的没办法了吗?郁闷啊...
    这种查询能不能分拆?现在的这个貌似一次要查4个SELECT,开销肯定不小的
      

  3.   


    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'
      

  4.   

    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'
      

  5.   

    每次 fld='x' 中x的值是随机的,所以这样优化不行 :) 我想能不能将这一个查询分拆为几个查询?资源开销会不会小些?具体方法不会。回宝鸭和降龙十八掌,查询没有问题,就是服务器吃不消。
      

  6.   

    采用内连接处理确实比原来的要节约得多
    我在本地机试了一下,相同的查询,原来采用EXISTS的 cpu占用99%(持续),改成内连接后cpu约56%(一闪而过),可见优化效果明显!!!
    引申一下:对于单张表的递归查询,内连接比EXISTS有效得多!教训深刻,希望能对其他同学有用。
    在此感谢各位的帮助!