0
A.有沒有得到PS-腳本的結果的可能性:用相當的性能選擇如何優化我的PowerShell SMO查詢(哪裏對象太慢)?
SELECT * FROM sys.Tables WHERE OBJECTPROPERTY(object_id, 'IsIndexable')=1
當然單程
$ss=New-Object Microsoft.SqlServer.Management.Smo.Server 'MyServer';
$ss.Databases[$db].Tables | Where-Object {$_.IsIndexable -eq $true}
是運行選擇(從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"])}
但是這個i s不看「應該怎麼樣」。
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"]]}
,但我覺得應該有更好的解決辦法..
,將加快你的代碼
嗨,本。我們是否有可能加快搜索速度:$ i = $ d.Tables.Indexes |其中{$ _。HasFilter -eq $ true}?那意味着如何「預先加載所有索引」? $ s.SetDefaultInitFields((new-object('Microsoft.SqlServer.Management.Smo.Index')).getType(),'HasFilter')可以工作,但只能完成部分工作.. –
$ s.SetDefaultInitFields((new-對象'Microsoft.SqlServer.Management.Smo.Index'))。getType(),'HasFilter')將是我的第一次嘗試。這不適合你的方式? –
仍然太長(與從sys.indexes中選擇相比)。正如我所說的,它不會「預加載」索引,因此在迭代foreach表時,我們會產生新的請求「獲取所有索引」。 –