作者:lijunlin66_8460dd | 来源:互联网 | 2023-05-18 06:34
unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Contro
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ADODB, DB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOCommand1: TADOCommand;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
i:Integer;
begin
for i:= 0 to 30000 do
begin
ADOCommand1.CommandText := Format(' update userdata set port = %d where RecordId = 5000',[i]);
ADOCommand1.Execute;
end;
end;
执行上面的代码能使sqlserver进程的内存暴涨到两三百兆,到底是sqlserver的原因还是ado控件的属性没有设置好??请高手赐教,感激不尽啊。
up也有分。。。。。。。。。。。
31 个解决方案
I 服了 U !
你做了30001次操作。呵~~
强!
这样写什么意思啊,要这么的循环干什么啊,要更新30000次 啊
你相当于打开了表30001次,内存能不暴长么,因为来不及释放啊.
建议你改为,把数据插入到一个临时表中,最后再一次update过去
我今天也遇到的一个问题,就是在数据量庞大的时候,执行多条件的联合查询等等,会出现超时!
不知道有什么好的方法解决这些问题。
楼上的兄弟们:我给的代码只是测试ado控件连接sqlserver数据库时频繁执行sql语句到底会不会造成sqlserver进程内存暴涨??因为在我们项目的需求里必须频繁地执行sql语句
这是sqlserver的机制造成的,没有太大问题,:)
执行3万次SQL应该是增加CPU负担,可是表开3万次就不一样了,执行SQL怎么会占用内存那,肯定是打开的表占用了内存咯
sqlserver每打开一个连接就分配一定内存的,:)
1、判断是数据库或DELPHI的问题很容易,通过DELPHI连接ADO执行或在SQL中直接执行看看速度
把以上代码转换成SQL代码在SQL中直接执行看看再说别的
2、DELPHI和数据库是完全脱离的,所以先看看SQL有没有问题
ilons(轻轻的来,静静的接分,不带走什么,只留下几十个bytes):“你相当于打开了表30001次,内存能不暴长么,因为来不及释放啊.
建议你改为,把数据插入到一个临时表中,最后再一次update过去”
请教一下以下的疑问:
1、为什么我操作的是一张表,还要去建临时表呢?到底有什么不同???
2、难道sqlserver竟然会“笨的”在内存中保留30001表???为什么表来不及释放?如何释放表?
3、而且我程序退出时把adoconnection都关闭了,sqlserver进程为什么还不能是否内存???
昨天王数据库里写了1w张图片,sqlserver,内存使用到了1.4g
日死了~~
不知道 楼上说的创建临时表怎么个创建法?
create table temp from select.....么?
那跟直接跟新有什么区别?
楼上的,你机器多大内存啊?怎么涨到1.4g你系统还没当机啊??
修改sqlserver的内存设置可以节约点。你的程序没问题。
想通了为什么专业的数据库服务器都要用超牛的机器来当了吧,空间换时间的策略。
呵呵,以前做有个统计程序的时候,虚拟内存都要1G多才够用哦:)
这是SQL Server的问题,我之前连续insert 10万条记录,消耗了2G的内存(不知道跟我带事务有没有关),当insert完成后,内存消耗立即回落。由于我机器内存没有那么大,只好把虚拟内存设置得很大。。
To: truedogface(^(o.o)^)
这和你带事务有很大关系,所以当数据表很庞大(Rec>200-500万)的时候,如果要事务处理,那么你的电脑得比较N才好,如果往一个1000万条记录的表中添加10万条记录,而且如果你建立了主索引,如果这个时候你用了事务的话那真的会很难看,除非你的电脑是企业服务器级别(IBM E系列)的,否则慢慢等吧
to楼上
是啊,但是有时候没有办法,必须使用事务,否则会非常的麻烦,慢就只能让他慢了。
那就这样
1.把10万条记录先弄到临时表中,不要建立索引
2.把1000万条记录的表的索引先取消 <<<---非必要步骤,有时候反而会弄巧成拙
3、开启事务
4.把10万条记录一次性添加
5、事务完成或事务回滚
会提高部分性能