私が知る限り、パフォーマンスの問題は、実際には SqlServer psprovider の Resolve-Path の実装にあります。Resolve-Path は、(Powershell v2 の) TabExpansion の既定の実装がパス補完を行う方法です。
Resolve-Path の代わりに Get-ChildItem と Where-Object を使用するように TabExpansion 関数をオーバーライドすることで、この問題を回避することができました。この bitbucket repo で最新の実装を見つけることができます。
現在の実装は次のとおりです。
function TabExpansion($line, $lastWord) {
if (!((get-location).Provider.Name -eq "SqlServer")) {
TabExpansionSqlPsBackup $line $lastWord
}
else {
$index = $lastWord.LastIndexOfAny(@('\', '/'))
if ($index -gt -1) {
$parent = $lastWord.substring(0, $index+1)
$leaf = $lastWord.substring($index+1)
}
else {
$parent = ""
$leaf = $lastWord
}
$matches = ls -path $parent | ?{ $_.PSChildName -match "^$leaf" }
if ($matches) {
$matches | %{ $parent + $_.PSChildName }
}
else {$lastWord}
}
}
~\Documents\WindowsPowerShell\Microsoft.SqlServer.Management.PowerShell.sqlps_profile.ps1 にある sqlps プロファイル ファイルにその関数を配置します。