📄 subject_43535.htm
字号:
<p>
序号:43535 发表者:火车头 发表日期:2003-06-12 01:11:06
<br>主题:谁能把索引描述一下吗?
<br>内容:听说索引能够加快表的存储,但也不绝对,常听到索引,但具体是什么,怎么个索引法都不清楚,请问哪位能具体描述一吗,谢谢。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:晓飞 回复日期:2003-06-12 02:44:57
<br>内容:创建索引<BR>确定了索引设计后,便可以在数据库的表上创建索引。<BR><BR>Microsoft&reg; SQL Server&#8482; 2000 自动创建唯一索引,以强制实施 PRIMARY KEY 和 UNIQUE 约束的唯一性要求。除非表中已存在聚集索引,或者显式指定了非聚集索引,否则将会创建一个唯一的聚集索引,以实施 PRIMARY KEY 约束。除非显式指定了聚集索引,否则,默认情况下创建唯一的非聚集索引以强制 UNIQUE 约束。<BR><BR>如果需要创建不依赖于约束的索引,可以使用 CREATE INDEX 语句。默认情况下,如果未指定聚集选项,将创建非聚集索引。<BR><BR>创建索引时须考虑的其它事项包括: <BR><BR>只有表的所有者可以在同一个表中创建索引。<BR><BR><BR>每个表中只能创建一个聚集索引。<BR><BR><BR>每个表可以创建的非聚集索引最多为 249 个(包括 PRIMARY KEY 或 UNIQUE 约束创建的任何索引)。<BR><BR><BR>包含索引的所有长度固定列的最大大小为 900 字节。例如,不可以在定义为 char(300)、char(300) 和 char (301) 的三个列上创建单个索引,因为总宽度超过了 900 字节。<BR><BR><BR>包含同一索引的列的最大数目为 16。 <BR>在使用 CREATE INDEX 语句创建索引时,必须指定索引、表以及索引所应用的列的名称。作为 PRIMARY KEY 或 UNIQUE 约束的一部分或使用 SQL Server 企业管理器创建的新索引,会根据数据库表的名称,自动获得系统定义的名称。如果在一个表上创建多个索引,这些索引的名称被追加 _1、_2 等。必要时可对索引重新命名。<BR><BR><BR><BR>说明 当前数据库正在备份时不能在其上创建索引。<BR><BR><BR>如果在具有多个辅助索引的表上创建聚集索引,则必须重建所有辅助索引,使它们包含聚集键值而非行标识符 (RID)。同样,如果在具有多个非聚集索引的表上删除聚集索引,所有非聚集索引将作为 DROP 操作的一部分重建。这在大型表上会花很长时间。<BR><BR>在大型表上生成索引的首选方法是以聚集索引开始,然后生成非聚集索引。除去所有索引时,首先除去非聚集索引,最后除去聚集索引。这样,就无需重建索引。<BR><BR>聚集索引<BR>在创建聚集索引时,将会对表进行复制,对表中的数据进行排序,然后删除原始的表。因此,数据库上必须有足够的空闲空间,以容纳数据复本。<BR><BR>默认情况下,表中的数据在创建索引时排序。但是,如果因聚集索引已经存在,且正在使用同一名称和列重新创建,而数据已经排序,则会重建索引,而不是从头创建该索引,以自动跳过排序操作。重建操作会检查行是否在生成索引时进行了排序。如果有任何行排序不正确,即会取消操作,不创建索引。<BR><BR>唯一索引<BR>创建唯一索引可以确保任何生成重复键值的尝试都会失败。如果创建的单个查询导致添加了重复的和非重复的键值,SQL Server 会拒绝所有的行,包括非重复的键值。例如,如果一个单个的插入语句从表 A 检索了 20 行,然后将它们插入到表 B 中,而这些行中有 10 行包含重复键值,则默认情况下所有 20 行都将被拒绝。不过,在创建该索引时可以指定 IGNORE_DUP_KEY 子句,使得只有重复的键值才被拒绝,而非重复的键值将被添加。在上面的例子中,将只会拒绝 10 个重复的键值,其它 10 个非重复的键值将被添加到表 B 中。<BR><BR>如果有任何重复的键值,便不能创建唯一索引。例如,如果要在 a 列和 b 列上创建唯一的组合索引,而表中有两行的 a 列同为值 1,b 列同为值 2,则无法创建唯一索引。<BR><BR><BR><BR>说明 如果一个单个的列中有不止一行包含 NULL,则无法在该列上创建唯一索引。同样,如果列的组合中有多行包含 NULL 值,则不能在多个列上创建唯一索引。在创建索引时,这些被视为重复的值。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:火车头 回复日期:2003-06-12 02:58:09
<br>内容:请再问一下,簇集索引是不是聚集索引??
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:阿志 回复日期:2003-06-12 08:37:49
<br>内容:<BR>考虑到将来的数据库操作<BR><BR>经常update set的字段,不要索引,一边提高修改的速度<BR><BR>经常select ...where 在where后面的字段需要索引,以便提高查询速度<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:火车头 回复日期:2003-06-12 11:00:59
<br>内容:谢谢阿志,,又学到了一点经验,,<BR><BR><BR><BR><BR>//哈……
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -