2016-01-15 30 views
7

Ich habe eine Tabelle mit etwa 246k Datensätze. Es hat ungefähr 25 Spalten, alle sind ganze Zahlen außer einem kleinen Fleck.Einfache Firebird Abfrage sehr langsam

Wenn ich die Tabelle Abfrage auf allen Feldern

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

Sie führt unter einer Sekunde. Aber wenn ich nur die Datensatz-ID

enthalten dauert es 20+ Sekunden zu führen. Die meiste Zeit ist Planung (Natural) ausgegeben, die seltsam scheint, da ich in den meisten Fällen einen Index über Recordid habe.

Ich habe Müll gesammelt, Indizes neu erstellt, Indizes entfernt, nur einen Index auf RecordID hinzugefügt und es ist immer noch super langsam.

Jede Hilfe würde sehr geschätzt werden.

Edited mehr Informationen zu geben:

Firebird: 2.5.3.26778

fbclient.dll: 2.5.1.26351

Es ist sonst niemand in der Datenbank habe ich es verschoben lokal. Hier

ist die Tabelle 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); 

SQL-Anweisung:

SELECT a.RECORDID FROM ARTRANS a 

Plan (Ausgabe von 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. 

Diese SQL-Anweisung funktioniert:

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. 

auch hinzufügen, sollte ich, dass es 246.804 Datensätze sind und es dauerte fast eine Minute, um die Zählung zu erhalten.

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. 

aktualisieren

Wenn ich die Blob-Spalte Performanceerträge löschen. Wenn ich es hinterlasse und alle Werte NULL ausweise, ist die Leistung immer noch schnell. Wenn ich das BLOB-Feld auf jedem Datensatz aktualisieren, um einen Strom zu enthalten, die 20 Bytes ist, die Leistung geht zurück auf mehr als 20 Sekunden, um die einfache Abfrage

select a.RecordID from ARTrans a 

Ich ging sogar noch weiter auszuführen und gelöscht alle Spalten mit Ausnahme des BLOB-Feld und Die RecordID und ich bekomme immer noch die Langsamkeit. Scheint so, als wäre das schon mal gesehen worden. Sehr merkwürdig.

+0

Welche Version FB? Können Sie uns die genauen Fragen zeigen? (Ich bin mir ziemlich sicher, dass Ihre zweite Anfrage, wie geschrieben, ein Fehler ist, der sich auf einen Alias ​​bezieht, den Sie nicht definiert haben.) Wie wäre es mit den genauen PLANs? – pilcrow

+0

gerade hinzugefügt Version, 2.5 – cjmarques

+0

Was passiert mit der Leistung, wenn Sie die [magische 'RDB $ DB_KEY'] hinzufügen (http://www.ibexpert.net/ibe/index.php?n=Doc.TheMysteryOfRDBDBKEY) (physische Position) zur langsamen Abfrage und entferne sie von der schnellen Abfrage? – pilcrow

Antwort

1

Um die Leistung zu verbessern, erstellen Sie eine separate Tabelle mit nur ID und BLOB-Feld und fügen Sie sie nur dann Ihrer Tabelle hinzu, wenn Sie dieses BLOB-Feld benötigen. Und verwenden Sie zählen (RECORDID), wenn Sie Zeilen zählen müssen (weil es indiziert ist und nicht für alle Zeilen null).