簡體   English   中英

如何優化PowerShell SMO查詢(where-object太慢)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM