zl程序教程

您现在的位置是:首页 >  后端

当前栏目

《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.16 创建索引

2023-09-11 14:17:44 时间

本节书摘来自异步社区出版社《PowerShell V3—SQL Server 2012数据库自动化运维权威指南》一书中的第2章,第2.16节,作者:【加拿大】Donabel Santos,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.16 创建索引

本方案描述了如何用PowerShell和SMO创建一个包含列的非聚集索引。

2.16.1 准备

我们将使用AdventureWorks2008R2数据库的Person.Person表。我们将在FirstName和LastName上创建一个非聚集索引,包含MiddleName列。这个任务的等价T-SQL语句为:

CREATE NONCLUSTERED INDEX [idxLastNameFirstName] 

ON [Person].[Person]

 [LastName] ASC,

 [FirstName] ASC

INCLUDE ( [MiddleName]) 

2.16.2 如何做…

1.通过“Start | Accessories | Windows PowerShell | Windows PowerShell ISE”打开PowerShell控制台。

2.导入SQLPS模块,创建一个新的SMO服务器对象。

#import SQL Server module

Import-Module SQLPS –DisableNameChecking

#replace this with your instance name

$instanceName = "KERRIGAN"

$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server

-ArgumentList $instanceName

3.添加如下脚本并运行。

$dbName = "AdventureWorks2008R2"

$db = $server.Databases[$dbName]

$tableName = "Person"

$schemaName = "Person" 

$table = $db.Tables | 

 Where Schema -Like "$schemaName" |

Where Name -Like "$tableName"

$indexName = "idxLastNameFirstName"

$index = $table.Indexes[$indexName]

#if stored procedure exists, drop it

if ($index)

 $index.Drop()

$index = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Index

-ArgumentList $table, $indexName

#first index column, by default sorted ascending

$idxCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn

-ArgumentList $index, "LastName", $false 

$index.IndexedColumns.Add($idxCol1)

#second index column, by default sorted ascending

$idxCol2 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn

-ArgumentList $index, "FirstName", $false 

$index.IndexedColumns.Add($idxCol2)

#included column

$inclCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn 

-ArgumentList $index, "MiddleName"

$inclCol1.IsIncluded = $true

$index.IndexedColumns.Add($inclCol1)

#Set the index properties. 

None - no constraint

DriPrimaryKey - primary key

DriUniqueKey - unique constraint

$index.IndexKeyType = [Microsoft.SqlServer.Management.SMO.IndexKeyType]::None 

$index.IsClustered = $false

$index.FillFactor = 70

#Create the index on the instance of SQL Server. 

$index.Create()

4.检查这个索引已经创建。打开SSMS。

image

2.16.3 如何实现…

创建索引的第一步是创建一个SMO index对象,它需要表/视图的句柄和索引名称。

$index = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Index –ArgumentList

$table, $indexName

下一步是使用Microsoft.SqlServer.Management.SMO.Index类的IndexedColumn属性设置所有的索引列。

#first index column

$idxCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn

-ArgumentList $index, "LastName", $false; #sort asc

$index.IndexedColumns.Add($idxCol1)

#second index column

$idxCol2 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn

-ArgumentList $index, "FirstName", $false; #sort asc

$index.IndexedColumns.Add($idxCol2)

你也可以添加包含列,换句话说,包含列打上了索引的“标签”,但不是索引列的一部分:

#i```javascript

ncluded column

$inclCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn

-ArgumentList $index, "MiddleName"

$inclCol1.IsIncluded = $true

$index.IndexedColumns.Add($inclCol1)

索引的类型可以指定为Microsoft.SqlServer.Management.SMO.IndexedColumn类的IndexKey Type属性,它接受3个可能的值:

None:不唯一
DriPrimaryKey:主键
DriUniqueKey:唯一
您也可以设置额外的属性,包括FillFactor、是否为聚集索引。

$index.IndexKeyType = [Microsoft.SqlServer.Management.SMO.IndexKeyType]::None 

$index.IsClustered = $false

$index.FillFactor = 70

当设置好所有的属性后,调用SMO index对象的Create方法。

#Create the index on the instance of SQL Server. 

$index.Create()

2.16.4 更多…

SMO索引对象也支持不同类型的索引。

image

关于索引选项的更多信息,查看MSDN文档关于SMO索引部分。

2.16.5 请参阅…

创建表方案


以小博大外小内大,Db数据库SQL优化之小数据驱动大数据 SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据。其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接、转移、或者合并,这些操作必须得有个数据集作为“带头”大哥,即驱动数据,而这个驱动数据最好是数据量最小的那一个。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载