我有一个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;
任何帮助将不胜感激。
感谢。
答案 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)