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"]]}
但我认为应该有更好的解决方案..
答案 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的文章中,他们会保存默认的属性集,并在完成后将其还原。无论你是否愿意这样做,都取决于你。