我使用的数据库为sql2000 数据库中有1张表的数据记录比较多。大概都在100W左右。 我使用了一条语句在查询分析器里运行的时间是40秒,查询的结果只有100~200条。请问有什么优化的方法。sql语句如下:KCT_CPB 表中有上百万的数据。
temp是临时表,存放符合条件的结果数据只有100~200条记录。
SELECT * FROM (SELECT temp.*, (SELECT SUM(Num) num FROM KCT_CPB WHERE (LXT_CPB.MerID = 'SYKH001') AND (KCT_CPB.ProID = 'NXT') AND (KCT_CPB.UnNum <> 0) AND KCT_CPB.cpid <= t .cpid) AS sumNUM FROM KCT_CPB temp WHERE (UnNum <> 0) AND (MerID = 'SYKH001') AND (ProID = 'NXT') ) DERIVEDTBL WHERE (sumNUM < 2542)请大大们给点建议。

解决方案 »

  1.   

    LXT_CPB是错的应该是KCT_CPB。
    请问有没有对这条语句有更好的解决的办法。
      

  2.   

    先整理再看,以后提问请整理好,你好我也好SELECT * FROM 
    (
      SELECT temp.*, ( 
                      SELECT SUM(Num) num 
                      FROM KCT_CPB 
                      WHERE (LXT_CPB.MerID = 'SYKH001') 
                      AND (KCT_CPB.ProID = 'NXT') 
                      AND (KCT_CPB.UnNum <> 0) 
                      AND KCT_CPB.cpid <= t .cpid 
                     ) AS sumNUM 
      FROM KCT_CPB temp 
      WHERE (UnNum <> 0) 
      AND (MerID = 'SYKH001') AND (ProID = 'NXT') 
    ) DERIVEDTBL 
    WHERE (sumNUM < 2542) 
      

  3.   

    t也不知道是指什么?那么SUM(Num) 是不是也错了,你先仔细看看,要不别人没法回答
      

  4.   

    在表建一個索引
    create index IX_KCT_CPB on KCT_CPB(MerID,ProID,cpid)
      

  5.   

    lz写的语句有问题,好像只有一个表KCT_CPB,为什么要用子查询,而且还出现莫名奇妙的别名,先把正确的代码贴出来吧,不然没法优化
      

  6.   

    SELECT SUM(Num) num 
                      FROM KCT_CPB 这个是他关键要的东西
      

  7.   


    SELECT tmp.*, b.Num
    FROM KCT_CPB tmp
    LEFT JOIN (
    SELECT cpid, SUM(Num) AS Num
    FROM KCT_CPB
    WHERE LXT_CPB.MerID = 'SYKH001') 
    AND (KCT_CPB.ProID = 'NXT') 
    AND (KCT_CPB.UnNum <> 0)
    GROUP BY cpid
    ) b ON tmp.cpid = b.cpid
    WHERE (UnNum <> 0) AND (MerID = 'SYKH001') AND (ProID = 'NXT') AND SumNum < 2542
      

  8.   

    楼上的仁兄可能我没有表达清楚。这条SQL语句的功能是这样的如下:数据表格式为:
    cpid      merid       proid    unnum 
     1       sykh001       GZ1#     50
     2       sykh001       GZ1#     100
     3       sykh001       GZ1#     60
     4       sykh001       GZ1#     40
     5       sykh001       GZ1#     90
     6       sykh001       GZ1#     8
     7       sykh001       GZ1#     45
     8       sykh001       GZ1#     200
     9       sykh001       GZ1#     13
     10      sykh001       GZ1#     77我要查询的结果为客户编号merid=sykh001,proid=DZ1# sum(unnum)<260 显示结果为下面:
    cpid      merid       proid    unnum   sumnum
     1       sykh001       GZ1#     50       50
     2       sykh001       GZ1#     100      150
     3       sykh001       GZ1#     60       210
     4       sykh001       GZ1#     40       250
     
      

  9.   

    UnNum、MerID、ProID 建复合索引
    如果WHERE (sumNUM >= 2542)的数据量很在考虑用游标处理,如果不是可考虑用临时表处理