smo 的 IsSystemObject 属性

Posted

技术标签:

【中文标题】smo 的 IsSystemObject 属性【英文标题】:IsSystemObject attribute of smo 【发布时间】:2014-01-11 11:54:29 【问题描述】:

我正在使用 SMO 从数据库中获取存储过程列表。我对存储过程进行了 foreach 循环,以对它们进行预期的操作。但是我只需要使用用户创建的存储过程。我使用存储过程的 IsSystemObject 属性。但是速度太慢了:

大约 10 秒:

foreach (StoredProcedure mystr in mydb.StoredProcedures)

    if (!mystr.IsSystemObject)
    
        classGenerated += mystr.Name + Environment.NewLine;
    

不到 1 秒:

foreach (StoredProcedure mystr in mydb.StoredProcedures)
    
    classGenerated += mystr.Name + Environment.NewLine;

这种差异是否仅适用于一种 if 条件?如果不是,那么造成这种性能差异的原因是什么?如果有其他方法,我可以使用其他方法来区分系统对象和非系统对象。

【问题讨论】:

【参考方案1】:

是的。这就是为什么。 SMO 默认预取某些属性并保留其他属性。因此,您基本上会在每个过程中得到一个调用,以确定它是否是系统过程。幸运的是,有一个修复。查看this BOL article

SMO 优化只允许在以下情况下加载最少的属性 创建了一个对象。当访问未初始化的属性时,SMO 发出单独的请求以从实例中加载信息 SQL 服务器。您可以使用此方法来调整哪些属性是 首次创建对象时对其进行初始化以进一步优化 性能

【讨论】:

是的,它奏效了。我已将 VB 语法更改为 C#。对于其他用户,这里是更好的用法: myserver.GetDefaultInitFields(typeof(StoredProcedure)); myserver.SetDefaultInitFields(typeof(StoredProcedure), "IsSystemObject"); 链接没有显示 VB 所以这里是我使用的:myserver.SetDefaultInitFields(GetType(Microsoft.SqlServer.Management.Smo.StoredProcedure), "IsSystemObject") 我不是 VB 人,但GetType(Microsoft.SqlServer.Management.Smo.StoredP‌​rocedure) 是否正确返回了 StoredProcedure 类型?

以上是关于smo 的 IsSystemObject 属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL SMO 修复孤立用户?

如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库

从 SQL DMO 迁移到 SQL SMO (SQL Server 2012)

什么是smo

SQL Server:为啥要使用 SMO?

ES6——Symbol