2014-01-30 1 views
0

А. Есть ли возможность получить результат пс-скрипта:Как я могу оптимизировать свой запрос SMO PowerShell (где-объект слишком медленный)?

$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 

Конечно один путь, чтобы выполнить выбор (от пс), а затем создать экземпляр кучи smo.table сортировки по имени (или object_id), что-то вроде:

$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"])} 

, но это я 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

Hi, Ben. У нас есть возможность ускорить такой поиск: $ 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 table мы создаем новый запрос «получить все индексы». –

Смежные вопросы