2014-01-30 32 views
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"]]} 

,但我覺得應該有更好的解決辦法..

,將加快你的代碼

回答

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文章中,他們節省掉屬性的默認設置和處理完成後恢復它。無論你是否喜歡這樣做,都取決於你。

+0

嗨,本。我們是否有可能加快搜索速度:$ i = $ d.Tables.Indexes |其中{$ _。HasFilter -eq $ true}?那意味着如何「預先加載所有索引」? $ s.SetDefaultInitFields((new-object('Microsoft.SqlServer.Management.Smo.Index')).getType(),'HasFilter')可以工作,但只能完成部分工作.. –

+0

$ s.SetDefaultInitFields((new-對象'Microsoft.SqlServer.Management.Smo.Index'))。getType(),'HasFilter')將是我的第一次嘗試。這不適合你的方式? –

+0

仍然太長(與從sys.indexes中選擇相比)。正如我所說的,它不會「預加載」索引,因此在迭代foreach表時,我們會產生新的請求「獲取所有索引」。 –