在一个仓储管理系统中,某表中有许多中物品,现根据时间段来统计每一种物品在时间段内的出货、入货的情况。
环境: SQL SERVER7.0 ENGLISH, WIN2000 SERVER, DELPHI6.0
问题: 共有物品1054种,前275种统计速度还可以,但到276种时,速度突然慢下来,变得不能忍受,不知是何原因??
SQL SENTENCE: 
SELECT SUM(JIANSHU),SUM(JINGZHONG) FROM VIEWRUKUPINGZHONG WHERE STARTTIME>'2004-07-01' AND ENDTIME<'2004-07-31'
AND LEIBIE=:LEIBIE AND PINGZHONG=:PINGZHONG AND PINGMING=:PINGMING AND GANGZHI=:GANGZHI AND YANSHE=:YANSHE (每一种物品LEIBIE,PINGZHONG,PINGMING,GANGZHI,YANSHE的组合均不重)请赐教!!!!!!!!!!!!!!!

解决方案 »

  1.   

    建立组合索引
    STARTTIME,ENDTIME,LEIBIE,PINGZHONG,PINGMING,GANGZHI,YANSHE
    将这些where 后面出现的字段建立一个组合索引
      

  2.   

    可以看出,这是从视图中的查询,
    该视图有一个主表和一个明细表组成,主表有索引(入库单号),LEIBIE,PINGZHONG,PINGMING,GANGZHI,YANSHE是属性,未建索引但,为何查询性能突然下降了呢?
      

  3.   

    这样试一下,将建立的视图,最后语句用order by STARTTIME,ENDTIME,LEIBIE,PINGZHONG,PINGMING,GANGZHI,YANSHE
    先排好序
      

  4.   

    无天:
      这样做有依据吗?
      我感觉像是DELPHI造成的,不像是SQLSERVER的错误,
      我是先统计出所有物品种类(组合LEIBIE,PINGMING,。。),再对各种物品进行各种数据统计的,使用一个循环来做(对一种物品需做四种统计,每一种一个SELECT语句),但不管循环里做多少SELECT,一到276种物品(循环)速度就变慢了。
      

  5.   

    建立视图VIEWRUKUPINGZHONG时,如果用order by可以按一定类型排序,执行Select ...where时会加快检索速度。
    如果你确认慢下来不是服务器的原因,这样设置一下客户端:
       ADOConnection1.CursorLocation:=clUseClient;
       ADOQuery1.CursorLocation:=clUseClient;
       ADOQuery1.CursorType:=ctStatic;
       ADOQuery1.LockType:=ltBatchOptimistic;
       ADOQuery1.CacheSize:=1000;
       //打开数据集后,执行盾环前
       ADOQuery1.Connection:=nil;
       //执行循环
      

  6.   

    利用SQLSERVER所带性能测试器作了测试,发现以前结论有误。
    表现如下:速度正常时,服务器的CPU资源占用率为80%左右,
         一旦速率慢下来时,发现服务器的CPU资源占用率为100%,感觉服务器突然响应不过来了,才会使速率慢下来。
         看来问题还是出在SQL SERVER上(不管是内存了还是CPU)。
         新的问题又来了,望大家多提宝贵意见。
      

  7.   

    可能数据库结构有问题,但由于条件太复杂,不便使用存储过程(或使用它一定能使速度上去吗?)看一下数据库的TRANSACTION LOG,已经到1G了,而数据库本身才50M,不知和它有无关系,
    如何才能将这个LOG缩到50M??,似乎限制LOG的大小,不让它随意增长还不行??
      

  8.   

    在管理工具中查看数据库的属性,在故障恢复一页中选择Log记录模式为"简单"(默认为完全),然后收缩数据库,Log就小了。但要考虑出现故障的话就有数据丢失的可能。