由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - How to delete 40 millions records in a 400 millions indexed table fast?
相关主题
SQL Server Replication怎么老RECOMPILE啊养老院人事 SQL难题解法综述 -- 申精
再问I/O WAIT的问题SQL Server Question: how delete works
deletesql server 怎么关掉log
Oracle求助,thanks!!!问个优化的问题
请问T-SQL中Group By之后怎么找到特定的recordOracle 请问怎么删除一个实时都在更新的表里的历史数据
求大量数据每天更新的解决方案which one is faster? truncate or delete?
来做sql题目。INSERT or UPDATE, which is faster?
webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决truncate和delete在ORACLE里有什么区别?
相关话题的讨论汇总
话题: delete话题: sql话题: table话题: 10000
进入Database版参与讨论
1 (共1页)
b**a
发帖数: 1118
1
Now we can only delete them in 1 hour. How to make it in 30 mins?
Thanks,
Ming
B*****g
发帖数: 34098
2
what database?
which version?
table partitioned?
any audit/archive is using?

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming

b**a
发帖数: 1118
3
发信人: Beijing (中国万岁,北京加油), 信区: Database
标 题: Re: How to delete 40 millions records in a 400 millions indexe
发信站: BBS 未名空间站 (Tue Jan 24 17:58:08 2012, 美东)
what database? sql server 2008
which version?
table partitioned? no
any audit/archive is using? no idea...
【 在 buaa (ming) 的大作中提到: 】
b**a
发帖数: 1118
4
I am using sth like this now:
DECLARE @count2 int
SET @count2 = 10000
WHILE @count2 >= 10000
BEGIN
DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
temp OPTION (MAXDOP 1)
SELECT @count2 = @@ROWCOUNT
END
and i really need it to run faster...

【在 b**a 的大作中提到】
: 发信人: Beijing (中国万岁,北京加油), 信区: Database
: 标 题: Re: How to delete 40 millions records in a 400 millions indexe
: 发信站: BBS 未名空间站 (Tue Jan 24 17:58:08 2012, 美东)
: what database? sql server 2008
: which version?
: table partitioned? no
: any audit/archive is using? no idea...
: 【 在 buaa (ming) 的大作中提到: 】

i****a
发帖数: 36252
5
Do a larger batch than 10k should help. And just do delete without the sub
select.m
Are your lookup parameters indexed?
And what's the purpose of (MAXDOP 1)?

)
[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

c*****d
发帖数: 6045
6
这个是dba interview最常见的问题吧

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming

b**a
发帖数: 1118
7
The where clause is using the field that is indexed

【在 i****a 的大作中提到】
: Do a larger batch than 10k should help. And just do delete without the sub
: select.m
: Are your lookup parameters indexed?
: And what's the purpose of (MAXDOP 1)?
:
: )
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
8
Can you do delete without the sub
select. Put the where clause in to the delete statement.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: The where clause is using the field that is indexed
b**a
发帖数: 1118
9
I actually get the idea from the following link:
http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
A view is supposed to be faster but i did not figure out the way to create a
view in begin and end block so I gave up.

【在 i****a 的大作中提到】
: Can you do delete without the sub
: select. Put the where clause in to the delete statement.
:
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
10
Try with just delete top 100000 from tbl where ....

a
[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: I actually get the idea from the following link:
: http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
: A view is supposed to be faster but i did not figure out the way to create a
: view in begin and end block so I gave up.

相关主题
求大量数据每天更新的解决方案养老院人事 SQL难题解法综述 -- 申精
来做sql题目。SQL Server Question: how delete works
webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决sql server 怎么关掉log
进入Database版参与讨论
B*****g
发帖数: 34098
11
同时run 10个会不会快?

create

【在 i****a 的大作中提到】
: Try with just delete top 100000 from tbl where ....
:
: a
: [发表自未名空间手机版 - m.mitbbs.com]

b**a
发帖数: 1118
12
How?
Thanks.

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

c*****d
发帖数: 6045
13
同时run 10个,每个delete 4 millions record?
这个方法性能更慢

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

c*****d
发帖数: 6045
14
没看太明白
是不是要删除transacitons表中某段时间的记录
如果要删除的记录超过10000条,10001条以后的就不删除了?

)

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

b**a
发帖数: 1118
15
No. This is to delete 10000 each batch and keep deleting untill every
records that qualified get deleted.

【在 c*****d 的大作中提到】
: 没看太明白
: 是不是要删除transacitons表中某段时间的记录
: 如果要删除的记录超过10000条,10001条以后的就不删除了?
:
: )

i****a
发帖数: 36252
16
Then you have a bug in the while condition.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: No. This is to delete 10000 each batch and keep deleting untill every
: records that qualified get deleted.

b**a
发帖数: 1118
17
what is it?
Thanks.

【在 i****a 的大作中提到】
: Then you have a bug in the while condition.
:
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
18
Never mind, its fine.
Just try different coding and batch sizes.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: what is it?
: Thanks.

B*****g
发帖数: 34098
19
假设每个删除都删除不同的range呢?

【在 c*****d 的大作中提到】
: 同时run 10个,每个delete 4 millions record?
: 这个方法性能更慢

y****w
发帖数: 3747
20
10000的批次太小,换成10w或100w重新跑。问下你们的dba,保证log空间足够。

WITH(NOLOCK
)
@EndDate)

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

相关主题
问个优化的问题INSERT or UPDATE, which is faster?
Oracle 请问怎么删除一个实时都在更新的表里的历史数据truncate和delete在ORACLE里有什么区别?
which one is faster? truncate or delete?新手一问,关于delete和truncate table
进入Database版参与讨论
y****w
发帖数: 3747
21
sql server的锁和oracle的很不一样。

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

B*****g
发帖数: 34098
22
2008不是改善了吗?另外如果有partition可行吗?

【在 y****w 的大作中提到】
: sql server的锁和oracle的很不一样。
y****w
发帖数: 3747
23
并发delete总是要受影响的吧。各个并发之间必须有严格的界限,不然以set的无序特
性,跑跑就锁死了,或操作旧数据了。
lz这个没table partition,用partition/order by硬排序出来或许行,用rank避免最
后那组值的随机性.
没注意sql 2008支持不支持类似currently committed语义。

【在 B*****g 的大作中提到】
: 2008不是改善了吗?另外如果有partition可行吗?
j*****n
发帖数: 1781
24
partitioning will definitely improve the performance.
specially if the partition(s) hold only the records that will be deleted,
then the delete action will take no time via dropping the partition(s).

【在 B*****g 的大作中提到】
: 2008不是改善了吗?另外如果有partition可行吗?
y****w
发帖数: 3747
25
sql大拿说说sql server 2008/denali的锁机制,在并发读写方面的改进?

【在 j*****n 的大作中提到】
: partitioning will definitely improve the performance.
: specially if the partition(s) hold only the records that will be deleted,
: then the delete action will take no time via dropping the partition(s).

c*****d
发帖数: 6045
26
除非你知道每个range在哪个block上

【在 B*****g 的大作中提到】
: 假设每个删除都删除不同的range呢?
i****a
发帖数: 36252
27
I think mainly the time is spend on i/o. But can't tell without a perfmon
trace.

[发表自未名空间手机版 - m.mitbbs.com]

【在 B*****g 的大作中提到】
: 假设每个删除都删除不同的range呢?
B*****g
发帖数: 34098
28
他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
以独立

【在 y****w 的大作中提到】
: 并发delete总是要受影响的吧。各个并发之间必须有严格的界限,不然以set的无序特
: 性,跑跑就锁死了,或操作旧数据了。
: lz这个没table partition,用partition/order by硬排序出来或许行,用rank避免最
: 后那组值的随机性.
: 没注意sql 2008支持不支持类似currently committed语义。

B*****g
发帖数: 34098
29
server上很多CPU的

【在 i****a 的大作中提到】
: I think mainly the time is spend on i/o. But can't tell without a perfmon
: trace.
:
: [发表自未名空间手机版 - m.mitbbs.com]

B*****g
发帖数: 34098
30
zkss

【在 c*****d 的大作中提到】
: 除非你知道每个range在哪个block上
相关主题
Re: 菜人问问,你们都在database上干什么?? (转载)再问I/O WAIT的问题
什么时候不用索引delete
SQL Server Replication怎么老RECOMPILE啊Oracle求助,thanks!!!
进入Database版参与讨论
i****a
发帖数: 36252
31
Not cpu. I'm refering to disk i/o.
Without optimizing query, most likely the bottle neck is at i/o. Running
mulitple instances of the query wouldn't help if they all wait for the disk.

[发表自未名空间手机版 - m.mitbbs.com]

【在 B*****g 的大作中提到】
: server上很多CPU的
B*****g
发帖数: 34098
32
这个table显然是需要partition,哈哈

【在 j*****n 的大作中提到】
: partitioning will definitely improve the performance.
: specially if the partition(s) hold only the records that will be deleted,
: then the delete action will take no time via dropping the partition(s).

B*****g
发帖数: 34098
33
多几个SQL就把Disk搞死了,呵呵

disk.

【在 i****a 的大作中提到】
: Not cpu. I'm refering to disk i/o.
: Without optimizing query, most likely the bottle neck is at i/o. Running
: mulitple instances of the query wouldn't help if they all wait for the disk.
:
: [发表自未名空间手机版 - m.mitbbs.com]

y****w
发帖数: 3747
34
lz这个瓶颈我认为是因为batch size太小带来的循环冗余开销。原先那个sql跑起来估计机器的
cpu/io都不能真正忙起来,但换个角度过来说,总体cpu/io比一次删除的要多了n多倍。
他那个表有400M rows,是个大型库,机器应该差不到哪里去,日志配置应该也不会太
小气。删10M记录应该比做1000次每次10000条要快的多,lz的要求也就是提高一半,改
下batch size应该够用了。lz应该试试然后贴个结果上来。

Running
the
disk.

【在 i****a 的大作中提到】
: Not cpu. I'm refering to disk i/o.
: Without optimizing query, most likely the bottle neck is at i/o. Running
: mulitple instances of the query wouldn't help if they all wait for the disk.
:
: [发表自未名空间手机版 - m.mitbbs.com]

B*****g
发帖数: 34098
35
这个需要测试,据俺测试oracle9i,一般来说1w和10w差不多。另外lz的code为啥要
hardcode 10000很多次?

估计机器的
倍。

【在 y****w 的大作中提到】
: lz这个瓶颈我认为是因为batch size太小带来的循环冗余开销。原先那个sql跑起来估计机器的
: cpu/io都不能真正忙起来,但换个角度过来说,总体cpu/io比一次删除的要多了n多倍。
: 他那个表有400M rows,是个大型库,机器应该差不到哪里去,日志配置应该也不会太
: 小气。删10M记录应该比做1000次每次10000条要快的多,lz的要求也就是提高一半,改
: 下batch size应该够用了。lz应该试试然后贴个结果上来。
:
: Running
: the
: disk.

y****w
发帖数: 3747
36
随手的脚本写法,保证能删光,又不想费事儿去搞到精确的批次,要不加个@@rowcount
=0跳出来也就行了。

【在 B*****g 的大作中提到】
: 这个需要测试,据俺测试oracle9i,一般来说1w和10w差不多。另外lz的code为啥要
: hardcode 10000很多次?
:
: 估计机器的
: 倍。

y****w
发帖数: 3747
37
这么多的行删除,需要的行锁太多; 如果锁升级的话影响怎样,页锁/表锁会破坏本来sql语句之间的
隔离?。 sql server没那么熟,不好说。

【在 B*****g 的大作中提到】
: 他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
: 以独立

B*****g
发帖数: 34098
38
等待大牛中

sql语句之间的

【在 y****w 的大作中提到】
: 这么多的行删除,需要的行锁太多; 如果锁升级的话影响怎样,页锁/表锁会破坏本来sql语句之间的
: 隔离?。 sql server没那么熟,不好说。

a9
发帖数: 21638
39
先把不重要的索引删掉。

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming

c*****d
发帖数: 6045
40
假如你run 10个batch,这些batch都在修改同一个db block or db page

【在 B*****g 的大作中提到】
: zkss
相关主题
Oracle求助,thanks!!!来做sql题目。
请问T-SQL中Group By之后怎么找到特定的recordwebbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
求大量数据每天更新的解决方案养老院人事 SQL难题解法综述 -- 申精
进入Database版参与讨论
c*****d
发帖数: 6045
41
时间字段上的range ---逻辑
data blocks range ---物理
一般情况下是不会一一对应的
很可能一个block上有今天的数据,也有100年以前的数据

【在 B*****g 的大作中提到】
: 他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
: 以独立

y****w
发帖数: 3747
42
数据量小时行锁就行了。lz这个行锁肯定不够用,要上页锁甚至表锁。看dbms具体实现lock wait
的时间可能差很多。 逻辑上独立这个前提就有可能导致实现上的优化。所以我说还是得真懂sql
server的来说说sql server目前以及可预期版本的实现。
再说今天很对的东西,过几年也许就变成错的了。

【在 c*****d 的大作中提到】
: 时间字段上的range ---逻辑
: data blocks range ---物理
: 一般情况下是不会一一对应的
: 很可能一个block上有今天的数据,也有100年以前的数据

B*****g
发帖数: 34098
43
同一时间在一起的可能性很大。LZ每次就锁1w个,delete01也许会lock delete02、03
,但总不会把02-10(假设开10个)都lock住吧。当然,对SQL server的lock不是很精
通,期待大牛详解SQL server Lock。另外如果SQL搞不定,可以考虑hibernate。

【在 c*****d 的大作中提到】
: 时间字段上的range ---逻辑
: data blocks range ---物理
: 一般情况下是不会一一对应的
: 很可能一个block上有今天的数据,也有100年以前的数据

c*****d
发帖数: 6045
44
“同一时间在一起的可能性很大”,未必,看应用
OLTP一个block上什么时间的数据都会有

03

【在 B*****g 的大作中提到】
: 同一时间在一起的可能性很大。LZ每次就锁1w个,delete01也许会lock delete02、03
: ,但总不会把02-10(假设开10个)都lock住吧。当然,对SQL server的lock不是很精
: 通,期待大牛详解SQL server Lock。另外如果SQL搞不定,可以考虑hibernate。

c*****d
发帖数: 6045
45
我没搞清楚lz是必须用sql delete的方法来删除
还是可以用其他方法来实现?
B*****g
发帖数: 34098
46
据说hibernate比SQL快

【在 c*****d 的大作中提到】
: 我没搞清楚lz是必须用sql delete的方法来删除
: 还是可以用其他方法来实现?

y****w
发帖数: 3747
47
这sql得写多烂?

【在 B*****g 的大作中提到】
: 据说hibernate比SQL快
b**a
发帖数: 1118
48
yes we have to do it in sql.

【在 c*****d 的大作中提到】
: 我没搞清楚lz是必须用sql delete的方法来删除
: 还是可以用其他方法来实现?

y****w
发帖数: 3747
49
have you tried bigger batch size? start with 1M.

【在 b**a 的大作中提到】
: yes we have to do it in sql.
b**a
发帖数: 1118
50
Log drive does not have that big space...
Thanks.
Ming

【在 y****w 的大作中提到】
: have you tried bigger batch size? start with 1M.
相关主题
SQL Server Question: how delete worksOracle 请问怎么删除一个实时都在更新的表里的历史数据
sql server 怎么关掉logwhich one is faster? truncate or delete?
问个优化的问题INSERT or UPDATE, which is faster?
进入Database版参与讨论
j*******7
发帖数: 6300
51
那个Delete语句可以这么写:
DELETE TOP(10000) FROM Transactions
WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
Not sure if it's faster. The "select *" is bad in my eyes.
b**a
发帖数: 1118
52
http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
According to that link, that is faster actually than delete directly...

【在 j*******7 的大作中提到】
: 那个Delete语句可以这么写:
: DELETE TOP(10000) FROM Transactions
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
: Not sure if it's faster. The "select *" is bad in my eyes.

j*******7
发帖数: 6300
53
Thank you. An old dog can still learn a new trick.

【在 b**a 的大作中提到】
: http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
: According to that link, that is faster actually than delete directly...

y****w
发帖数: 3747
54
应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
差别才对,假如sql optimizer没干傻事的话。

【在 j*******7 的大作中提到】
: 那个Delete语句可以这么写:
: DELETE TOP(10000) FROM Transactions
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
: Not sure if it's faster. The "select *" is bad in my eyes.

B*****g
发帖数: 34098
55
顶,tuning就是调试

【在 y****w 的大作中提到】
: 应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
: 差别才对,假如sql optimizer没干傻事的话。

t****3
发帖数: 2337
56
用TRUNCATE
b**a
发帖数: 1118
57
This is a variation from this article. Sounds very reasonable so I did not
do test.
Plus i do not have enough space and data in our dev platform to test so...
I am not a sql guy...

【在 y****w 的大作中提到】
: 应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
: 差别才对,假如sql optimizer没干傻事的话。

B*****g
发帖数: 34098
58
加入CINAOUG,你也可以成为sql guy

【在 b**a 的大作中提到】
: This is a variation from this article. Sounds very reasonable so I did not
: do test.
: Plus i do not have enough space and data in our dev platform to test so...
: I am not a sql guy...

g***l
发帖数: 18555
59
建一个一模一样的TABLE名字是TABLE_TEMP,注意PK, INDEXES, BULK INSERT你想留住
的RECORD INTO TABLE_TEMP,DROP OLD TABLE, RENAME TABLE_TEMP TO TABLE,
RECOMPILE TABLE
b**a
发帖数: 1118
60
Now we can only delete them in 1 hour. How to make it in 30 mins?
Thanks,
Ming
Update:
Tried all i can except partitioned table. We cannot drop the index and rebuild it because other hourly sql job is going to insert a lot of records in the same table. Seemed no way to ensure it will finish in 30 mins so my solution is to add a waitfor delay 0.2 in every loop. In this way, the delete will finish much longer (2:30) but it will not affect any other jobs.
相关主题
truncate和delete在ORACLE里有什么区别?什么时候不用索引
新手一问,关于delete和truncate tableSQL Server Replication怎么老RECOMPILE啊
Re: 菜人问问,你们都在database上干什么?? (转载)再问I/O WAIT的问题
进入Database版参与讨论
B*****g
发帖数: 34098
61
what database?
which version?
table partitioned?
any audit/archive is using?

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming
: Update:
: Tried all i can except partitioned table. We cannot drop the index and rebuild it because other hourly sql job is going to insert a lot of records in the same table. Seemed no way to ensure it will finish in 30 mins so my solution is to add a waitfor delay 0.2 in every loop. In this way, the delete will finish much longer (2:30) but it will not affect any other jobs.

b**a
发帖数: 1118
62
发信人: Beijing (中国万岁,北京加油), 信区: Database
标 题: Re: How to delete 40 millions records in a 400 millions indexe
发信站: BBS 未名空间站 (Tue Jan 24 17:58:08 2012, 美东)
what database? sql server 2008
which version?
table partitioned? no
any audit/archive is using? no idea...
【 在 buaa (ming) 的大作中提到: 】
b**a
发帖数: 1118
63
I am using sth like this now:
DECLARE @count2 int
SET @count2 = 10000
WHILE @count2 >= 10000
BEGIN
DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
temp OPTION (MAXDOP 1)
SELECT @count2 = @@ROWCOUNT
END
and i really need it to run faster...

【在 b**a 的大作中提到】
: 发信人: Beijing (中国万岁,北京加油), 信区: Database
: 标 题: Re: How to delete 40 millions records in a 400 millions indexe
: 发信站: BBS 未名空间站 (Tue Jan 24 17:58:08 2012, 美东)
: what database? sql server 2008
: which version?
: table partitioned? no
: any audit/archive is using? no idea...
: 【 在 buaa (ming) 的大作中提到: 】

i****a
发帖数: 36252
64
Do a larger batch than 10k should help. And just do delete without the sub
select.m
Are your lookup parameters indexed?
And what's the purpose of (MAXDOP 1)?

)
[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

c*****d
发帖数: 6045
65
这个是dba interview最常见的问题吧

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming
: Update:
: Tried all i can except partitioned table. We cannot drop the index and rebuild it because other hourly sql job is going to insert a lot of records in the same table. Seemed no way to ensure it will finish in 30 mins so my solution is to add a waitfor delay 0.2 in every loop. In this way, the delete will finish much longer (2:30) but it will not affect any other jobs.

b**a
发帖数: 1118
66
The where clause is using the field that is indexed

【在 i****a 的大作中提到】
: Do a larger batch than 10k should help. And just do delete without the sub
: select.m
: Are your lookup parameters indexed?
: And what's the purpose of (MAXDOP 1)?
:
: )
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
67
Can you do delete without the sub
select. Put the where clause in to the delete statement.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: The where clause is using the field that is indexed
b**a
发帖数: 1118
68
I actually get the idea from the following link:
http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
A view is supposed to be faster but i did not figure out the way to create a
view in begin and end block so I gave up.

【在 i****a 的大作中提到】
: Can you do delete without the sub
: select. Put the where clause in to the delete statement.
:
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
69
Try with just delete top 100000 from tbl where ....

a
[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: I actually get the idea from the following link:
: http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
: A view is supposed to be faster but i did not figure out the way to create a
: view in begin and end block so I gave up.

B*****g
发帖数: 34098
70
同时run 10个会不会快?

create

【在 i****a 的大作中提到】
: Try with just delete top 100000 from tbl where ....
:
: a
: [发表自未名空间手机版 - m.mitbbs.com]

相关主题
再问I/O WAIT的问题请问T-SQL中Group By之后怎么找到特定的record
delete求大量数据每天更新的解决方案
Oracle求助,thanks!!!来做sql题目。
进入Database版参与讨论
b**a
发帖数: 1118
71
How?
Thanks.

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

c*****d
发帖数: 6045
72
同时run 10个,每个delete 4 millions record?
这个方法性能更慢

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

c*****d
发帖数: 6045
73
没看太明白
是不是要删除transacitons表中某段时间的记录
如果要删除的记录超过10000条,10001条以后的就不删除了?

)

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

b**a
发帖数: 1118
74
No. This is to delete 10000 each batch and keep deleting untill every
records that qualified get deleted.

【在 c*****d 的大作中提到】
: 没看太明白
: 是不是要删除transacitons表中某段时间的记录
: 如果要删除的记录超过10000条,10001条以后的就不删除了?
:
: )

i****a
发帖数: 36252
75
Then you have a bug in the while condition.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: No. This is to delete 10000 each batch and keep deleting untill every
: records that qualified get deleted.

b**a
发帖数: 1118
76
what is it?
Thanks.

【在 i****a 的大作中提到】
: Then you have a bug in the while condition.
:
: [发表自未名空间手机版 - m.mitbbs.com]

i****a
发帖数: 36252
77
Never mind, its fine.
Just try different coding and batch sizes.

[发表自未名空间手机版 - m.mitbbs.com]

【在 b**a 的大作中提到】
: what is it?
: Thanks.

B*****g
发帖数: 34098
78
假设每个删除都删除不同的range呢?

【在 c*****d 的大作中提到】
: 同时run 10个,每个delete 4 millions record?
: 这个方法性能更慢

y****w
发帖数: 3747
79
10000的批次太小,换成10w或100w重新跑。问下你们的dba,保证log空间足够。

WITH(NOLOCK
)
@EndDate)

【在 b**a 的大作中提到】
: I am using sth like this now:
: DECLARE @count2 int
: SET @count2 = 10000
: WHILE @count2 >= 10000
: BEGIN
: DELETE temp from ( SELECT TOP 10000 * FROM Transactions WITH(NOLOCK)
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate)
: temp OPTION (MAXDOP 1)
: SELECT @count2 = @@ROWCOUNT
: END

y****w
发帖数: 3747
80
sql server的锁和oracle的很不一样。

【在 B*****g 的大作中提到】
: 同时run 10个会不会快?
:
: create

相关主题
webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决sql server 怎么关掉log
养老院人事 SQL难题解法综述 -- 申精问个优化的问题
SQL Server Question: how delete worksOracle 请问怎么删除一个实时都在更新的表里的历史数据
进入Database版参与讨论
B*****g
发帖数: 34098
81
2008不是改善了吗?另外如果有partition可行吗?

【在 y****w 的大作中提到】
: sql server的锁和oracle的很不一样。
y****w
发帖数: 3747
82
并发delete总是要受影响的吧。各个并发之间必须有严格的界限,不然以set的无序特
性,跑跑就锁死了,或操作旧数据了。
lz这个没table partition,用partition/order by硬排序出来或许行,用rank避免最
后那组值的随机性.
没注意sql 2008支持不支持类似currently committed语义。

【在 B*****g 的大作中提到】
: 2008不是改善了吗?另外如果有partition可行吗?
j*****n
发帖数: 1781
83
partitioning will definitely improve the performance.
specially if the partition(s) hold only the records that will be deleted,
then the delete action will take no time via dropping the partition(s).

【在 B*****g 的大作中提到】
: 2008不是改善了吗?另外如果有partition可行吗?
y****w
发帖数: 3747
84
sql大拿说说sql server 2008/denali的锁机制,在并发读写方面的改进?

【在 j*****n 的大作中提到】
: partitioning will definitely improve the performance.
: specially if the partition(s) hold only the records that will be deleted,
: then the delete action will take no time via dropping the partition(s).

c*****d
发帖数: 6045
85
除非你知道每个range在哪个block上

【在 B*****g 的大作中提到】
: 假设每个删除都删除不同的range呢?
i****a
发帖数: 36252
86
I think mainly the time is spend on i/o. But can't tell without a perfmon
trace.

[发表自未名空间手机版 - m.mitbbs.com]

【在 B*****g 的大作中提到】
: 假设每个删除都删除不同的range呢?
B*****g
发帖数: 34098
87
他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
以独立

【在 y****w 的大作中提到】
: 并发delete总是要受影响的吧。各个并发之间必须有严格的界限,不然以set的无序特
: 性,跑跑就锁死了,或操作旧数据了。
: lz这个没table partition,用partition/order by硬排序出来或许行,用rank避免最
: 后那组值的随机性.
: 没注意sql 2008支持不支持类似currently committed语义。

B*****g
发帖数: 34098
88
server上很多CPU的

【在 i****a 的大作中提到】
: I think mainly the time is spend on i/o. But can't tell without a perfmon
: trace.
:
: [发表自未名空间手机版 - m.mitbbs.com]

B*****g
发帖数: 34098
89
zkss

【在 c*****d 的大作中提到】
: 除非你知道每个range在哪个block上
i****a
发帖数: 36252
90
Not cpu. I'm refering to disk i/o.
Without optimizing query, most likely the bottle neck is at i/o. Running
mulitple instances of the query wouldn't help if they all wait for the disk.

[发表自未名空间手机版 - m.mitbbs.com]

【在 B*****g 的大作中提到】
: server上很多CPU的
相关主题
which one is faster? truncate or delete?新手一问,关于delete和truncate table
INSERT or UPDATE, which is faster?Re: 菜人问问,你们都在database上干什么?? (转载)
truncate和delete在ORACLE里有什么区别?什么时候不用索引
进入Database版参与讨论
B*****g
发帖数: 34098
91
这个table显然是需要partition,哈哈

【在 j*****n 的大作中提到】
: partitioning will definitely improve the performance.
: specially if the partition(s) hold only the records that will be deleted,
: then the delete action will take no time via dropping the partition(s).

B*****g
发帖数: 34098
92
多几个SQL就把Disk搞死了,呵呵

disk.

【在 i****a 的大作中提到】
: Not cpu. I'm refering to disk i/o.
: Without optimizing query, most likely the bottle neck is at i/o. Running
: mulitple instances of the query wouldn't help if they all wait for the disk.
:
: [发表自未名空间手机版 - m.mitbbs.com]

y****w
发帖数: 3747
93
lz这个瓶颈我认为是因为batch size太小带来的循环冗余开销。原先那个sql跑起来估计机器的
cpu/io都不能真正忙起来,但换个角度过来说,总体cpu/io比一次删除的要多了n多倍。
他那个表有400M rows,是个大型库,机器应该差不到哪里去,日志配置应该也不会太
小气。删10M记录应该比做1000次每次10000条要快的多,lz的要求也就是提高一半,改
下batch size应该够用了。lz应该试试然后贴个结果上来。

Running
the
disk.

【在 i****a 的大作中提到】
: Not cpu. I'm refering to disk i/o.
: Without optimizing query, most likely the bottle neck is at i/o. Running
: mulitple instances of the query wouldn't help if they all wait for the disk.
:
: [发表自未名空间手机版 - m.mitbbs.com]

B*****g
发帖数: 34098
94
这个需要测试,据俺测试oracle9i,一般来说1w和10w差不多。另外lz的code为啥要
hardcode 10000很多次?

估计机器的
倍。

【在 y****w 的大作中提到】
: lz这个瓶颈我认为是因为batch size太小带来的循环冗余开销。原先那个sql跑起来估计机器的
: cpu/io都不能真正忙起来,但换个角度过来说,总体cpu/io比一次删除的要多了n多倍。
: 他那个表有400M rows,是个大型库,机器应该差不到哪里去,日志配置应该也不会太
: 小气。删10M记录应该比做1000次每次10000条要快的多,lz的要求也就是提高一半,改
: 下batch size应该够用了。lz应该试试然后贴个结果上来。
:
: Running
: the
: disk.

y****w
发帖数: 3747
95
随手的脚本写法,保证能删光,又不想费事儿去搞到精确的批次,要不加个@@rowcount
=0跳出来也就行了。

【在 B*****g 的大作中提到】
: 这个需要测试,据俺测试oracle9i,一般来说1w和10w差不多。另外lz的code为啥要
: hardcode 10000很多次?
:
: 估计机器的
: 倍。

y****w
发帖数: 3747
96
这么多的行删除,需要的行锁太多; 如果锁升级的话影响怎样,页锁/表锁会破坏本来sql语句之间的
隔离?。 sql server没那么熟,不好说。

【在 B*****g 的大作中提到】
: 他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
: 以独立

B*****g
发帖数: 34098
97
等待大牛中

sql语句之间的

【在 y****w 的大作中提到】
: 这么多的行删除,需要的行锁太多; 如果锁升级的话影响怎样,页锁/表锁会破坏本来sql语句之间的
: 隔离?。 sql server没那么熟,不好说。

a9
发帖数: 21638
98
先把不重要的索引删掉。

【在 b**a 的大作中提到】
: Now we can only delete them in 1 hour. How to make it in 30 mins?
: Thanks,
: Ming
: Update:
: Tried all i can except partitioned table. We cannot drop the index and rebuild it because other hourly sql job is going to insert a lot of records in the same table. Seemed no way to ensure it will finish in 30 mins so my solution is to add a waitfor delay 0.2 in every loop. In this way, the delete will finish much longer (2:30) but it will not affect any other jobs.

c*****d
发帖数: 6045
99
假如你run 10个batch,这些batch都在修改同一个db block or db page

【在 B*****g 的大作中提到】
: zkss
c*****d
发帖数: 6045
100
时间字段上的range ---逻辑
data blocks range ---物理
一般情况下是不会一一对应的
很可能一个block上有今天的数据,也有100年以前的数据

【在 B*****g 的大作中提到】
: 他那个有时间range,可以人为地分成几个range,sql其实是不同的,数据相互间就可
: 以独立

相关主题
SQL Server Replication怎么老RECOMPILE啊Oracle求助,thanks!!!
再问I/O WAIT的问题请问T-SQL中Group By之后怎么找到特定的record
delete求大量数据每天更新的解决方案
进入Database版参与讨论
y****w
发帖数: 3747
101
数据量小时行锁就行了。lz这个行锁肯定不够用,要上页锁甚至表锁。看dbms具体实现lock wait
的时间可能差很多。 逻辑上独立这个前提就有可能导致实现上的优化。所以我说还是得真懂sql
server的来说说sql server目前以及可预期版本的实现。
再说今天很对的东西,过几年也许就变成错的了。

【在 c*****d 的大作中提到】
: 时间字段上的range ---逻辑
: data blocks range ---物理
: 一般情况下是不会一一对应的
: 很可能一个block上有今天的数据,也有100年以前的数据

B*****g
发帖数: 34098
102
同一时间在一起的可能性很大。LZ每次就锁1w个,delete01也许会lock delete02、03
,但总不会把02-10(假设开10个)都lock住吧。当然,对SQL server的lock不是很精
通,期待大牛详解SQL server Lock。另外如果SQL搞不定,可以考虑hibernate。

【在 c*****d 的大作中提到】
: 时间字段上的range ---逻辑
: data blocks range ---物理
: 一般情况下是不会一一对应的
: 很可能一个block上有今天的数据,也有100年以前的数据

c*****d
发帖数: 6045
103
“同一时间在一起的可能性很大”,未必,看应用
OLTP一个block上什么时间的数据都会有

03

【在 B*****g 的大作中提到】
: 同一时间在一起的可能性很大。LZ每次就锁1w个,delete01也许会lock delete02、03
: ,但总不会把02-10(假设开10个)都lock住吧。当然,对SQL server的lock不是很精
: 通,期待大牛详解SQL server Lock。另外如果SQL搞不定,可以考虑hibernate。

c*****d
发帖数: 6045
104
我没搞清楚lz是必须用sql delete的方法来删除
还是可以用其他方法来实现?
B*****g
发帖数: 34098
105
据说hibernate比SQL快

【在 c*****d 的大作中提到】
: 我没搞清楚lz是必须用sql delete的方法来删除
: 还是可以用其他方法来实现?

y****w
发帖数: 3747
106
这sql得写多烂?

【在 B*****g 的大作中提到】
: 据说hibernate比SQL快
b**a
发帖数: 1118
107
yes we have to do it in sql.

【在 c*****d 的大作中提到】
: 我没搞清楚lz是必须用sql delete的方法来删除
: 还是可以用其他方法来实现?

y****w
发帖数: 3747
108
have you tried bigger batch size? start with 1M.

【在 b**a 的大作中提到】
: yes we have to do it in sql.
b**a
发帖数: 1118
109
Log drive does not have that big space...
Thanks.
Ming

【在 y****w 的大作中提到】
: have you tried bigger batch size? start with 1M.
j*******7
发帖数: 6300
110
那个Delete语句可以这么写:
DELETE TOP(10000) FROM Transactions
WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
Not sure if it's faster. The "select *" is bad in my eyes.
相关主题
求大量数据每天更新的解决方案养老院人事 SQL难题解法综述 -- 申精
来做sql题目。SQL Server Question: how delete works
webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决sql server 怎么关掉log
进入Database版参与讨论
b**a
发帖数: 1118
111
http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
According to that link, that is faster actually than delete directly...

【在 j*******7 的大作中提到】
: 那个Delete语句可以这么写:
: DELETE TOP(10000) FROM Transactions
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
: Not sure if it's faster. The "select *" is bad in my eyes.

j*******7
发帖数: 6300
112
Thank you. An old dog can still learn a new trick.

【在 b**a 的大作中提到】
: http://sqlblogcasts.com/blogs/simons/archive/2009/05/22/DELETE-
: According to that link, that is faster actually than delete directly...

y****w
发帖数: 3747
113
应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
差别才对,假如sql optimizer没干傻事的话。

【在 j*******7 的大作中提到】
: 那个Delete语句可以这么写:
: DELETE TOP(10000) FROM Transactions
: WHERE TransStartTime >= @FromDate and TransStartTime < @EndDate
: Not sure if it's faster. The "select *" is bad in my eyes.

B*****g
发帖数: 34098
114
顶,tuning就是调试

【在 y****w 的大作中提到】
: 应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
: 差别才对,假如sql optimizer没干傻事的话。

t****3
发帖数: 2337
115
用TRUNCATE
b**a
发帖数: 1118
116
This is a variation from this article. Sounds very reasonable so I did not
do test.
Plus i do not have enough space and data in our dev platform to test so...
I am not a sql guy...

【在 y****w 的大作中提到】
: 应该测试下,网上错的东西太多了,昨天对的今天也许就错了。这两种应该几乎没什么
: 差别才对,假如sql optimizer没干傻事的话。

B*****g
发帖数: 34098
117
加入CINAOUG,你也可以成为sql guy

【在 b**a 的大作中提到】
: This is a variation from this article. Sounds very reasonable so I did not
: do test.
: Plus i do not have enough space and data in our dev platform to test so...
: I am not a sql guy...

g***l
发帖数: 18555
118
建一个一模一样的TABLE名字是TABLE_TEMP,注意PK, INDEXES, BULK INSERT(或者BCP)你想留住
的RECORD INTO TABLE_TEMP,DROP OLD TABLE, RENAME TABLE_TEMP TO TABLE,
RECOMPILE TABLE,没做好INDEX,又没弄PARTITION的,只嫩用这种方法
s*****o
发帖数: 303
119
试过disable index, 然后 rebuild 么?不是drop index
g***l
发帖数: 18555
120
没有INDEX不删的更慢么,DELETE WHERE上要有INDEX,然后BATCH的删
相关主题
问个优化的问题INSERT or UPDATE, which is faster?
Oracle 请问怎么删除一个实时都在更新的表里的历史数据truncate和delete在ORACLE里有什么区别?
which one is faster? truncate or delete?新手一问,关于delete和truncate table
进入Database版参与讨论
s*****o
发帖数: 303
121
是的,只留要用的index. 要是删除很多record,还不如重建一个table放不删的数据快

【在 g***l 的大作中提到】
: 没有INDEX不删的更慢么,DELETE WHERE上要有INDEX,然后BATCH的删
1 (共1页)
进入Database版参与讨论
相关主题
truncate和delete在ORACLE里有什么区别?请问T-SQL中Group By之后怎么找到特定的record
新手一问,关于delete和truncate table求大量数据每天更新的解决方案
Re: 菜人问问,你们都在database上干什么?? (转载)来做sql题目。
什么时候不用索引webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
SQL Server Replication怎么老RECOMPILE啊养老院人事 SQL难题解法综述 -- 申精
再问I/O WAIT的问题SQL Server Question: how delete works
deletesql server 怎么关掉log
Oracle求助,thanks!!!问个优化的问题
相关话题的讨论汇总
话题: delete话题: sql话题: table话题: 10000