调试一段数据库调用的时候,内存彪到1.5G。请教为啥捏?
2010-01-08 04:25
183 查看
这段神奇的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里面造成的,不是我的问题。
请教这个到底是咋回事。如果是微软的问题,能否问微软拿精神损失费呢?
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,则不存在内存泄露。相关文章推荐
- 请教大佬,在用pycharm调试的时候如何进入callback调用的函数
- 访问数据库的时候报错 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- Eclipse编写和调试Applet程序,调试的时候Eclipse会自动调用Java "小程序查看程序",而不用嵌入到网页中查看运行效果。
- 请教一下:Windows任务管理器中显示的进程占用的内存是什么内存? 分配的还是使用的? 另外,最小化一个进程的时候为什么其占用的内存会大大降低?谢谢
- 新增用户的时候调用smartbi二次开发接口调试的异常界面
- (转载)GC调用时机,特殊内存回收时机,及调试时强制GC
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- 一段项目开发时候用的调试代码 一 --输出特殊信息
- Android模拟内存紧张,应用被杀死如何模拟应用程序被杀掉? 更新:Daniel Lew指出,最简单的方法是在DDMS中点击”Stop Porcess”杀掉你的程序,在你调试程序的时候可以这样做。
- 使用SSH在做插入和修改的时候即使数据库中给字段设置了默认值还是没有用,在表对应的配置文件中也不知道该如何配置。。请教下。。
- oracle 的数据库 的保存及调用(请教!)
- 将Asset 中数据库复制到android内存,并且通过xutils进行调用
- 程序调试的时候利用Call Stack窗口查看函数调用信息
- 程序有一个调用打印机的功能,在调试的时候可以用,用tomcat部署上去了之后就不能打印了····
- 在外部调用RFC的时候,使用ABAP调试
- Android 在使用Bitmap的时候为啥要手动调用recycle方法呢?
- 在外部调用RFC的时候,使用ABAP调试
- 关于不同工程调用时候,调试问题
- visual studio 2010 访问数据库的时候报错 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 求助 这是我的mfc下一个修改数据库信息的一段代码,里面执行到m_Ado.m_pRecordset->Update(); 这句话的时候就会出现异常,而且修改不了数据库内的信息。