SELECT EMPLOYEEID, NAME, DOOR_NAME, PLACE_NAME,  CASE PASSWAY WHEN '0' THEN '关'  WHEN '1' THEN '开' END AS PASSWAY ,
CASE ISINOUT WHEN '0' THEN '进门'  WHEN '1' THEN '出门' END AS ISINOUT ,
CASE CARDTYPE WHEN '1' THEN '系统卡'  WHEN '2' THEN '警员卡' WHEN '3' THEN '普通卡' WHEN '4' THEN '无权卡' WHEN '5' THEN '非法卡' WHEN '6' THEN 
'反胁迫卡' WHEN '10' THEN '超级卡'  WHEN '11' THEN '地区卡' WHEN '12' THEN '维护组卡' WHEN '13' THEN '工程人员卡' END AS CARDTYPE  ,
INOUTTIME , PICFILENAME  
FROM  DC_INOUTDOOR_HISDATA   
WHERE  INOUTTIME >= '2009-08-26 00:00:00' 
AND INOUTTIME <= '2009-08-26 23:59:59' 
ORDER BY INOUTTIME DESC
在数据库中判断CASE 是否会影响速度。DC_INOUTDOOR_HISDATA,这张表,记录量超庞大,860W条记录!
   看其他贴,知道要给INOUTTIME 加索引。索引是什么我都模糊,平日有个主键,有个唯一就够用了!还有张表发现没主键...
记录也很多!
设置主键时‘超时时间已到。在操作完成之前超时时间已过或服务器未响应。’菜鸟帖!!!忘大虾们提示,指点指点!

解决方案 »

  1.   

    CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
        ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) 
    [ WITH < index_option > [ ,...n] ] 
    [ ON filegroup ]< index_option > ::= 
        { PAD_INDEX |
            FILLFACTOR = fillfactor |
            IGNORE_DUP_KEY |
            DROP_EXISTING |
        STATISTICS_NORECOMPUTE |
        SORT_IN_TEMPDB  
    }参数
    UNIQUE为表或视图创建唯一索引(不允许存在索引值相同的两行)。视图上的聚集索引必须是 UNIQUE 索引。在创建索引时,如果数据已存在,Microsoft® SQL Server™ 会检查是否有重复值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行这种检查。如果存在重复的键值,将取消 CREATE INDEX 语句,并返回错误信息,给出第一个重复值。当创建 UNIQUE 索引时,有多个 NULL 值被看作副本。如果存在唯一索引,那么会产生重复键值的 UPDATE 或 INSERT 语句将回滚,SQL Server 将显示错误信息。即使 UPDATE 或 INSERT 语句更改了许多行但只产生了一个重复值,也会出现这种情况。如果在有唯一索引并且指定了 IGNORE_DUP_KEY 子句情况下输入数据,则只有违反 UNIQUE 索引的行才会失败。在处理 UPDATE 语句时,IGNORE_DUP_KEY 不起作用。SQL Server 不允许为已经包含重复值的列创建唯一索引,无论是否设置了 IGNORE_DUP_KEY。如果尝试这样做,SQL Server 会显示错误信息;重复值必须先删除,才能为这些列创建唯一索引。CLUSTERED创建一个对象,其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的数据行。一个表或视图只允许同时有一个聚集索引。具有聚集索引的视图称为索引视图。必须先为视图创建唯一聚集索引,然后才能为该视图定义其它索引。在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。如果没有指定 CLUSTERED,则创建非聚集索引。说明  因为按照定义,聚集索引的叶级与其数据页相同,所以创建聚集索引时使用 ON filegroup 子句实际上会将表从创建该表时所用的文件移到新的文件组中。在特定的文件组上创建表或索引之前,应确认哪些文件组可用并且有足够的空间供索引使用。文件组的大小必须至少是整个表所需空间的 1.2 倍,这一点很重要。
    NONCLUSTERED创建一个指定表的逻辑排序的对象。对于非聚集索引,行的物理排序独立于索引排序。非聚集索引的叶级包含索引行。每个索引行均包含非聚集键值和一个或多个行定位器(指向包含该值的行)。如果表没有聚集索引,行定位器就是行的磁盘地址。如果表有聚集索引,行定位器就是该行的聚集索引键。参考一下,CASE WHEN判断是会影响,不过需要的话加索引 会提高的
      

  2.   

    create index i_test on DC_INOUTDOOR_HISDATA(INOUTTIME DESC)
      

  3.   

    使用case肯定也是浪费性能的。
    如果数据量确实太大的话,不烦考虑减轻一下数据库的压力,把这些case放在程序里去处理
    另外给INOUTTIME 加索引。
      

  4.   

    小弟,接触不多!弱弱再问问!对于表的时间字段,应该用哪种索引?
    create CLUSTERED index idxname on DC_INOUTDOOR_HISDATA (--这里填写哪些?)
      

  5.   

    那就用分区表吧,这样肯定不会慢,我又1000w纪录的分区表,一条select语句和普通表的io比较只有1%,cpu比较只有10%多
    http://blog.csdn.net/jinjazz/archive/2008/06/24/2582235.aspx
      

  6.   

    860W条记录虽然多,但是条件只查一天的,只要按日期索引,很快就会得到一天的记录集
    对这个很小的记录集做case,应该不影响效率的SELECT EMPLOYEEID, NAME, DOOR_NAME, PLACE_NAME,  CASE PASSWAY WHEN '0' THEN '关'  WHEN '1' THEN '开' END AS PASSWAY ,
    CASE ISINOUT WHEN '0' THEN '进门'  WHEN '1' THEN '出门' END AS ISINOUT ,
    CASE CARDTYPE WHEN '1' THEN '系统卡'  WHEN '2' THEN '警员卡' WHEN '3' THEN '普通卡' WHEN '4' THEN '无权卡' WHEN '5' THEN '非法卡' WHEN '6' THEN 
    '反胁迫卡' WHEN '10' THEN '超级卡'  WHEN '11' THEN '地区卡' WHEN '12' THEN '维护组卡' WHEN '13' THEN '工程人员卡' END AS CARDTYPE  ,
    INOUTTIME , PICFILENAME  
    FROM  (
    select * from DC_INOUTDOOR_HISDATA   
    WHERE  INOUTTIME >= '2009-08-26 00:00:00' 
    AND INOUTTIME <= '2009-08-26 23:59:59' 
    ) a
    ORDER BY INOUTTIME DESC
      

  7.   

    大虾们,再请教下,AND LEVELID = '110202'
    像这样继续添加条件,是在查询出时间范围后,还是之前?
    SQL执行顺序是怎么样的?
      

  8.   

    create index i_test on DC_INOUTDOOR_HISDATA(INOUTTIME DESC) 怎么创建聚集索引!我要SQL语句!手动操作会超时!!
    现在还是主键SERIALNO为聚集索引!