简体   繁体   English

简单的Firebird查询非常慢

[英]Simple Firebird query very slow

I have a table with roughly 246k records. 我有一张大约246k记录的表格。 It has about 25 columns, all are integers except one small blob. 它有大约25列,除了一个小blob外都是整数。

If I Query the table on all fields 如果我在所有字段上查询表

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

It executes in under a second. 它在一秒钟内执行。 But if I include only the record id 但是,如果我只包括记录ID

select a.recordID from ARTrans a

It takes 20+ seconds to execute. 执行需要20多秒。 Most of the time is spent planning(Natural) which seems weird since, in most cases, I have an index on recordid. 大部分时间花在计划(自然)上似乎很奇怪,因为在大多数情况下,我有一个关于recordid的索引。

I've garbage collected, recreated indexes, removed indexes, added only one index on RecordID and it's still super slow. 我收集了垃圾,重新创建了索引,删除了索引,在RecordID上只添加了一个索引,但它仍然超级慢。

Any help would be greatly appreciated. 任何帮助将不胜感激。

Edited to give more information: 编辑提供更多信息:

Firebird: 2.5.3.26778 Firebird:2.5.3.26778

fbclient.dll: 2.5.1.26351 fbclient.dll:2.5.1.26351

There is no one else in the database, I've moved it local. 数据库中没有其他人,我已将其移至本地。

Here is the table def 这是表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 statement: SQL语句:

SELECT a.RECORDID FROM ARTRANS a

Plan (output from flamerobin) 计划(来自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 fine: 这个SQL语句工作正常:

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.

Also, I should add that there are 246804 records and it took almost a minute to get the count. 此外,我应该补充说,有246804条记录,并且花了将近一分钟来计算。

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 delete the blob column, performance returns. 如果我删除blob列,则返回性能。 If I leave it in and NULL out all the values, performance is still fast. 如果我保留它并将所有值都清空,性能仍然很快。 If I update the blob field on every record to contain a stream that's 20 bytes, performance goes back to 20+ seconds to perform the simple query 如果我更新每个记录上的blob字段以包含20字节的流,则性能可以追溯到20+秒以执行简单查询

select a.RecordID from ARTrans a

I went even further and deleted all columns except for the blob field and the recordID and I'm still getting the slowness. 我甚至更进一步删除了除了blob字段和recordID之外的所有列,我仍然变慢了。 Seems like this would have been seen before. 看起来像以前一样。 Very weird. 很奇怪。

To improve performance create separate table with only id and blob filed, and join it with your table only if you need this blob filed. 要提高性能,请创建仅包含id和blob字段的单独表,并仅在需要此blob字段时才将其与表连接。 And use count(RECORDID) if you need count rows (because it is indexed and not null for all rows). 如果需要计数行,则使用count(RECORDID)(因为它是索引的,并且对于所有行都不为null)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM