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

这段神奇的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 )";

调用的代码是:

代码
            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,则不存在内存泄露。

原文地址:https://www.cnblogs.com/zc22/p/1641862.html