Simple Firebird request is very slow

I have a table with approximately 246 thousand records. It contains about 25 columns, all of which are integers, except for one small blob.

If I query the table in all fields

select a.recordid, a.editcount, ect.. from ARTrans a 

Runs in a second. But if I include only the record identifier

 select a.recordID from ARTrans a 

It takes 20 seconds. Most of the time I spend scheduling (Natural), which seems weird because in most cases I have an index on the records.

I collected garbage, recreated indexes, deleted indexes, added only one index to RecordID, and it is still very slow.

Any help would be greatly appreciated.

Edited to provide additional information:

Firebird: 2.5.3.26778

fbclient.dll: 2.5.1.26351

There is no one else in the database, I moved it locally.

Here is the def table

 CREATE TABLE ARTRANS ( RECORDID Integer NOT NULL, EDITCOUNT Smallint, CLASSIFICATION Smallint, TRANSID Integer, DATEENTERED Integer, CLIENTID Integer, TRANSTYPE Smallint, BILLED Smallint, FINALIZEID Smallint, INVOICEID Integer, INVOICENUM Integer, INVOICEDATE Integer, GROUPID Smallint, EXPORTED Char(1), TRANSVALUE Decimal(18,4), DESCRIPTION Blob sub_type 0, POSTPERIOD Smallint, LINKEDTRANSID Integer, LINKEDINVID Integer, LINKEDFUNDSID Integer, INFOONLY Smallint, NEEDTRANSFER Char(1), DESTTRANSID Integer, LSTTKREDIT Integer, SPELLNGRAMMARCHECKSTATUS Smallint ); 

Index

 CREATE UNIQUE INDEX IDX_ARTRANSRecID ON ARTRANS (RECORDID); 

SQL statement:

 select a.recordID from ARTrans a 

Plan (withdrawal from flamerobin)

 Preparing query: SELECT a.RECORDID FROM ARTRANS a Prepare time: 20.008s Field #01: ARTRANS.RECORDID Alias:RECORDID Type:INTEGER PLAN (A NATURAL) Executing... Done. 13257 fetches, 0 marks, 76 reads, 0 writes. 0 inserts, 0 updates, 0 deletes, 0 index, 6552 seq. Delta memory: -19204 bytes. Total execution time: 20.025s Script execution finished. 

This SQL statement works just fine:

 Preparing query: SELECT a.RECORDID, a.EDITCOUNT, a.CLASSIFICATION, a.TRANSID, a.DATEENTERED, a.CLIENTID, a.TRANSTYPE, a.BILLED, a.FINALIZEID, a.INVOICEID, a.INVOICENUM, a.INVOICEDATE, a.GROUPID, a.EXPORTED, a.TRANSVALUE, a.DESCRIPTION, a.POSTPERIOD, a.LINKEDTRANSID, a.LINKEDINVID, a.LINKEDFUNDSID, a.INFOONLY, a.NEEDTRANSFER, a.DESTTRANSID, a.LSTTKREDIT, a.SPELLNGRAMMARCHECKSTATUS, a.RDB$DB_KEY FROM ARTRANS a Prepare time: 0.013s Field #01: ARTRANS.RECORDID Alias:RECORDID Type:INTEGER Field #02: ARTRANS.EDITCOUNT Alias:EDITCOUNT Type:SMALLINT Field #03: ARTRANS.CLASSIFICATION Alias:CLASSIFICATION Type:SMALLINT Field #04: ARTRANS.TRANSID Alias:TRANSID Type:INTEGER Field #05: ARTRANS.DATEENTERED Alias:DATEENTERED Type:INTEGER Field #06: ARTRANS.CLIENTID Alias:CLIENTID Type:INTEGER Field #07: ARTRANS.TRANSTYPE Alias:TRANSTYPE Type:SMALLINT Field #08: ARTRANS.BILLED Alias:BILLED Type:SMALLINT Field #09: ARTRANS.FINALIZEID Alias:FINALIZEID Type:SMALLINT Field #10: ARTRANS.INVOICEID Alias:INVOICEID Type:INTEGER Field #11: ARTRANS.INVOICENUM Alias:INVOICENUM Type:INTEGER Field #12: ARTRANS.INVOICEDATE Alias:INVOICEDATE Type:INTEGER Field #13: ARTRANS.GROUPID Alias:GROUPID Type:SMALLINT Field #14: ARTRANS.EXPORTED Alias:EXPORTED Type:STRING(1) Field #15: ARTRANS.TRANSVALUE Alias:TRANSVALUE Type:NUMERIC(18,4) Field #16: ARTRANS.DESCRIPTION Alias:DESCRIPTION Type:BLOB SUB_TYPE 0 Field #17: ARTRANS.POSTPERIOD Alias:POSTPERIOD Type:SMALLINT Field #18: ARTRANS.LINKEDTRANSID Alias:LINKEDTRANSID Type:INTEGER Field #19: ARTRANS.LINKEDINVID Alias:LINKEDINVID Type:INTEGER Field #20: ARTRANS.LINKEDFUNDSID Alias:LINKEDFUNDSID Type:INTEGER Field #21: ARTRANS.INFOONLY Alias:INFOONLY Type:SMALLINT Field #22: ARTRANS.NEEDTRANSFER Alias:NEEDTRANSFER Type:STRING(1) Field #23: ARTRANS.DESTTRANSID Alias:DESTTRANSID Type:INTEGER Field #24: ARTRANS.LSTTKREDIT Alias:LSTTKREDIT Type:INTEGER Field #25: ARTRANS.SPELLNGRAMMARCHECKSTATUS Alias:SPELLNGRAMMARCHECKSTATUS Type:SMALLINT Field #26: ARTRANS.DB_KEY Alias:DB_KEY Type:STRING(8) PLAN (A NATURAL) Executing... Done. 1135 fetches, 0 marks, 7 reads, 0 writes. 0 inserts, 0 updates, 0 deletes, 0 index, 560 seq. Delta memory: 25852 bytes. Total execution time: 0.047s Script execution finished. 

In addition, I must add that there are 246,804 entries, and it took almost a minute to get the bill.

 Preparing query: SELECT count(*) FROM ARTRANS a Prepare time: 52.614s Field #01: .COUNT Alias:COUNT Type:INTEGER PLAN (A NATURAL) Executing... Done. 499643 fetches, 0 marks, 3016 reads, 0 writes. 0 inserts, 0 updates, 0 deletes, 0 index, 246804 seq. Delta memory: -18576 bytes. Total execution time: 52.716s Script execution finished. 

Update

If I remove the blob column, performance will return. If I leave it and NULL out of all the values, the performance will be still fast. If I update the blob field on each record to contain a stream of 20 bytes, the performance returns to 20 + seconds to complete a simple query

 select a.recordID from ARTrans a 

I went even further and deleted all the columns except the blob and recordID fields and I still get slowness. It looks like it would be earlier. Very strange.

+7
performance sql firebird
source share
1 answer

To improve performance, create a separate table with only registered id and blob and attach it to your table only if you need this entry. And use count (RECORDID) if you need to count the rows (because they are indexed and are not null for all rows).

+1
source share

All Articles