如何加快更新SQL

时间:2015-10-14 14:34:45

标签: sql firebird

我有使用Delphi 2010中的ADScript组件执行的480个更新SQL语句。

仅在一个名为MY_BOOK的表中更新SQL更新数据,但是有一个与MY_BOOK_HEADER表的连接。下面是Update SQL,执行所有480个Update SQL语句需要81秒。知道如何才能提高这些480 Update SQL语句的速度?

更新SQL:

Update MY_BOOK MB SET BOOK_NAME = 'Book Name1' , BOOK_DESCRIPTION = 'Book Desfcription1' 
Where MB.BOOK_TYPE = 4 And 
Exists (Select 1 from MY_BOOK_HEADER MBH 
            Where  
                MBH.HEADER_BOOK_CODE = '127518010109038'
                And MBH.FK_BOOK_GROUP =  '{79B79C33-CE56-4084-912B-6DD9F70B3DC4}'
                And MBH.PK_BOOK_HEADER = MB.SK_BOOK_HEADER
        );

2 个答案:

答案 0 :(得分:0)

您可以使用合并语句,例如....:

merge into MY_BOOK MB
using MY_BOOK_HEADER MBH
  on (MB.SK_BOOK_HEADER = MBH.PK_BOOK_HEADER and
      MB.BOOK_TYPE = 4 and
      MBH.HEADER_BOOK_CODE = '127518010109038' and
      MBH.FK_BOOK_GROUP =  '{79B79C33-CE56-4084-912B-6DD9F70B3DC4}')
when matched then
  update set
    MB.BOOK_NAME = 'Book Name1',
    MB.BOOK_DESCRIPTION = 'Book Desfcription1';

参考:http://www.firebirdsql.org/refdocs/langrefupd21-merge.html

答案 1 :(得分:0)

下面我从Firebird小组那里得到了它。这个答案仅适用于知识共享。

Firebird Group的评论如下:其中包括Execute Block语句:

如果PK是MY_BOOK的整数主键,那么你应该可以 做这样的事情:

execute block returns(Changes integer) as
declare variable mbPK integer;
begin
Changes = 0;
for select distinct MB.PK
from MY_BOOK MB
join MY_BOOK_HEADER MBH on MBH.PK_BOOK_HEADER = MB.SK_BOOK_HEADER
where MB.BOOK_TYPE = 4
and Upper(Trim(MBH.HEADER_BOOK_CODE)) = Upper(Trim('127518010109038'))
--UPPER and TRIM doesn't make any difference to a constant containing 
--only digits and no whitespace...
And MBH.FK_BOOK_GROUP = '{79B79C33-CE56-4084-912B-6DD9F70B3DC4}'
into :mbPK do
begin
update My_Book SET BOOK_NAME = 'Book Name1', BOOK_DESCRIPTION = 
'Book Description1'
where PK = :mbPK;
Changes = Changes + ROW_COUNT;
end
suspend;
end

'更改'和'暂停'不是必需的,但每当我使用EXECUTE时 阻止自己,我更喜欢添加这样一个变量来确定我只是 更新我要更新的十条记录而不是一百万条记录 忘记JOIN或WHERE子句中的重要内容。

我认为执行块可以特别提高性能

a)你只想减少My_Book中的一小部分记录, 和/或 b)EXISTS条款复杂且耗时

如果My_Book和My_Book_Header都是合理的小表 索引,使用执行块可能很少或没有帮助。