我正在优化工作票的Firebird 2.5数据库。它们存储在这样声明的表中:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
我通常想查找尚未处理的第一张票证并且处于Pending
状态。
我的处理循环将是:
- 取回第一张票
Pending
- 使用票务。
- 更新故障单状态=>
Complete
- 重复。
没什么好看的。如果在此循环运行时正在观察数据库,则可以看到每次迭代的索引读取次数都在增加。据我所知,性能似乎并没有显着下降,但是我正在测试的机器很快。但是,我从一些用户那里收到了性能随时间下降的报告。
我在上有一个索引Status
,但看起来仍然像它在Ticket_Id
每次迭代时向下扫描列。似乎我正在忽略某些内容,但是我不确定是什么。是这种预期的索引读取数目攀升,还是索引行为异常?
-编辑评论-
在Firebird中,您可以限制行检索,例如:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
因此,当我说“第一”时,我只是在询问它在哪里的有限记录集Status = 'Pending'
。
ticket_id
,你需要probbaly的索引(status, ticket_id)
ticket_id
实际包含的效果要比仅对Status进行索引要差。
id
(数据类型)你定义域?