Firebird服务器2.5更新查询太慢

时间:2017-06-29 09:09:39

标签: sql windows firebird

我有一个Firebird数据库。数据库文件大约为80 MB。我有一个varchar(2000)列,我只想更新这个列。 我的确切查询是:

 UPDATE PATIENTS SET IPADLIST = ''

在PATIENTS表中,只有55000名患者。 该服务器具有Core I7处理器和SSD以及8 GB内存。

但查询大约需要10分钟! 在执行查询期间,磁盘使用率为100%。

数据库文件的扩展名是.GDB,我发现Windows监视某些扩展名:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa378870(v=vs.85).aspx

我将扩展名更改为.FDB,但它并没有改变结果。

创建表格的脚本:

 CREATE TABLE PATIENTS
 (
   NOM Varchar(25) COLLATE FR_FR,
   PRENOM Varchar(25) COLLATE FR_FR,
   N_CLIENT Integer NOT NULL,
   D_NAISSANCE Date,
   SEX Varchar(1) COLLATE FR_FR,
   RUE Varchar(255) COLLATE FR_FR,
   BATIMENT Varchar(255) COLLATE FR_FR,
   CODEVILLE Varchar(75) COLLATE FR_FR,
   NOM_A Varchar(25) COLLATE FR_FR,
   PRENOM_A Varchar(25) COLLATE FR_FR,
   TEL_1 Varchar(25) COLLATE FR_FR,
   TEL_2 Varchar(25) COLLATE FR_FR,
   SPORT_1 Varchar(50) COLLATE FR_FR,
   SPORT_2 Varchar(50) COLLATE FR_FR,
   PROFESSION Varchar(75) COLLATE FR_FR,
   MEDECIN_1 Varchar(30) COLLATE FR_FR,
   MEDECIN_2 Varchar(30) COLLATE FR_FR,
   ENVORER Varchar(30) COLLATE FR_FR,
   MEMO Blob sub_type 1,
   MEMOI Blob sub_type 1,
   MEMO_CLE Blob sub_type 1,
   RQUE1 Varchar(100) COLLATE FR_FR,
   RQUE2 Varchar(100) COLLATE FR_FR,
   RQUE3 Varchar(100) COLLATE FR_FR,
   RQUE4 Varchar(100) COLLATE FR_FR,
   NUM_SPORT1 Integer,
   NUM_SPORT2 Integer,
   NUM_MEDECIN1 Integer,
   NUM_MEDECIN2 Integer,
   RQUE5 Varchar(100) COLLATE FR_FR,
   RQUE6 Varchar(100) COLLATE FR_FR,
   RQUE7 Varchar(100) COLLATE FR_FR,
   RQUE8 Varchar(100) COLLATE FR_FR,
   RQUE9 Varchar(100) COLLATE FR_FR,
   RQUE10 Varchar(200) COLLATE FR_FR,
   CODE_POSTAL Varchar(10) COLLATE FR_FR,
   NUM_PROFESSION Integer,
   CIVILITE Varchar(50) COLLATE FR_FR,
   EMAIL Varchar(100) COLLATE FR_FR,
   NUM_VILLE Integer,
   NUM_MEDECIN3 Integer,
   IPADLIST Varchar(1000),
   UPDATEDDATE Timestamp,
   ID_EPODO Integer,
   PRIMARY KEY (N_CLIENT)
 );
 CREATE INDEX NOM ON PATIENTS (NOM);
 GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON PATIENTS TO  SYSDBA WITH GRANT OPTION;

任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:1)

这个db结构没有很好的性能(blob类型和varchar的很多字段)。如果无条件地更新一个字段,firebird将创建大量临时文件以继续查询。 如果您可以更改结构以将IPADLIST移动到另一个表,则可以提高速度。 例如:

CREATE TABLE IPADS (
ID          INTEGER NOT NULL,
IPADLIST    VARCHAR(1000),
PATIENT_ID  INTEGER NOT NULL
);

ALTER TABLE IPADS ADD CONSTRAINT PK_IPADS PRIMARY KEY (ID);

ALTER TABLE IPADS ADD CONSTRAINT FK_IPADS_PATIENTS_ID FOREIGN KEY (PATIENT_ID) REFERENCES PATIENTS (N_CLIENT) ON DELETE CASCADE ON UPDATE CASCADE;

并从患者身上删除ipdadlist

然后,如果患者添加iPad,您只需将患者的N_CLIENT插入iPad表即可 而不是更新你需要只需要从iPad上删除所需的N_CLIENT或所有

答案 1 :(得分:1)

这应该是评论,但我想展示图片

来自你的评论:

  

Firebird存在实际性能问题。作为解决方案,我   创建了一个sqlite数据库文件,我将IPadID保存在这个数据库中。   它有效。

这是使用您的表进行测试的结果(55000条记录)。

在我的笔记本电脑Core I5处理器和8 GB内存上。

Firebird版本2.5.5。

数据库字符集:ISO8859_1

enter image description here