不好意思,分不多了,所以两个问题一起问了。。
一个是关于主键的,我有个1000W的表,唯一标示是个不到30长度的字符串,创建数据库的时候只在这个字段建了一个主键。
使用 select count(*) from mytable 非常慢,运行了将近两分钟才有结果。请问聚集索引也是全表扫描出这个结果吗?另外,最近学习索引方面问题,关于数据页方面的问题
请问有没有语句或者函数能够知道某一行数据的的所有长度??
因为我的字段比较多,所以我觉得用 select column1+column2+column3....这样太笨了。再无耻的问最后一个问题吧
我再想,索引B树原理,比如一个语句select * from mytable where namcolumn like '中国%'索引找到相关的信息后通过ROWID,通过B树的方式找到对应的记录,我的疑问是,那么它通过中国找到对应记录这个过程是怎么样实现的呢?它应该有个巨大的关键词表,这个表在查询的时候难道也是扫描的吗?
一个是关于主键的,我有个1000W的表,唯一标示是个不到30长度的字符串,创建数据库的时候只在这个字段建了一个主键。
使用 select count(*) from mytable 非常慢,运行了将近两分钟才有结果。请问聚集索引也是全表扫描出这个结果吗?另外,最近学习索引方面问题,关于数据页方面的问题
请问有没有语句或者函数能够知道某一行数据的的所有长度??
因为我的字段比较多,所以我觉得用 select column1+column2+column3....这样太笨了。再无耻的问最后一个问题吧
我再想,索引B树原理,比如一个语句select * from mytable where namcolumn like '中国%'索引找到相关的信息后通过ROWID,通过B树的方式找到对应的记录,我的疑问是,那么它通过中国找到对应记录这个过程是怎么样实现的呢?它应该有个巨大的关键词表,这个表在查询的时候难道也是扫描的吗?
解决方案 »
- MY SQL数据库
- 项目的最后一个问题了,大家帮我
- sqlserver代理在对象资源管理器中没有出来
- 此sql語句怎么寫?
- 求关于数据库的英文翻译资料(中英文对照),毕业设计开题报告用!!急!!!!!
- 怎样把一个datastore里面的所有值付给一个数据窗口
- 求助:如何用代碼實現 Import Data的功能,或是使用命令行實現。
- 单独安装SqlServer2005无法连接上去,但装上SqlServer2000后2005就可以登录上去了?
- SQL SERVER 2000 将系统内存几乎全部吃掉???
- 如何用ado实现多个用户操作同一个access数据库,并进行对表的锁定(急需帮助,答对一定给分,各位高手请进)
- 示例数据库Northwind,子查询和inner查询
- 求一个数据表的结构,关于旅游线路和景点之间关系的结构!
某一行数据的的所有长度??
你指的长度是什么?
-----------------------------相当于扫描这个关键词表,然后再相关信息吧,我是这么认为的
select count(主鍵列或索引列) as cont from table--或者:
select rowcnt from sysindexes where id=object_id('表名')
--这个执行的是聚集索引扫描--某一行数据的长度
select len(column1) from tbexec help 'tb'select * from mytable where namcolumn like '中国%'
--如果namcolumn是聚集索引,这个会执行聚集索引查找。聚集索引的叶级是数据本身。而非叶级存放的是索引键即:namcolumn,查找的时候会按照索引键来查找
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)
做了非聚集索引 select count(索引列) from table 不到1秒
索引列为同一列 ,真是奇怪!!!
非聚集索引扫描。非聚集索引叶级存放的索引键和一个指针,不会执行loopup操作。
个人觉得应该和这个有关.
答:不是,聚焦索引的实现是通过将数据模块化实现的!其原理类似于汉语字典的按拼音查询字母一样!比如说你要查询安(an)这个字,那么在按聚焦索引查询的时候系统只会查询到以a字母开头的那段数据中!一旦首字母发生改变(b、c、d.....)便停止查询!所以不是安全表扫描出的结果!
第二个问题: 请问有没有语句或者函数能够知道某一行数据的的所有长度?
确切的说到我目前遇到的函数中是没有这样的统计一行数据的长度的函数!但是有统计一列数据长度的函数,
COL_LENGTH
返回列的定义长度(以字节为单位)。
语法
COL_LENGTH ( 'table' , 'column' )
附带再给你介绍一个函数
COL_NAME
返回数据库列的名称,该列具有相应的表标识号和列标识号。语法
COL_NAME ( table_id , column_id )第三个问题:索引找到相关的信息后通过ROWID,通过B树的方式找到对应的记录,我的疑问是,那么它通过中国找到对应记录这个过程是怎么样实现的呢?它应该有个巨大的关键词表,这个表在查询的时候难道也是扫描的吗?
答:前边我们说过索引的实现聚焦原理(没有说非聚焦的)!那么在这里我们就说聚焦索引!首先你为一个数据列创建索引之后那么每次插入数据、修改数据、删除数据对应的索引列都会重新分组!那么这样的话实现的原理就和前边我们说的聚焦索引一样了!至于说非聚焦索引就和咱们的笔画查字原理一样!
索引不能用的几种情况,看看。
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 --用不了,隐式类型转换