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.StoredProcedure)
是否正确返回了 StoredProcedure 类型?以上是关于smo 的 IsSystemObject 属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库