如何优化PowerShell SMO查询(where-object太慢)?

时间:2014-01-30 09:59:29

标签: sql-server powershell smo

A。是否有可能获得ps-script的结果:

$ss=New-Object Microsoft.SqlServer.Management.Smo.Server 'MyServer';
$ss.Databases[$db].Tables |  Where-Object  {$_.IsIndexable -eq $true}

具有与select

相当的性能
SELECT * FROM sys.Tables WHERE OBJECTPROPERTY(object_id, 'IsIndexable')=1

当然,一种方法是运行select(来自ps),然后通过名称(或object_id)实例化一堆smo.table,如:

$d = $ss.Databases[$db]
$r = $d.ExecuteWithResults('SELECT object_id FROM sys.tables WHERE OBJECTPROPERTY(object_id, ''IsIndexable'')=1');
$t = @()
foreach ($i in $r.Tables[0].Rows) {$t+=$d.Tables.ItemById($i["object_id"])}

但这看起来不是“应该如何”..

B。如何提高索引过滤器的性能?

$i=$d.Tables.Indexes | where {$_.HasFilter -eq $true};

当然,同样的结果可以实现快速,但是sql:

$d = $ss.Databases[$db]
$r = $d.ExecuteWithResults('SELECT object_id, Name FROM sys.indexes WHERE has_filter=1 ORDER BY object_id, Name');
$t = @()
foreach ($i in $r.Tables[0].Rows) {$t+=$d.Tables.ItemById($i["object_id"]).Indexes[$i["Name"]]}

但我认为应该有更好的解决方案..

1 个答案:

答案 0 :(得分:2)

加速代码的一件事是告诉服务器对象您关心表上的IsIndexable属性,因此当您获取表对象时,它应该获取该属性。您可以按照this BOL article上的流程进行操作,但归结为:

$ss=New-Object Microsoft.SqlServer.Management.Smo.Server 'MyServer';
$tableType = (new-object Microsoft.SqlServer.Management.Smo.Table).getType();
$ss.SetDefaultInitFields($tableType, "IsIndexable");
$ss.Databases[$db].Tables |  Where-Object  {$_.IsIndexable -eq $true}

请注意,在指向BOL的文章中,他们会保存默认的属性集,并在完成后将其还原。无论你是否愿意这样做,都取决于你。