不好意思,分不多了,所以两个问题一起问了。。
一个是关于主键的,我有个1000W的表,唯一标示是个不到30长度的字符串,创建数据库的时候只在这个字段建了一个主键。
使用 select count(*) from mytable 非常慢,运行了将近两分钟才有结果。请问聚集索引也是全表扫描出这个结果吗?另外,最近学习索引方面问题,关于数据页方面的问题
请问有没有语句或者函数能够知道某一行数据的的所有长度??
因为我的字段比较多,所以我觉得用 select column1+column2+column3....这样太笨了。再无耻的问最后一个问题吧
我再想,索引B树原理,比如一个语句select * from mytable where namcolumn like '中国%'索引找到相关的信息后通过ROWID,通过B树的方式找到对应的记录,我的疑问是,那么它通过中国找到对应记录这个过程是怎么样实现的呢?它应该有个巨大的关键词表,这个表在查询的时候难道也是扫描的吗?

解决方案 »

  1.   

    select count(*) from mytable   这个用不到索引,所以跟聚集啊,什么东西的没有关系-----------------------------
    某一行数据的的所有长度??
    你指的长度是什么?
    -----------------------------相当于扫描这个关键词表,然后再相关信息吧,我是这么认为的
      

  2.   

    关于count(*)的问题:
    select count(主鍵列或索引列) as cont from table--或者:
    select rowcnt from sysindexes where id=object_id('表名')
      

  3.   

    select count(*) from mytable
    --这个执行的是聚集索引扫描--某一行数据的长度
    select len(column1) from tbexec help 'tb'select * from mytable where namcolumn like '中国%'
    --如果namcolumn是聚集索引,这个会执行聚集索引查找。聚集索引的叶级是数据本身。而非叶级存放的是索引键即:namcolumn,查找的时候会按照索引键来查找
      

  4.   


    declare @table table 
    (id int,col varchar(10),col1 varchar(10),col2 varchar(10))insert into @table
    select 3,'a','aa','d' union all
    select 4,'bh','ddn','mm' union all
    select 7,'c','msms','mk'select id,
    [len] =len(id)+len(col)+len(col1)+len(col2)
    from @table /*
    id          len
    ----------- -----------
    3           5
    4           8
    7           8
    */--如果你觉得上面的慢,就用下面的。--表名
    declare @tablename varchar(40)
    set  @tablename='rymd'--设置一个字段名作为标识
    declare @id varchar(10)
    set @id='name'declare @sql varchar(300)
    declare @i varchar(200)
    select @i=
    (select '+len('+dbo.syscolumns.name+')' from  dbo.syscolumns 
    inner join dbo.sysobjects 
    on dbo.syscolumns.id = dbo.sysobjects.id   
    where dbo.sysobjects.name = @tablename 
    for xml path('')) 
    set @sql= 'select '+@id+','+substring(@i,2,len(@i)-1)+' as [len] from '+@tablename
    exec(@sql)
      

  5.   

    刚才我用事实证明了一下 select count 跟索引有关系做了聚集索引 select count(索引列) from table 使用了 2分钟
    做了非聚集索引 select count(索引列) from table 不到1秒
    索引列为同一列 ,真是奇怪!!!
      

  6.   

    聚集索引扫描。扫描聚集索引叶级,叶级存放的是全部数据,实际上相当于扫描这个表了.
    非聚集索引扫描。非聚集索引叶级存放的索引键和一个指针,不会执行loopup操作。
    个人觉得应该和这个有关.
      

  7.   

    第一个问题:请问聚集索引也是全表扫描出这个结果吗?
    答:不是,聚焦索引的实现是通过将数据模块化实现的!其原理类似于汉语字典的按拼音查询字母一样!比如说你要查询安(an)这个字,那么在按聚焦索引查询的时候系统只会查询到以a字母开头的那段数据中!一旦首字母发生改变(b、c、d.....)便停止查询!所以不是安全表扫描出的结果!
    第二个问题: 请问有没有语句或者函数能够知道某一行数据的的所有长度?
    确切的说到我目前遇到的函数中是没有这样的统计一行数据的长度的函数!但是有统计一列数据长度的函数,
    COL_LENGTH 
    返回列的定义长度(以字节为单位)。
    语法
    COL_LENGTH ( 'table' , 'column' ) 
    附带再给你介绍一个函数
    COL_NAME
    返回数据库列的名称,该列具有相应的表标识号和列标识号。语法
    COL_NAME ( table_id , column_id )第三个问题:索引找到相关的信息后通过ROWID,通过B树的方式找到对应的记录,我的疑问是,那么它通过中国找到对应记录这个过程是怎么样实现的呢?它应该有个巨大的关键词表,这个表在查询的时候难道也是扫描的吗?
    答:前边我们说过索引的实现聚焦原理(没有说非聚焦的)!那么在这里我们就说聚焦索引!首先你为一个数据列创建索引之后那么每次插入数据、修改数据、删除数据对应的索引列都会重新分组!那么这样的话实现的原理就和前边我们说的聚焦索引一样了!至于说非聚焦索引就和咱们的笔画查字原理一样!
      

  8.   


    索引不能用的几种情况,看看。
                   a 
                ab  ad 
             abc     adm 
          abcd        admn 
    1. not 用不了索引 
    2. <> 用不了索引 
    3. 与null值比较用不了索引 
    4. like ,  select * from emp where ename like 'luo%' --能用上 
               select * from emp where ename like '%dai' --不能 
    5. 查询字段使用了函数 
       select * from emp where to_char(reg_date,'yyyy')='2009' 
       当然,还包括了||连接符,对查询字段做运算等,如: where age+1=30    解决办法,使用FBI(基于函数的索引) 6. 多个字段建立组合索引 
       
       如对班号,姓名建立索引,并且班号在前 
      where class_no='200105302'  and stu_name= '罗某'  --可以用索引 
      where class_no='200105302'                        --可以 
      where stu_name='罗某'                             --不可以 
      原因和like类似 7. 注意数据类型隐式转换的问题 
      如service_type字段,数据库表里varchar2类型,但是像下面这样写 
      where service_type=82  --用不了,隐式类型转换