在使用SMO时,检索IsSystemObject属性将导致性能急剧下降的解决方法

本文介绍使用SQL Server Management Objects (SMO)时如何避免因检索IsSystemObject属性而导致的性能下降。通过设置IsSystemObject为默认加载属性,可以显著提高处理大量对象时的应用程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2009/04/10/1433171.html
原文标题:在使用SMO时,检索IsSystemObject属性将导致性能急剧下降的解决方法
原文发表:2009/4/10 8:00:00

当我们会议为什么使用SMO代替DMO时,一个主要的原因就是增加性能。外加上可以延迟连接到SQL Server,以及限制从对象中得到信息的数量,SMO的性能已经得到了非常大的提高。SMO当建立对象时,仅仅装载非常少的属性。换句话说,这些对象仅仅部分初始化。如果我们以后尝试读取未初始化的属性,SMO会自动请求服务器来获得属性细节。当然,如果错误地使用这些属性,我们可能会迅速丢失通过部分初始化而获得的性能。


    本文提供的例子程序充分演示了这种性能丢失的情况。在应用程序中并没有在设计时就显示系统对象,而是在程序运行时通过每个 IsSystemObject 属性来确定每个对象是否为系统对象。不幸的是,这个属性并不是 SMO 的默认装载的属性,而在运行时装载这个属性一般需要花很长的时间。而每次调用对象的 IsSystemObject 都要单独访问 SQL Server 以获得每个对象的属性值,因此,程序的性能将会随着对象的多少而显著下降。


     大家不用担心,微软早就为我们考虑到了这一点。虽然IsSystemObject不是系统默认初始化的属性,但我们可以改变这一切,也就是说将IsSystemObject设为默认的属性。在Server类中提供了一个SetDefaultInitFields方法来设置默认属性。下面的代码演示了如何使用SetDefaultInitFields方法来修改Table、View和StoredProcedure类的IsSystemObject属性。要注意的是我们必须为每个对象单独设置IsSystemObject方法。由于本例要使用tables、views和stored procedures的IsSystemObject属性,因此,我们需要调用三次SetDefaultInitFields方法,代码如下:

svr.SetDefaultInitFields(typeof(Table), new string[] { "IsSystemObject" });
svr.SetDefaultInitFields(typeof(Microsoft.SqlServer.Management.Smo.View), new string[] { "IsSystemObject" });
svr.SetDefaultInitFields(typeof(StoredProcedure), new string[] { "IsSystemObject" });
svr.SetDefaultInitFields(typeof(UserDefinedFunction), new string[] { "IsSystemObject" });

作者:陈希章
出处:http://blog.youkuaiyun.com/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值