declare @a int
select @a=count(*) as num from cp307

解决方案 »

  1.   

    因为sql server查询优化器这时候是扫描的索引,不在是表了.
      

  2.   

    从系统的表里面查询
    select * from sysobjects S inner join sysindexes I
    on S.[id] = I.[id] 
    where 
    I.[name] = 表名 and S.xtype = 'u'
      

  3.   

    ----不好意思,漏了一点,是里面的rowcnt
    从系统的表里面查询
    select rowcnt from sysobjects S inner join sysindexes I
    on S.[id] = I.[id] 
    where 
    I.[name] = 表名 and S.xtype = 'u'
      

  4.   

    呵呵  
    楼上的方法好
    不过 只适用与MSSQL lol
      

  5.   

    ----不好意思,漏了一点,是里面的rowcnt
    从系统的表里面查询
    select rowcnt from sysobjects S inner join sysindexes I
    on S.[id] = I.[id] 
    where 
    I.[name] = 表名 and S.xtype = 'u'
    这个得到的真的是表的真实的行数吗?
      

  6.   

    就是这样,前面我还关联了sysobjects ,不关联也是可以的,其实就存在sysindexes表格里面
    select rows from sysindexes where id = object_id(表名) and indid in (0,1) 索引分为2种,聚簇索引(Clustered)和菲聚簇索引(Non-Clustered)两种,皆使用B-tree的方式来排列索引页。聚簇索引(Clustered)会将设为索引的栏位依序排列,并且也依照排好的顺序将纪录存储在资料表中。select count(*) as c from tableA 。然而对于记录数巨大的表,上述做法将会非常耗时。在纪录很多时候很费时,如果在表的某个字段上做聚簇索引,第一次执行该语句的时间和没有索引的时间差不多,之后执行上述语句,速度很快,在1秒中以内,但当表的记录数发生较大变化后,再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的,对于数量巨大的表,如果需要经常增删操作,建聚簇索引是一个很不明智的做法,将会极大的影响增删的速度,因为聚簇索引需要将排序好的纪录实际存储在资料表中。你只是偶尔会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。因此为了偶尔的动作建立一个索引,那么非常不明智。--摘贴~
    在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录,该记录中的rows 字段会定时记录表的记录总数。下面是sysindexes 表的相关记录的含义: 
    列名      数据类型         描述
    id            int        ID(如果 indid = 0 或255)。否则为索引所属表的ID
    Indid       smallint     索引ID:
                             0=表
                             1=聚簇索引
                            >1=非聚簇索引
                           255=具有text或image数据的表条目。
    rows          int      基于indid=0 和 indid=1地数据级行数,该值对 indid>1重 复。如果indid=255,rows设置为0。
      
      
    当表没有聚簇索引时,Indid = 0 否则为 1。
      

  7.   

    回复人: summerICEREDTEA(过年前争取上星 :)) ( ) 信誉:99  2005-07-19 19:41:00  得分: 0  
     
     
       呵呵  
    楼上的方法好
    不过 只适用与MSSQL lol
      
    可是,楼主不是问MS SQL 吗?
    如果是PL/SQL 好像有个什么rowid~
     
      

  8.   

    :)
    -。-
    我不懂 PL/SQL  
    MSSQL 都学的不行
      

  9.   

    summerICEREDTEA,你太谦虚了~如果你学习PL/SQL ,那么你会觉得很有趣,PL/SQL 可是做的更加丰富
    bugchen888(臭虫) 问的好,我忘了说另外一点:
      方法select rows from sysindexes where id = object_id(表名) and indid in (0,1)得到的表的总记录数不是一个精确值,原因是MS SQL 并不是实时更新该字段的值,而是定时更新,该值和精确值一般误差不大,如果你希望快速的粗略估算表的大小,建议你采用该方法。如果你希望得到精确值,那么请在执行上述语句前执行DBCC UPDATEUSAGE(DatabaseName,[TABLENAME]) WITH ROW_COUNTS 强制更新该字段的值,但这样第一次更新时会耗费大量的时间,这样做的效果和建有聚簇索引的表 select count (*) 效果相差不大,所以如果希望相对快速地得到精确的表的记录总数,那么有两种选择,建聚簇索引或者先DBCC 再使用上述方法~
    我一般只是备份时候要大概估计够不够,所以我就是不DBCC,我只要select rows ...大概看看就执行备份程式