惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Docker
博客园 - 叶小钗
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
Hugging Face - Blog
Hugging Face - Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
美团技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
F
Fortinet All Blogs
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
H
Heimdal Security Blog
有赞技术团队
有赞技术团队
The Cloudflare Blog
S
Secure Thoughts
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
The Blog of Author Tim Ferriss
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - Franky
T
Tenable Blog
The Last Watchdog
The Last Watchdog
腾讯CDC
量子位
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
雷峰网
雷峰网
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cyberwarzone
Cyberwarzone
S
Securelist
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
InfoQ
Spread Privacy
Spread Privacy
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - BG5SBK

公告:胡搞瞎搞工作室换地方了! 本周末厦门.NET俱乐部活动(借首页发下....不好意思) BG5SBK.FrameworkV2 新版本与帮助文档发布 BG5SBK.FrameworkV2.Data 支持语言化查询了 支持.NET 2.0又支持中文的NDoc 设计了一张89S51实验板 Flex Builder 2 注册码 OpCodes中文说明(转&收藏) DIY 的 LinQ 感光电路板制作(转&收藏) 上拉与下拉电阻(转&收藏) 虾米是怎样炼成的(转&收藏) GBA开发入门(转&收藏) ARM的开发步骤(转&收藏) 打火机组装摩托车(Cool!) 收藏几个有意思的SQL脚本 BG5SBK.FrameworkV2.DataLayer更新,附带详细说明 今天老婆给我画的画像 不用客户端软件的杂志平台Koo123
关于SQL 参数的一次测试(重新又测了一次)
BG5SBK · 2006-07-17 · via 博客园 - BG5SBK

    园里的henry前些天提醒我在封装SQL语句的时候需要注意参数名尽量重复使用,不要每次都用不一样的参数名,他说如果每次参数名都用不一样SQL Server内存会越占越大,他曾经试过占到1G内存。我没有做过这方面的试验,光听henry讲心里没什么底,询问了厦门.NET具乐部里的朋友们,他们都以为我是在说SqlParameter没有被CG回收。。。一个劲的说Clear,Dispose,using。。。这也不能怪他们,是我表达的不清楚。最后没办法,我自己做了个测试。

    测试所用的表结构很简单:

CREATE TABLE [dbo].[MyTable] (
    
[Code] [char] (50) COLLATE Chinese_PRC_CI_AS NULL
 ,
    
[CreateTime] [datetime] NULL
 
ON [PRIMARY]

GO

    测试分两次,一次向数据库插入10W条记录,在同一次数据库连接和事物中完成,第一次测试每次插入用的SQL参数是用Guid生成的不重复的参数名,第二次测试每次插入用的参数名都是一样的。

    测试结果如下:

   

   从测试结果可以看出两次测试的结果差别巨大,使用不重复的参数名不光吃了很多的内存还执行缓慢!

   小弟不材,测试会做,但是不知道为什么SQL Server会有这样的问题,希望路过的大虾可以帮小弟解答下为什么会有这样的情况。

   我测试用的代码(请各位用自己的数据层或者单纯ADO.NET替换我的数据层部分)
   这是第二次测试用的代码,和第一次测试唯一区别就是用固定的参数名代替了原来的Guid。  

DateTime _t1 = DateTime.Now;
using (DatabaseSession _seesion = new DatabaseSession("TestDB"
))
{
    
for (int i = 0; i < 100000; i++
)
    {
        
string _par1 = "par1"//Guid.NewGuid().ToString().Replace("-", "");

        string _par2 = "par2"//Guid.NewGuid().ToString().Replace("-", "");
        string _sql = string.Format("Insert into MyTable (Code,CreateTime) values(@{0},@{1})", _par1, _par2);

        IDataParameter _param1 

= _da.CreateDataParameter(string.Format("@{0}", _par1), 
            DbType.String, Guid.NewGuid().ToString());
        IDataParameter _param2 
= _da.CreateDataParameter(string.Format("@{0}"
, _par2), 
            DbType.DateTime, DateTime.Now);

        _da.ExecuteNonQuery(_sql, _seesion.DbConnection, _seesion.DbTransaction, _param1, _param2);
    }
}

    介于大家对字符串操作影响代码效率的问题,我重新设计了一次测试,这次测试的结果是:

    使用重复的参数名,插入100000条记录,使用了40多秒的时间,刚开始运行时SQL Server内存占用12M,运行时最高峰占29M,结束时占内存26M。
    使用不重复的参数名,插入100000条记录,使用了190多秒的时间,刚开始运行时SQL Server内存占用26M,运行时最高峰为305M,结束时占内存96M。

    测试代码如下:

DateTime _t1 = DateTime.Now;

List

<ExecuteBatchItem> _bath = new List<ExecuteBatchItem>();//预备批查询的所有项,此时还未连接数据库和执行数据库操作
for (int i = 0; i < 100000; i++)
{
    
string _par1 = Guid.NewGuid().ToString().Replace("-""");//"par1"; 

    string _par2 = Guid.NewGuid().ToString().Replace("-""");//"par2"; 
    string _sql = string.Format("Insert into MyTable (Code,CreateTime) values(@{0},@{1})", _par1, _par2);

    List

<IDataParameter> _params = new List<IDataParameter>
();

    IDataParameter _param1 

= _da.CreateDataParameter(string.Format("@{0}"
, _par1),
        DbType.String, Guid.NewGuid().ToString());
    IDataParameter _param2 
= _da.CreateDataParameter(string.Format("@{0}"
, _par2),
        DbType.DateTime, DateTime.Now);

    _params.Add(_param1);
    _params.Add(_param2);

    _bath.Add(

new
 ExecuteBatchItem(_sql, _params.ToArray(), ExecuteTypes.ExecuteNonQuery));
}
//我的数据层的批查询方法,在同一次数据库连接中执行_bath里的所有查询操作

DataAccess.Create("TestDB").ExecuteBatch(_bath, true);//计算时间
Response.Write(((TimeSpan)(DateTime.Now - _t1)).TotalMilliseconds);

第二次的测试可以看出字符串操作并不是影响SQL Server执行的关键,也更不可能会影响SQL Server的内存占用,应为字符串是.NET程序域内存的一部分而不是SQL Server的