[英]How can I optimize my PowerShell SMO Query (where-object is too slow)?
A.是否有可能獲得ps腳本的結果:
$ss=New-Object Microsoft.SqlServer.Management.Smo.Server 'MyServer';
$ss.Databases[$db].Tables | Where-Object {$_.IsIndexable -eq $true}
具有與選擇相當的性能
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"]]}
但我認為應該有更好的解決方案..
加速代碼的一件事是告訴服務器對象您關心表上的IsIndexable屬性,因此當您獲取表對象時,它應該獲取該屬性。 您可以按照此BOL文章的流程進行操作,但歸結為:
$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的文章中,它們會保存默認的屬性集,並在完成后將其還原。 無論你是否願意這樣做,都取決於你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.