调试一段数据库调用的时候,内存彪到1.5G。请教为啥捏?

SQL查询内存占用高问题
本文探讨了一段涉及四表连接的SQL查询导致内存占用过高的现象,通过逐步排查定位到特定表为问题根源。

 

这段神奇的sql是:

string sql = "SELECT USR_BOX.SHOPCODE AS SHOPCODE, SYS_SHOPINFO.SHOPNAME AS SHOPNAME, USR_PROFILE.USERNAME AS USERNAME, ITM_ITEM.ITEMNAME AS ITEMNAME, STK_INVENTORYLOG.ITEMCODE AS ITEMCODE, STK_INVENTORYLOG.MERCHANTCODE AS MERCHANTCODE, STK_INVENTORYLOG.LOGSTOCKQTY AS LOGSTOCKQTY, STK_INVENTORYLOG.LOGCODE AS LOGCODE FROM ( ( ( ( STK_INVENTORYLOG INNER JOIN USR_PROFILE AS USR_PROFILE ON STK_INVENTORYLOG.MERCHANTCODE = USR_PROFILE.USERCODE ) INNER JOIN USR_BOX AS USR_BOX ON STK_INVENTORYLOG.SHOPCODE = USR_BOX.SHOPCODE ) INNER JOIN SYS_SHOPINFO AS SYS_SHOPINFO ON USR_BOX.SHOPCODE = SYS_SHOPINFO.SHOPCODE ) INNER JOIN ITM_ITEM AS ITM_ITEM ON STK_INVENTORYLOG.ITEMCODE = ITM_ITEM.ITEMCODE )";

调用的代码是:

 

ExpandedBlockStart.gif代码
            INoebeCommand command = NoebeManager.Instance.NoebeCommand;
            
//command.SQL = "DELETE from STK_INVENTORYLOG WHERE LOGCODE < 'STK20110108015119545301' AND LOGCODE >= 'STK20100108015119545301'";
            string sql = "SELECT USR_BOX.SHOPCODE AS SHOPCODE, SYS_SHOPINFO.SHOPNAME AS SHOPNAME, USR_PROFILE.USERNAME AS USERNAME, ITM_ITEM.ITEMNAME AS ITEMNAME, STK_INVENTORYLOG.ITEMCODE AS ITEMCODE, STK_INVENTORYLOG.MERCHANTCODE AS MERCHANTCODE, STK_INVENTORYLOG.LOGSTOCKQTY AS LOGSTOCKQTY, STK_INVENTORYLOG.LOGCODE AS LOGCODE FROM ( ( ( ( STK_INVENTORYLOG INNER JOIN USR_PROFILE AS USR_PROFILE ON STK_INVENTORYLOG.MERCHANTCODE = USR_PROFILE.USERCODE ) INNER JOIN USR_BOX AS USR_BOX ON STK_INVENTORYLOG.SHOPCODE = USR_BOX.SHOPCODE ) INNER JOIN SYS_SHOPINFO AS SYS_SHOPINFO ON USR_BOX.SHOPCODE = SYS_SHOPINFO.SHOPCODE ) INNER JOIN ITM_ITEM AS ITM_ITEM ON STK_INVENTORYLOG.ITEMCODE = ITM_ITEM.ITEMCODE )";
            command.SQL 
= sql;
            
//command.Execute();
            DataTable table = command.ExecuteReader();
            SmartConsole.Write(table);

 

就是自己封装了sqlclient然后查询。

 

大概就是4张表的inner join。数据库有数据2w(应该很少了。。。)数据库使用sqlserver 2005。

结果不到半分钟,内存就彪到了1.5G了。而且还没有返回。

 

我用profiler发现:

最占资源的是string。再往里面看:

貌似是.net里面造成的,不是我的问题。

 

请教这个到底是咋回事。如果是微软的问题,能否问微软拿精神损失费呢?

 

补充几点

后来我修改了sql,发现问题在USR_BOX这张表。如果不做innerjoin,则不存在内存泄露。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值