2015-10-14 44 views
-2

我有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 
     ); 
+0

你能詳細說明爲什麼你需要480個嗎?這些陳述之間有什麼變化? – Mureinik

+1

可能缺乏索引。如果你解釋你的查詢計劃,我會打賭涉及到TABLE SCAN。 – duffymo

+0

我從excel文件導入數據,因此出現一個循環,在那個循環中,很多SQL正在執行,並且正在減慢應用程序的運行速度,所以我只將所有SQL保存在ADScript組件中,並且一旦數據收集完成,那麼我正在執行它們 - > ADScript.ValidateAll;然後ADScript.ExecuteAll; –

回答

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

+0

感謝您在MB.BOOK_TYPE = 4更正我的答案。 – dsonda

+0

最受歡迎... –

0

下面的答案我是從火鳥小組。這個答案只是爲了知識共享。

從火鳥集團

評論是如下,其中包括執行語句塊,以及:

如果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可能沒有幫助。