SQL Server中的索引及其并行
Tags: MAXDOPMSSQLSQL Server并行索引
索引基本操作
查看某个表/视图中存在的索引
1、语法:
exec sp_helpindex 表名/视图名
2、返回代码值:0(成功)或 1(失败)
3、结果值:
列名称 数据类型 说明
index_name sysname 索引名。
index_description varchar (210) 索引说明,其中包括索引所在的文件组。
index_keys nvarchar (2078) 对其生成索引的表或视图列。
创建索引
语法:
CREATE [索引类型] INDEX 索引名称
ON 表名(列名)
创建索引实例:
聚簇索引 create clustered index index_name on table_name (cloumn_name);
非聚簇索引 create nonclustered index index_name on table_name (cloumn_name);
唯一索引 create unique index index_name on table_name(cloumn_name);
删除索引
可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。
DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
其中,前两条语句是等价的,删除掉table_name中的索引index_name。
第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
示例
1 2 3 4 5 | exec sp_helpindex Fly_ERP_Materia_old --查看索引 create nonclustered index Coding on Fly_ERP_Materia_old (Coding) --创建索引 DROP INDEX Specifications_copy1 ON Fly_ERP_Materia_old --删除索引 |
索引并行
在运行 SQL Server Enterprise 或更高版本的多处理器系统上,索引语句可能会像其他查询那样,使用多个处理器 (CPU) 来执行与索引语句关联的扫描、排序和索引操作。 用于运行单个索引语句的 CPU 数由最大并行度服务器配置选项、当前工作负荷以及索引统计信息决定。 max degree of parallelism (MAXDOP)选项决定了执行并行计划时使用的最大处理器数。 如果 SQL Server 数据库引擎 检测到系统忙,索引操作的并行度将自动降低,然后再开始执行语句。 如果非分区索引的第一个键列包含有限数量的非重复值,或者每个非重复值的出现频率变化较大, 数据库引擎 也可能会降低并行度。
限制和局限
查询优化器使用的处理器数量通常能够提供最佳的性能。 但是,有些操作(如创建、重新生成或删除很大的索引)占用大量资源,在索引操作期间会造成没有足够的资源供其他应用程序和数据库操作使用。 出现此问题时,您可以通过限制用于索引操作的处理器数,手动配置用于运行索引语句的最大处理器数。
MAXDOP 索引选项只为指定此选项的查询覆盖 max degree of parallelism 配置选项。 下表列出了可为 max degree of parallelism 配置选项和 MAXDOP 索引选项指定的有效整数值。
值 说明 0 指定服务器根据当前系统工作负荷确定所使用的 CPU 数目。 这是默认值,还是推荐设置。 1 取消生成并行计划。 操作将以串行方式执行。 2-64 将处理器的数量限制为指定的值。 根据当前工作负荷,可能使用较少的处理器。 如果指定的值大于可用的 CPU 数量,将使用实际可用的 CPU 数量。 并行索引执行和 MAXDOP 索引选项适用于以下 Transact-SQL 语句:
不能在
ALTER INDEX (...) REORGANIZE
语句中指定 MAXDOP 索引选项。如果查询优化器将并行度应用于生成操作,则需要排序的已分区索引操作的内存需求可能会很大。 并行度越高,内存需求就越大。 有关详细信息,请参阅 Partitioned Tables and Indexes。
SQL使用
1 2 3 4 5 6 7 8 | ALTER INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor REBUILD WITH (MAXDOP=8); GO CREATE INDEX IX_ProductVendor_NewVendorID ON Purchasing.ProductVendor (BusinessEntityID) WITH (MAXDOP=8); GO |