创建索引
确定了索引设计后,便可以在数据库的表上创建索引。Microsoft® SQL Server™ 2000 自动创建唯一索引,以强制实施 PRIMARY KEY 和 UNIQUE 约束的唯一性要求。除非表中已存在聚集索引,或者显式指定了非聚集索引,否则将会创建一个唯一的聚集索引,以实施 PRIMARY KEY 约束。除非显式指定了聚集索引,否则,默认情况下创建唯一的非聚集索引以强制 UNIQUE 约束。如果需要创建不依赖于约束的索引,可以使用 CREATE INDEX 语句。默认情况下,如果未指定聚集选项,将创建非聚集索引。创建索引时须考虑的其它事项包括: 只有表的所有者可以在同一个表中创建索引。
每个表中只能创建一个聚集索引。
每个表可以创建的非聚集索引最多为 249 个(包括 PRIMARY KEY 或 UNIQUE 约束创建的任何索引)。
包含索引的所有长度固定列的最大大小为 900 字节。例如,不可以在定义为 char(300)、char(300) 和 char (301) 的三个列上创建单个索引,因为总宽度超过了 900 字节。
包含同一索引的列的最大数目为 16。 
在使用 CREATE INDEX 语句创建索引时,必须指定索引、表以及索引所应用的列的名称。作为 PRIMARY KEY 或 UNIQUE 约束的一部分或使用 SQL Server 企业管理器创建的新索引,会根据数据库表的名称,自动获得系统定义的名称。如果在一个表上创建多个索引,这些索引的名称被追加 _1、_2 等。必要时可对索引重新命名。说明  当前数据库正在备份时不能在其上创建索引。
如果在具有多个辅助索引的表上创建聚集索引,则必须重建所有辅助索引,使它们包含聚集键值而非行标识符 (RID)。同样,如果在具有多个非聚集索引的表上删除聚集索引,所有非聚集索引将作为 DROP 操作的一部分重建。这在大型表上会花很长时间。在大型表上生成索引的首选方法是以聚集索引开始,然后生成非聚集索引。除去所有索引时,首先除去非聚集索引,最后除去聚集索引。这样,就无需重建索引。聚集索引
在创建聚集索引时,将会对表进行复制,对表中的数据进行排序,然后删除原始的表。因此,数据库上必须有足够的空闲空间,以容纳数据复本。默认情况下,表中的数据在创建索引时排序。但是,如果因聚集索引已经存在,且正在使用同一名称和列重新创建,而数据已经排序,则会重建索引,而不是从头创建该索引,以自动跳过排序操作。重建操作会检查行是否在生成索引时进行了排序。如果有任何行排序不正确,即会取消操作,不创建索引。唯一索引
创建唯一索引可以确保任何生成重复键值的尝试都会失败。如果创建的单个查询导致添加了重复的和非重复的键值,SQL Server 会拒绝所有的行,包括非重复的键值。例如,如果一个单个的插入语句从表 A 检索了 20 行,然后将它们插入到表 B 中,而这些行中有 10 行包含重复键值,则默认情况下所有 20 行都将被拒绝。不过,在创建该索引时可以指定 IGNORE_DUP_KEY 子句,使得只有重复的键值才被拒绝,而非重复的键值将被添加。在上面的例子中,将只会拒绝 10 个重复的键值,其它 10 个非重复的键值将被添加到表 B 中。如果有任何重复的键值,便不能创建唯一索引。例如,如果要在 a 列和 b 列上创建唯一的组合索引,而表中有两行的 a 列同为值 1,b 列同为值 2,则无法创建唯一索引。

解决方案 »

  1.   

    下表说明在 Microsoft SQL Server 数据库中定义的,或在 Transact-SQL 语句中引用的各种对象的最大值(数量或大小)。下表不包含 Microsoft® SQL Server 2000™ Windows® CE 版。  最大值(数量或大小) 
    对象 SQL Server 7.0 SQL Server 2000 
    批处理大小 65,536 * 网络数据包大小1 65,536 * 网络数据包大小1 
    每个短字符串列的字节数 8,000 8,000 
    每个 text、ntext、或 image 列的字节数 2 GB-2 2 GB-2 
    每个 GROUP BY、ORDER BY的字节数 8,060   
    每个索引中的字节数 900 9002 
    每个外键的字节数 900 900 
    每个主键的字节数 900 900 
    每行字节数 8,060 8,060 
    存储过程源文本中的字节数 批处理大小之较小者或者 250 MB 批处理大小之较小者或者 250 MB 
    每个数据表的聚集索引数 1 1 
    GROUP BY、ORDER BY 中的列数 只受字节数限制  
    GROUP BY WITH CUBE 或 WITH ROLLUP 语句中的列数或表达式数目 10  
    每个索引的列数 16 16 
    每个外键的列数 16 16 
    每个主键的列数 16 16 
    每个基础数据表的列数 1,024 1,024 
    每个SELECT 语句的列数 4,096 4,096 
    每个INSERT 语句的列数 1,024 1,024 
    每个客户端的连接个数 已配置连接的最大值 已配置连接的最大值 
    数据库大小 1,048,516 TB3 1,048,516 TB3 
    每个 SQL Server 实例的数据库个数 32,767 32,767 
    每个数据库的文件组个数 256 256 
    每个数据库的文件个数 32,767 32,767 
    文件大小(数据) 32 TB 32 TB 
    文件大小(日志) 4 TB 32 TB 
    每个数据表的外键表引用 253 253 
    标识符长度(以字符计) 128 128 
    每台计算机的实例数 暂缺 16 
    包含 SQL 语句的字符串长度(批处理大小) 65,536 * 网络数据包大小1 65,536 * 网络数据包大小1 
    每个连接的锁数 每个服务器的最大锁数 每个服务器的最大锁数 
    每个 SQL Server 实例的锁数 2,147,483,647(静态)
    SQL Server 40% 的内存(动态) 2,147,483,647(静态)
    SQL Server 40% 的内存(动态) 
    嵌套存储过程层数 32 32 
    嵌套子查询 32 32 
    嵌套触发器层数 32 32 
    每个数据表的非聚集索引个数 249 249 
    SQL Server 实例中同时打开的对象个数4 2,147,483,647(或可用内存) 2,147,483,647(或可用内存) 
    每个数据库中的对象个数 2,147,483,6474 2,147,483,6474 
    每个存储过程的参数个数 1,024 1,024 
    每个数据表的 REFERENCE 个数 253 253 
    每个数据表的行数 受可用存储资源限制 受可用存储资源限制 
    每个数据库的数据表个数 受数据库中的对象个数限制4 受数据库中的对象个数限制4 
    每个 SELECT 语句的数据表个数 256 256 
    每个数据表的触发器个数 受数据库中的对象个数限制4 受数据库中的对象个数限制4 
    每个数据表的 UNIQUE 索引个数或约束个数 249个非聚集索引和 1 个聚集索引 249个非聚集索引和 1 个聚集索引 
    1 网络数据包大小是表格格式数据方案 (TDS) 数据包的大小,该数据包用于应用程序和关系数据库引擎之间的通讯。默认的数据包大小为 4 KB,由 network packet size 配置选项控制。
    2 在 SQL Server 2000 中,任何键的最大字节数不能超过 900。可以使用可变长度的列来定义键,只要在这种列中不插入数据超过 900 字节的行,其最大大小就可以在 900 以上。有关更多信息,请参见索引键的最大值。
    3 当使用 SQL Server 2000 Desktop Engine 或 Microsoft 数据引擎 (MSDE) 1.0 时,数据库的大小不能超过 2 GB。
    4数据库对象包括所有的表、视图、存储过程、扩展存储过程、触发器、规则、默认值及约束。一个数据库中所有对象的总数不得超过 2,147,483,647。