2016-01-15 15 views
7

Mam stolik z około 246 tysiącami rekordów. Ma około 25 kolumn, wszystkie są liczbami całkowitymi z wyjątkiem jednego małego obiektu typu blob.Proste zapytanie Firebirda bardzo powolne

Gdybym kwerendy tabeli na wszystkich polach

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

on wykonywany w ramach sekundę. Ale jeśli dołączę tylko identyfikator rekordu

select a.recordID from ARTrans a 

Wykonanie trwa 20 sekund. Większość czasu spędza się na planowaniu (Natural), co wydaje się dziwne, ponieważ w większości przypadków mam indeks na recordid.

Mam zebrane śmieci, odtworzone indeksy, usunięte indeksy, dodano tylko jeden indeks na RecordID i nadal jest super wolny.

Każda pomoc zostanie bardzo doceniona.

Edited by podać więcej informacji:

Firebird: 2.5.3.26778

fbclient.dll: 2.5.1.26351

Nie ma nikogo w bazie danych, mam przeniósł go lokalny.

Oto tabela def

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); 

instrukcja SQL:

SELECT a.RECORDID FROM ARTRANS a 

Plan (wyjście z 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. 

oświadczenie to SQL działa bez zarzutu:

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. 

Ponadto należy dodać, że istnieją 246804 rekordy i zajęło prawie minutę, aby uzyskać zliczania.

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. 

Aktualizacja

Gdybym usunąć kolumnę blob, zyski wydajności. Jeśli zostawię to i NULL wszystkie wartości, wydajność jest nadal szybka. Jeśli zaktualizować pola blob na każdym rekordzie zawiera strumień, który jest 20 bajtów, wydajność sięga ponad 20 sekund, aby wykonać proste zapytanie

select a.RecordID from ARTrans a 

poszedłem jeszcze dalej i usunięte wszystkie kolumny z wyjątkiem pola blob i recordID i wciąż dostaję powolność. Wydaje się, że to było widziane wcześniej. Bardzo dziwne.

+0

Jaką wersję FB? Czy możesz nam pokazać dokładne zapytania? (Jestem prawie pewien, że twoje drugie zapytanie w formie pisemnej jest błędem odnoszącym się do aliasu, którego nie zdefiniowałeś.) A co z dokładnymi PLANami? – pilcrow

+0

Właśnie dodana wersja, 2.5 – cjmarques

+0

Co stanie się z wydajnością, jeśli dodasz [magic 'RDB $ DB_KEY'] (http://www.ibexpert.net/ibe/index.php?n=Doc.TheMysteryOfRDBDBKEY) (pozycja rekordu fizycznego) do wolnego zapytania i usunąć je z szybkiego zapytania? – pilcrow

Odpowiedz

1

Aby poprawić wydajność, utwórz oddzielną tabelę z tylko wypełnionymi identyfikatorami i obiektami blob i dołącz do niej tylko wtedy, gdy potrzebujesz tego pliku blob. Użyj liczby (RECORDID), jeśli potrzebujesz zliczyć wiersze (ponieważ jest indeksowana i nie ma wartości NULL dla wszystkich wierszy).

Powiązane problemy