如何加快更新SQL
我有480条对此我只有一个叫MY_BOOK表执行使用后记组件在Delphi 2010如何加快更新SQL
更新SQL更新数据更新的SQL语句,但与MY_BOOK_HEADER表的连接。下面是更新SQL,它需要81秒来执行所有480个更新SQL语句。任何想法如何提高这480个更新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
);
可以使用合并声明,这样的....:
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
感谢您在MB.BOOK_TYPE = 4更正我的答案。 – dsonda
最受欢迎... –
下面的答案我是从火鸟小组。这个答案只是为了知识共享。
从火鸟集团评论是如下,其中包括执行语句块,以及:
如果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 BLOCK自己时,我更愿意添加这样一个变量,以确定我只更新了我要更新的10个记录,而不是100万,因为 忘记一些重要的东西在JOIN或WHERE子句中。
我想执行块尤其可以提高性能
一)你只需要减少在My_Book, 和/或 B中的记录一小部分)的EXISTS子句是复杂和耗时
如果My_Book和My_Book_Header都是带有合理的 索引的小表,则使用execute block可能没有帮助。
你能详细说明为什么你需要480个吗?这些陈述之间有什么变化? – Mureinik
可能缺乏索引。如果你解释你的查询计划,我会打赌涉及到TABLE SCAN。 – duffymo
我从excel文件导入数据,因此出现一个循环,在那个循环中,很多SQL正在执行,并且正在减慢应用程序的运行速度,所以我只将所有SQL保存在ADScript组件中,并且一旦数据收集完成,那么我正在执行它们 - > ADScript.ValidateAll;然后ADScript.ExecuteAll; –