【问题标题】:How can I optimize my PowerShell SMO Query (where-object is too slow)?如何优化我的 PowerShell SMO 查询(where-object 太慢)?
【发布时间】:2014-01-30 09:59:28
【问题描述】:

A.有没有可能得到ps-script的结果:

$ss=New-Object Microsoft.SqlServer.Management.Smo.Server 'MyServer';
$ss.Databases[$db].Tables |  Where-Object  {$_.IsIndexable -eq $true}

与 select 的性能相当

SELECT * FROM sys.Tables WHERE OBJECTPROPERTY(object_id, 'IsIndexable')=1

当然,一种方法是运行 select(来自 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"])}

但这看起来不像“它应该是这样的”..

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

但我认为应该有更好的解决方案..

【问题讨论】:

    标签: sql-server powershell smo


    【解决方案1】:

    可以加快您的代码速度的一件事是告诉服务器对象您关心表上的 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 的文章中,它们保存了默认属性集并在完成后恢复它。您是否愿意这样做,完全取决于您。

    【讨论】:

    • 嗨,本。我们是否有可能加快这样的搜索:$i=$d.Tables.Indexes | {$_.HasFilter -eq $true} 在哪里?这意味着如何“预加载所有索引”? $s.SetDefaultInitFields((new-object ('Microsoft.SqlServer.Management.Smo.Index')).getType(), 'HasFilter') 有效,但只完成部分工作..
    • $s.SetDefaultInitFields((new-object 'Microsoft.SqlServer.Management.Smo.Index')).getType(), 'HasFilter') 将是我的第一次尝试。这在哪些方面对您不起作用?
    • 仍然太长(比较从 sys.indexes 中选择)。正如我所说,它不会“预加载”索引,因此在迭代 foreach 表期间,我们会生成新请求“获取所有索引”。
    • $d.Tables.Indexes 不会产生任何结果,因为 TableCollection 没有名为 Indexes 的属性。也许是时候开始一个新的话题了,详细说明你真正想要完成的事情。
    • 我想知道是否可以快速过滤索引?这很慢: $i=$d.Tables.Indexes |其中 {$_.HasFilter -eq $true};具有索引类型和“IsIndexable”的 SetDefaultInitFields 在可接受的持续时间之前不会改善情况。
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2011-03-05
    • 2011-10-24
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多