2016-01-15 15 views
7

Ho una tabella con circa 246k di record. Ha circa 25 colonne, tutte sono numeri interi tranne un piccolo blob.Domanda Firebird semplice molto lenta

Se interrogo la tabella su tutti i campi

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

Esegue in meno di un secondo. Ma se includo solo l'ID del record

select a.recordID from ARTrans a 

Sono necessari più di 20 secondi per l'esecuzione. La maggior parte del tempo è dedicata alla pianificazione (naturale) che sembra strana poiché, nella maggior parte dei casi, ho un indice su recordid.

Ho raccolto dati inutili, ho ricreato indici, rimosso indici, aggiunto solo un indice su RecordID ed è ancora super lento.

Qualsiasi aiuto sarebbe molto apprezzato.

A cura di dare più informazioni:

Firebird: 2.5.3.26778

fbclient.dll: 2.5.1.26351

Non c'è nessun altro nel database, ho spostato Locale.

Ecco la tabella 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 
); 

Indice

CREATE UNIQUE INDEX IDX_ARTRANSRecID ON ARTRANS (RECORDID); 

istruzione SQL:

SELECT a.RECORDID FROM ARTRANS a 

Plan (in uscita dal 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. 

economico Questa SQL funziona bene:

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. 

Inoltre, devo aggiungere che ci sono 246804 record e c'è voluto quasi un minuto per ottenere il conteggio.

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. 

Aggiornamento

Se cancello la colonna blob, i rendimenti delle prestazioni. Se lo lascio in e NULL tutti i valori, le prestazioni sono ancora veloci. Se aggiorno il campo blob su ogni record per contenere un flusso che è 20 byte, prestazioni risale al 20 + secondi per eseguire la query semplice

select a.RecordID from ARTrans a 

sono andato anche oltre e ha cancellato tutte le colonne ad eccezione del campo blob e il recordID e sto ancora ricevendo la lentezza. Sembra che questo sarebbe stato visto prima. Molto strano.

+0

Quale versione FB? Puoi mostrarci le query esatte? (Sono abbastanza sicuro che la tua seconda query scritta sia un errore che si riferisce ad un alias che non hai definito.) E i PLAN esatti? – pilcrow

+0

versione appena aggiunta, 2.5 – cjmarques

+0

Cosa succede alle prestazioni se si aggiunge il [magico 'RDB $ DB_KEY'] (http://www.ibexpert.net/ibe/index.php?n=Doc.TheMysteryOfRDBDBKEY) (posizione record fisica) alla query lenta e rimuoverla dalla query veloce? – pilcrow

risposta

1

Per migliorare le prestazioni, creare una tabella separata con solo ID e blob archiviati e aggiungerla alla tabella solo se è necessario archiviare questo BLOB. E usa il conteggio (RECORDID) se hai bisogno di contare le righe (perché è indicizzato e non nullo per tutte le righe).