А. Есть ли возможность получить результат пс-скрипта:Как я могу оптимизировать свой запрос 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"]]}
, но я думаю, что должно быть лучшее решение ..
Hi, Ben. У нас есть возможность ускорить такой поиск: $ 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 table мы создаем новый запрос «получить все индексы». –