Subject Re: [firebird-support] How To Speed Up Update SQL
Author Vishal Tiwari
HI SET,

PK is GUID type.



On Wednesday, 14 October 2015 10:51 PM, "setysvar setysvar@... [firebird-support]" <firebird-support@yahoogroups.com> wrote:


 
>>1. EXECUTE BLOCK and there for select and delete
>I am completely unaware about execute block. Would you offer any help,
so I could learn from it.

If PK is your integer primary key for MY_BOOK, then you should be able
to do something like this:

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

'Changes' and 'suspend' is not required, but whenever I use EXECUTE
BLOCK myself, I prefer to add such a variable to ascertain that I only
update the ten records I want to update and not one million due to
forgetting something important in the JOIN or WHERE clauses.

I think execute block can particularly improve performance if

a) You only want to reduce a small fraction of the records in My_Book,
and/or
b) the EXISTS clause is complicated and time consuming

If both My_Book and My_Book_Header are small tables with sensible
indexing, using execute block may be of little or no help.

HTH,
Set