2016-01-15 59 views
7

Yaklaşık 246k kayıt içeren bir tablom var. Yaklaşık 25 sütun var, hepsi küçük bir blob hariç tamsayılar. Ben tüm alanlarıBasit Firebird sorgusu çok yavaş

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

tabloyu sorgula Eğer

Bir saniyenin altında yürütür. Ancak, yalnızca kayıt no

Kayıtları yürütmek 20 + saniye alır. Çoğu zaman zamandan beri garip görünen planlama (Doğal) harcanıyor, çoğu durumda, plak üzerinde bir indeks var.

Toplanan çöpleri topladım, yeniden oluşturulmuş dizinler, kaldırılmış dizinler, yalnızca bir indeksi RecordID'ye ekledim ve hala çok yavaş.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

daha fazla bilgi vermek Düzenlendi:

Firebird: 2.5.3.26778

fbclient.dll: 2.5.1.26351

veritabanında başka kimse yok, ben taşımış yerel.

SELECT a.RECORDID FROM ARTRANS a 

Planı (FlameRobin çıktı)

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. 
012: İşte

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

Endeksi

CREATE UNIQUE INDEX IDX_ARTRANSRecID ON ARTRANS (RECORDID); 

SQL deyimi

Bu SQL deyimi çalışıyor: Ayrıca

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. 

, orada 246.804 kayıtları vardır ve sayım sonucuna varmak için neredeyse bir dakika sürdü olduğunu eklemek gerekir.

ben damla sütun, performans döner silerseniz

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. 

Güncelleme. Onu tüm değerler içinde ve NULL olarak bırakırsam, performans hala hızlıdır. Ben 20 bayt olan bir akışı içerecek şekilde her kaydında damla alanı güncellerseniz, performans ben daha da ileri gitti ve blob alanı hariç tüm sütunları silinmiş ve

select a.RecordID from ARTrans a 

basit sorgu gerçekleştirmek için geri 20+ saniye gider recordID ve hala yavaşlığı alıyorum. Bu daha önce görülmüş gibi görünüyor. Çok garip.

+0

Hangi sürüme FB? Bize tam soruları gösterebilir misin? (Eminim ki, ikinci sorgunuz, tanımladığınız bir takma ismiyle ilgili bir hatadır.) Kesin PLAN'lara ne dersiniz? – pilcrow

+0

sadece sürüm eklendi, 2.5 – cjmarques

+0

[magic 'RDB $ DB_KEY '] eklerseniz performansa ne olur? (Http://www.ibexpert.net/ibe/index.php?n=Doc.TheMysteryOfRDBDBKEY) (fiziksel kayıt konumu)) yavaş sorguya ve hızlı sorgudan kaldırmak için? – pilcrow

cevap

1

Performansı iyileştirmek için, yalnızca id ve blob dosyalanmış ayrı bir tablo oluşturun ve yalnızca bu blob dosyasına ihtiyacınız varsa masanızla birleştirin. Ve sayım satırları gerekiyorsa (tüm satırlar için null ve null değil çünkü) sayımı (RECORDID) kullanın.