⑴ 你了解sql的索引原理吗
索引是为检索而存在的,就是说索引并不是一个表必须的。表索引由多个页面组成,这些页面一起组成了一个树形结构,轮铅即我们通常说的B树,首先来看下表索引的组成部分:
根极节点,root,它指向另外两个页,把一个表的记录从逻辑上分成非叶级节点Non-Leaf
Level(枝),它指向了更加小的叶级节点Leaf
Level(叶)。
根节点、非叶级节点和叶级节点都位于索引页中,统称为索引叶节点,属于索引页的范筹。这些"枝"、"叶"最终指向数据页Page。根级节点和叶级节点之间的叶又叫数据中间页。根节点对应了sysindexes表的Root字段,记载了非叶级节点的物理位置(即指针);非叶级节点位于根节点和叶节点之间,记载了指向叶级节点的指针;而叶级节点则最终指向数据页,这就是最后的B树。
数据库是怎样薯升访问表数据的:
第一:没有创建任何索引的表。
这种表我们称为堆表,因为所有的数据页都是无序的,杂乱无章的,在查询数据时,需要一条一条记录查询,有时第一条记录就能找到,最坏的情况是在最后一条记录中查找到,但是千万不要认为SQL此时查找到数据后会当成结果立即返回,SQL即使查找到了记录,也会将所有数据遍历一次,这能从最终的执行计划中得知,就是平时说的表扫描,对于没有索引的表也能查询,就是腊手好效率会特别低,如果数据量稍大的话。
问题:SQL是如何得知表没有索引呢?
SQL在接到查询请求的时候,会分析sysindexes表中索引标志符(INDID:
Index
ID)的字段的值,如果该值为0,表示这是一张数据表而不是索引表,SQL就会使用sysindexes表的另一个字段FirstIAM值中找到该表的IAM
页链也就是所有数据页集合。至于什么是IAM,大家可以网上搜索下。
第二:访问创建有非聚集索引的表。
⑵ SQL附加数据库时提示"错误602;未能在sysindexes中找到数据库ID7中对象ID1的索引ID1对应的行。"
1.新建一个同名的数据库(数据文件与原来的要一致)2.再停掉sqlserver(注意不要分离数据库)3.用原数据库的数据文件覆盖掉这个新建的数据库4.再重启sqlserver5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决法是,利用数据库的脚本创建一个新的数据库,并将数据导进去就行了.USEMASTERGOSP_CONFIGURE'ALLOWUPDATES',=32768WHERENAME='置疑的数据库名'Gosp_dboption'置疑的数据库名','singleuser','true'GoDBCCCHECKDB('置疑的数据库名')Goupdatesysdatabasessetstatus=28wherename='置疑的数据库名'Gosp_configure'allowupdates',0reconfigurewithoverrideGosp_dboption'置疑的数据库名','singleuser','false'