數據庫日志問題。

时间:2023-02-07 19:49:45
Table1:有字段F1,F2,F3,F4,F6    共有15000條記錄
Table2:有字段F1,F2,F3,F4,F6    共有8533000條記錄
Table3:有字段F1,F2,F3,F4,F6    新表,
想把Table1表的F1、F2不在Table2表中的記錄插入Table2
這下面的SQL語句執行:
insert Table3
select t1.*
from Table1 t1,Table2 t2
where t1.F1<>t2.F1 and t1.F2<>t2.F2
昨天執行了這條語句後,生成日志文件很大,結果數據庫無法打開。後來,經過處理,生成一個新的日志文件才504K。可以正常使用。
今天又執行了這條語句後,生成日志文件很大(13.4G),結果數據庫無法打開。
請問各位大俠:這條語句為什麼會產生這麼大的日志文件?幫幫忙。

18 个解决方案

#1


table3呢??
insert table2 select * from table1 where F1 not in (select F1 from table2) and F2 not in (select F2 from table2)

#2



insert table2 select * from table1 where cast(F1 as char(20))+cast(F2 as char(20)) not in (select cast(F1 as char(20))+cast(F2 as char(20)) from table2)

#3


分段做可能会好,把每个TRANSACTION变小一些,日志就不会猛涨了。
TO pengdali(大力):
insert table2 select * from table1 where F1 not in (select F1 from table2) and F2 not in (select F2 from table2)
是不对的,因为条件变窄了;
另外我想请教你一下:用in的话,会不会变得很慢?

#4


TO pengdali(大力):
请原谅啊,楼上的贴子发了看着怎么象是在找茬儿,其实我不是的。:-)
我碰到一种情况,要从一个表里选取值在一个列表中的行,这个列表在客户端程序里,现在是生成了一个SELECT * FROM XXX WHERE ID IN(...),问题是有时候这个列表很大,(...)里项很多,所以比较慢,你有没有什么好的建议?谢谢了.

#5


想把Table1表的F1、F2不在Table2表中的記錄插入Table3
這下面的SQL語句執行:insert Table3   select t1.*
from Table1 t1,Table2 t2    where t1.F1<>t2.F1 and t1.F2<>t2.F2
日志大得(13.4G)使資料庫無法打開呀。如果自己沒有做過。我真不敢相信。

#6


1.先分别在table1和table2上按照F1+F2建索引
2.select table1.* into table4 from table1 inner join table2 on table1.f1 = table2.f1 and table1.f2 = table2.f2
3.insert table3 select table1.* from table1 where not exists (select * from table4)
4.insert table2 select * from table3

#7


各位好,謝謝大家。

#8


to magicyangboy (magic_yang) 

你是不是没有建索引?那样也会导致日志变大的,你照着tjan(安安) 的方法试试。

#9


如果我的操作以后不想恢复,能不能不写日志啊?该怎样设置呢?我觉得日志真烦,速度又慢,又占空间。
比如我制定一个job,让他每天执行一次,把操作数据库的记录按条件查询(找到所有三天以前的数据)导出到历史数据库,然后把操作数据库中三天以前的记录删掉,就能保证我的操作数据库不会很慢。这样的操作我是不会在以后恢复的,所以不需要日志,可它还是要写,该怎么办呢?
麻烦各位给指点一下,谢谢!

#10


To: floatleaf(高山流云)
设置你的数据库运行在simple recovery model就行了。

#11


兄弟,你这样写是不对的!这会造成笛卡儿积的直接插入,插入的不是你要的数据,数据量=8533000*15000-15000,不大才怪呢
可以试试这样的:
insert Table3
select t1.*
from Table1 t1 
where convert(varchar(255),t1.F1)+'X'+convert(varchar(255),t1.F2) not in (select
convert(varchar(255),t2.F1)+'X'+convert(varchar(255),t2.F2) 
 Table2 t2)
这样执行会有点慢,但我还没有想到更好的办法

#12


楼主,揭帖啊

#13


换个思路:既然是一段段的数据数据,应该有段标识吧,按段操作,先清掉历史表中重复段的数据再写入或是先检查到了哪个段,写入时跳过那个段

#14


日志有什么用啊?能不能把日志全部删除掉啊?

#15


流水号由系统自动生成。流水号格式为20021218001,我该怎么实现呢?

#16


日志有3G怎么办?LDF文件!

#17


日志有3G怎么办?LDF文件!

#18


insert into table3 select * from table1 where not existes(select 1 from table2 where f1<>table1.f1 and f2 <> table1.f2).
用existes比in 来得快!

#1


table3呢??
insert table2 select * from table1 where F1 not in (select F1 from table2) and F2 not in (select F2 from table2)

#2



insert table2 select * from table1 where cast(F1 as char(20))+cast(F2 as char(20)) not in (select cast(F1 as char(20))+cast(F2 as char(20)) from table2)

#3


分段做可能会好,把每个TRANSACTION变小一些,日志就不会猛涨了。
TO pengdali(大力):
insert table2 select * from table1 where F1 not in (select F1 from table2) and F2 not in (select F2 from table2)
是不对的,因为条件变窄了;
另外我想请教你一下:用in的话,会不会变得很慢?

#4


TO pengdali(大力):
请原谅啊,楼上的贴子发了看着怎么象是在找茬儿,其实我不是的。:-)
我碰到一种情况,要从一个表里选取值在一个列表中的行,这个列表在客户端程序里,现在是生成了一个SELECT * FROM XXX WHERE ID IN(...),问题是有时候这个列表很大,(...)里项很多,所以比较慢,你有没有什么好的建议?谢谢了.

#5


想把Table1表的F1、F2不在Table2表中的記錄插入Table3
這下面的SQL語句執行:insert Table3   select t1.*
from Table1 t1,Table2 t2    where t1.F1<>t2.F1 and t1.F2<>t2.F2
日志大得(13.4G)使資料庫無法打開呀。如果自己沒有做過。我真不敢相信。

#6


1.先分别在table1和table2上按照F1+F2建索引
2.select table1.* into table4 from table1 inner join table2 on table1.f1 = table2.f1 and table1.f2 = table2.f2
3.insert table3 select table1.* from table1 where not exists (select * from table4)
4.insert table2 select * from table3

#7


各位好,謝謝大家。

#8


to magicyangboy (magic_yang) 

你是不是没有建索引?那样也会导致日志变大的,你照着tjan(安安) 的方法试试。

#9


如果我的操作以后不想恢复,能不能不写日志啊?该怎样设置呢?我觉得日志真烦,速度又慢,又占空间。
比如我制定一个job,让他每天执行一次,把操作数据库的记录按条件查询(找到所有三天以前的数据)导出到历史数据库,然后把操作数据库中三天以前的记录删掉,就能保证我的操作数据库不会很慢。这样的操作我是不会在以后恢复的,所以不需要日志,可它还是要写,该怎么办呢?
麻烦各位给指点一下,谢谢!

#10


To: floatleaf(高山流云)
设置你的数据库运行在simple recovery model就行了。

#11


兄弟,你这样写是不对的!这会造成笛卡儿积的直接插入,插入的不是你要的数据,数据量=8533000*15000-15000,不大才怪呢
可以试试这样的:
insert Table3
select t1.*
from Table1 t1 
where convert(varchar(255),t1.F1)+'X'+convert(varchar(255),t1.F2) not in (select
convert(varchar(255),t2.F1)+'X'+convert(varchar(255),t2.F2) 
 Table2 t2)
这样执行会有点慢,但我还没有想到更好的办法

#12


楼主,揭帖啊

#13


换个思路:既然是一段段的数据数据,应该有段标识吧,按段操作,先清掉历史表中重复段的数据再写入或是先检查到了哪个段,写入时跳过那个段

#14


日志有什么用啊?能不能把日志全部删除掉啊?

#15


流水号由系统自动生成。流水号格式为20021218001,我该怎么实现呢?

#16


日志有3G怎么办?LDF文件!

#17


日志有3G怎么办?LDF文件!

#18


insert into table3 select * from table1 where not existes(select 1 from table2 where f1<>table1.f1 and f2 <> table1.f2).
用existes比in 来得快!