оптимальная организация очереди
Добавлено: 14 авг 2006, 09:16
Firebird 1.5.3 SS
Win2003
P-2800
база 40 мб - диспетчерская такси.
одна из основных задач - ведение очереди водителей.
а проблема в том что эта очередь модифицируется ежесекундно
(ну или раз в 5 секунд).
имеется таблица DRIVER (водители) сокращенно
250 записей. в очереди всего активных 25-30 (у которых parent_id>-1)
первый в очереди - parent_id=0
остальные за ним по цепочке
CREATE TABLE DRIVER (
DRIVER_ID ID /* ID = INTEGER NOT NULL */,
PARENT_ID ID /* ID = INTEGER NOT NULL */)
и наблюдается следующая картина
на свежей базе простейший запрос по индексу отрабатывает моментально.
после работы индекс замусоривается чтоли..... запрос выполняется доли секунды. но это не весь запрос основанный на индексе по parent_id.... и в целом получается что время получения текущей очереди получается порядка 2 секунд (на свежей базе ~ 100мс).
процедура получения очереди рекурсивная (сначала получить первого, потом следующего пока получается).
а вопрос такой - как надо делать очередь в условиях версионности и быстрого накопления мусора ?
на свежеотрестореной базе ....
Query
------------------------------------------------
select driver_id from driver where parent_id=0
Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Adapted Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 0,00 ms
Avg fetch time: 0,00 ms
Memory
------------------------------------------------
Current: 1 865 328
Max : 2 000 244
Buffers: 2 048
Operations
------------------------------------------------
Read : 0
Writes : 6
Fetches: 377
Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| DRIVER| 0 | 4 | 0 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
после 2 часов работы
Query
------------------------------------------------
select driver_id from driver where parent_id=0
Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Adapted Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 250,00 ms
Avg fetch time: 0,00 ms
Memory
------------------------------------------------
Current: 1 865 328
Max : 2 000 244
Buffers: 2 048
Operations
------------------------------------------------
Read : 0
Writes : 6
Fetches: 1867
Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| DRIVER| 0 | 273 | 0 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
Win2003
P-2800
база 40 мб - диспетчерская такси.
одна из основных задач - ведение очереди водителей.
а проблема в том что эта очередь модифицируется ежесекундно
(ну или раз в 5 секунд).
имеется таблица DRIVER (водители) сокращенно
250 записей. в очереди всего активных 25-30 (у которых parent_id>-1)
первый в очереди - parent_id=0
остальные за ним по цепочке
CREATE TABLE DRIVER (
DRIVER_ID ID /* ID = INTEGER NOT NULL */,
PARENT_ID ID /* ID = INTEGER NOT NULL */)
и наблюдается следующая картина
на свежей базе простейший запрос по индексу отрабатывает моментально.
после работы индекс замусоривается чтоли..... запрос выполняется доли секунды. но это не весь запрос основанный на индексе по parent_id.... и в целом получается что время получения текущей очереди получается порядка 2 секунд (на свежей базе ~ 100мс).
процедура получения очереди рекурсивная (сначала получить первого, потом следующего пока получается).
а вопрос такой - как надо делать очередь в условиях версионности и быстрого накопления мусора ?
на свежеотрестореной базе ....
Query
------------------------------------------------
select driver_id from driver where parent_id=0
Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Adapted Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 0,00 ms
Avg fetch time: 0,00 ms
Memory
------------------------------------------------
Current: 1 865 328
Max : 2 000 244
Buffers: 2 048
Operations
------------------------------------------------
Read : 0
Writes : 6
Fetches: 377
Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| DRIVER| 0 | 4 | 0 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
после 2 часов работы
Query
------------------------------------------------
select driver_id from driver where parent_id=0
Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Adapted Plan
------------------------------------------------
PLAN (DRIVER INDEX (DRIVER_PARENT))
Query Time
------------------------------------------------
Prepare : 0,00 ms
Execute : 250,00 ms
Avg fetch time: 0,00 ms
Memory
------------------------------------------------
Current: 1 865 328
Max : 2 000 244
Buffers: 2 048
Operations
------------------------------------------------
Read : 0
Writes : 6
Fetches: 1867
Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts |
| | Total | reads | reads | | | |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
| DRIVER| 0 | 273 | 0 | 0 | 0 | 0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+