оптимальная организация очереди
оптимальная организация очереди
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 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
что интересно.... мусор есть только в индексе, в таблице его нет...
(имею в виду количество dup)
GC в индексах не прибирается?
таблица DRIVER dcrjht после рестора
DRIVER (135)
Primary pointer page: 146, Index root page: 147
Average record length: 126.42, total records: 252
Average version length: 0.00, total versions: 0, max versions: 0
Data pages: 3, data page slots: 3, average fill: 74%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 1
60 - 79% = 0
80 - 99% = 2
Index DRIVER_PARENT (1)
Depth: 1, leaf buckets: 1, nodes: 253
Average data length: 0.00, total dup: 213, max dup: 191
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
Index PK_DRIVER (0)
Depth: 1, leaf buckets: 1, nodes: 252
Average data length: 1.00, total dup: 0, max dup: 0
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
после работы
DRIVER (134)
Primary pointer page: 144, Index root page: 145
Average record length: 124.72, total records: 254
Average version length: 81.50, total versions: 2, max versions: 1
Data pages: 43, data page slots: 61, average fill: 10%
Fill distribution:
0 - 19% = 41
20 - 39% = 0
40 - 59% = 1
60 - 79% = 0
80 - 99% = 1
Index DRIVER_PARENT (1)
Depth: 2, leaf buckets: 18, nodes: 29282
Average data length: 0.00, total dup: 29070, max dup: 2856
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 11
60 - 79% = 4
80 - 99% = 3
Index PK_DRIVER (0)
Depth: 1, leaf buckets: 1, nodes: 254
Average data length: 1.00, total dup: 0, max dup: 0
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
(имею в виду количество dup)
GC в индексах не прибирается?
таблица DRIVER dcrjht после рестора
DRIVER (135)
Primary pointer page: 146, Index root page: 147
Average record length: 126.42, total records: 252
Average version length: 0.00, total versions: 0, max versions: 0
Data pages: 3, data page slots: 3, average fill: 74%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 1
60 - 79% = 0
80 - 99% = 2
Index DRIVER_PARENT (1)
Depth: 1, leaf buckets: 1, nodes: 253
Average data length: 0.00, total dup: 213, max dup: 191
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
Index PK_DRIVER (0)
Depth: 1, leaf buckets: 1, nodes: 252
Average data length: 1.00, total dup: 0, max dup: 0
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
после работы
DRIVER (134)
Primary pointer page: 144, Index root page: 145
Average record length: 124.72, total records: 254
Average version length: 81.50, total versions: 2, max versions: 1
Data pages: 43, data page slots: 61, average fill: 10%
Fill distribution:
0 - 19% = 41
20 - 39% = 0
40 - 59% = 1
60 - 79% = 0
80 - 99% = 1
Index DRIVER_PARENT (1)
Depth: 2, leaf buckets: 18, nodes: 29282
Average data length: 0.00, total dup: 29070, max dup: 2856
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 11
60 - 79% = 4
80 - 99% = 3
Index PK_DRIVER (0)
Depth: 1, leaf buckets: 1, nodes: 254
Average data length: 1.00, total dup: 0, max dup: 0
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0
ну смотри, сам попросил
2 процедуры получения очереди которые и тормозят
2 процедура вызывает первую 10 раз
2 процедуры получения очереди которые и тормозят
2 процедура вызывает первую 10 раз
Код: Выделить всё
SET TERM ^ ;
CREATE PROCEDURE LIST_TAXI_Q (
IN_PARENT_ID INTEGER,
N INTEGER,
IN_OFFICE_ID INTEGER)
RETURNS (
CAR_ID INTEGER,
DRIVER_NUMBER VARCHAR(32),
CAR_KTG_COLOR INTEGER,
ZONE_NAME VARCHAR(32),
ZONE_COLOR INTEGER,
DRIVER_STATUS_NAME VARCHAR(32),
DRIVER_STATUS_COLOR INTEGER,
POS INTEGER,
CAR_FULL VARCHAR(250),
ZONE_ID INTEGER,
DRIVER_ID INTEGER,
IN_WORK VARCHAR(32))
AS
DECLARE VARIABLE CNT INTEGER;
DECLARE VARIABLE I INTEGER;
begin
IF (:N=0) THEN BEGIN
POS=1;
END
pos=n;
FOR SELECT driver.driver_id, driver_number, car_id,
driver_status_name ||' '|| cast ( -( case when driver.status_change_tm is null then 'now' else driver.status_change_tm end - cast ('now' as date)) *24*60 as integer) || ' ìèí' ,
driver_status_color,
zone_name, zone_color, zone_id,
cast ( -( case when driver.on_line_tm is null then 'now' else driver.on_line_tm end - cast ('now' as date)) *24 as integer) || ' ÷'
from driver
join driver_status on driver_status.driver_status_id=driver.driver_status_id
join zone on zone.zone_id=driver.zone_id
where parent_id=:in_parent_id
and :in_office_id=driver.office_id
into :driver_id, :driver_number, :car_id,
:driver_status_name, :driver_status_color,
:zone_name, :zone_color, :zone_id, :in_work
DO
BEGIN
pos=pos+1;
select car_ktg_color, car_full
from car, car_ktg
where
car.car_ktg_id=car_ktg.car_ktg_id
and car.car_id=:car_id
into :car_ktg_color, :car_full ;
SUSPEND;
FOR SELECT * FROM LIST_TAXI_Q(:driver_ID,:pos, :in_office_id)
INTO :car_id, :driver_number, :car_ktg_color, :zone_name, :zone_color, :driver_status_name, :driver_status_color, :pos, :car_full, :zone_id, :driver_id, :in_work
DO SUSPEND;
END
end^
SET TERM ; ^
SET TERM ^ ;
CREATE PROCEDURE LIST_TAXI_QUEUE (
IN_OFFICE_ID INTEGER)
RETURNS (
ZONE_ID INTEGER,
ZONE_NAME VARCHAR(32),
ZONE_COLOR INTEGER,
P1 VARCHAR(32),
P1_COLOR INTEGER,
P2 VARCHAR(32),
P2_COLOR INTEGER,
P3 VARCHAR(32),
P3_COLOR INTEGER,
P4 VARCHAR(32),
P4_COLOR INTEGER,
P5 VARCHAR(32),
P5_COLOR INTEGER,
P1_CAR_ID INTEGER,
P2_CAR_ID INTEGER,
P3_CAR_ID INTEGER,
P4_CAR_ID INTEGER,
P5_CAR_ID INTEGER,
P6 VARCHAR(32),
P6_COLOR INTEGER,
P6_CAR_ID INTEGER,
P7 VARCHAR(32),
P7_COLOR INTEGER,
P7_CAR_ID INTEGER,
P8 VARCHAR(32),
P8_COLOR INTEGER,
P8_CAR_ID INTEGER,
P9 VARCHAR(32),
P9_COLOR INTEGER,
P9_CAR_ID INTEGER,
P10 VARCHAR(32),
P10_COLOR INTEGER,
P10_CAR_ID INTEGER,
P11 VARCHAR(32),
P11_COLOR INTEGER,
P11_CAR_ID INTEGER,
P12 VARCHAR(32),
P12_COLOR INTEGER,
P12_CAR_ID INTEGER,
P1_STATUS_COLOR INTEGER,
P2_STATUS_COLOR INTEGER,
P3_STATUS_COLOR INTEGER,
P4_STATUS_COLOR INTEGER,
P5_STATUS_COLOR INTEGER,
P6_STATUS_COLOR INTEGER,
P7_STATUS_COLOR INTEGER,
P8_STATUS_COLOR INTEGER,
P9_STATUS_COLOR INTEGER,
P10_STATUS_COLOR INTEGER,
P11_STATUS_COLOR INTEGER,
P12_STATUS_COLOR INTEGER,
P1_ID INTEGER,
P2_ID INTEGER,
P3_ID INTEGER,
P4_ID INTEGER,
P5_ID INTEGER,
P6_ID INTEGER,
P7_ID INTEGER,
P8_ID INTEGER,
P9_ID INTEGER,
P10_ID INTEGER,
P11_ID INTEGER,
P12_ID INTEGER,
P13 VARCHAR(32),
P14 VARCHAR(32),
P15 VARCHAR(32),
P16 VARCHAR(32),
P17 VARCHAR(32),
P18 VARCHAR(32),
P19 VARCHAR(32),
P20 VARCHAR(32),
P21 VARCHAR(32),
P22 VARCHAR(32),
P23 VARCHAR(32),
P24 VARCHAR(32),
P13_ID INTEGER,
P14_ID INTEGER,
P15_ID INTEGER,
P16_ID INTEGER,
P17_ID INTEGER,
P18_ID INTEGER,
P19_ID INTEGER,
P20_ID INTEGER,
P21_ID INTEGER,
P22_ID INTEGER,
P23_ID INTEGER,
P24_ID INTEGER,
P13_CAR_ID INTEGER,
P14_CAR_ID INTEGER,
P15_CAR_ID INTEGER,
P16_CAR_ID INTEGER,
P17_CAR_ID INTEGER,
P18_CAR_ID INTEGER,
P19_CAR_ID INTEGER,
P20_CAR_ID INTEGER,
P21_CAR_ID INTEGER,
P22_CAR_ID INTEGER,
P23_CAR_ID INTEGER,
P24_CAR_ID INTEGER,
P13_COLOR INTEGER,
P14_COLOR INTEGER,
P15_COLOR INTEGER,
P16_COLOR INTEGER,
P17_COLOR INTEGER,
P18_COLOR INTEGER,
P19_COLOR INTEGER,
P20_COLOR INTEGER,
P21_COLOR INTEGER,
P22_COLOR INTEGER,
P23_COLOR INTEGER,
P24_COLOR INTEGER,
P13_STATUS_COLOR INTEGER,
P14_STATUS_COLOR INTEGER,
P15_STATUS_COLOR INTEGER,
P16_STATUS_COLOR INTEGER,
P17_STATUS_COLOR INTEGER,
P18_STATUS_COLOR INTEGER,
P19_STATUS_COLOR INTEGER,
P20_STATUS_COLOR INTEGER,
P21_STATUS_COLOR INTEGER,
P22_STATUS_COLOR INTEGER,
P23_STATUS_COLOR INTEGER,
P24_STATUS_COLOR INTEGER)
AS
DECLARE VARIABLE DRIVER_NUMBER VARCHAR(32) CHARACTER SET WIN1251;
DECLARE VARIABLE CAR_KTG_COLOR INTEGER;
DECLARE VARIABLE CAR_ID INTEGER;
DECLARE VARIABLE N INTEGER;
DECLARE VARIABLE DRIVER_STATUS_COLOR INTEGER;
DECLARE VARIABLE DRIVER_ID INTEGER;
begin
for select zone_id, zone_name, zone_color from zone
order by zone_name
into :zone_id, :zone_name, :zone_color do
begin
n=0;
p1='';p1_color=0; p1_car_id=0; P1_STATUS_COLOR=0;p1_id=0;
p2='';p2_color=0; p2_car_id=0; P2_STATUS_COLOR=0;p2_id=0;
p3='';p3_color=0; p3_car_id=0; P3_STATUS_COLOR=0;p3_id=0;
p4='';p4_color=0; p4_car_id=0; P4_STATUS_COLOR=0;p4_id=0;
p5='';p5_color=0; p5_car_id=0; P5_STATUS_COLOR=0;p5_id=0;
p6='';p6_color=0; p6_car_id=0; P6_STATUS_COLOR=0;p6_id=0;
p7='';p7_color=0; p7_car_id=0; P7_STATUS_COLOR=0;p7_id=0;
p8='';p8_color=0; p8_car_id=0; P8_STATUS_COLOR=0;p8_id=0;
p9='';p9_color=0; p9_car_id=0; P9_STATUS_COLOR=0;p9_id=0;
p10='';p10_color=0; p10_car_id=0; P10_STATUS_COLOR=0;p10_id=0;
p11='';p11_color=0; p11_car_id=0; P11_STATUS_COLOR=0;p11_id=0;
p12='';p12_color=0; p12_car_id=0; P12_STATUS_COLOR=0;p12_id=0;
p13='';p13_color=0; p13_car_id=0; P13_STATUS_COLOR=0;p13_id=0;
p14='';p14_color=0; p14_car_id=0; P14_STATUS_COLOR=0;p14_id=0;
p15='';p15_color=0; p15_car_id=0; P15_STATUS_COLOR=0;p15_id=0;
p16='';p16_color=0; p16_car_id=0; P16_STATUS_COLOR=0;p16_id=0;
p17='';p17_color=0; p17_car_id=0; P17_STATUS_COLOR=0;p17_id=0;
p18='';p18_color=0; p18_car_id=0; P18_STATUS_COLOR=0;p18_id=0;
p19='';p19_color=0; p19_car_id=0; P19_STATUS_COLOR=0;p19_id=0;
p20='';p20_color=0; p20_car_id=0; P20_STATUS_COLOR=0;p20_id=0;
p21='';p21_color=0; p21_car_id=0; P21_STATUS_COLOR=0;p21_id=0;
p22='';p22_color=0; p22_car_id=0; P22_STATUS_COLOR=0;p22_id=0;
p23='';p23_color=0; p23_car_id=0; P23_STATUS_COLOR=0;p23_id=0;
p24='';p24_color=0; p24_car_id=0; P24_STATUS_COLOR=0;p24_id=0;
for select driver_number, car_id, car_ktg_color, driver_status_color, driver_id from list_taxi_q(0, 0, :in_office_id)
where zone_id=:zone_id
into :driver_number, :car_id, :car_ktg_color, :driver_status_color, :driver_id do
begin
n=n+1;
if (n=1) then begin p1=driver_number; p1_color=car_ktg_color; p1_car_id=car_id; P1_STATUS_COLOR=driver_status_color;p1_id=driver_id; end
if (n=2) then begin p2=driver_number; p2_color=car_ktg_color; p2_car_id=car_id; P2_STATUS_COLOR=driver_status_color; p2_id=driver_id;end
if (n=3) then begin p3=driver_number; p3_color=car_ktg_color; p3_car_id=car_id; P3_STATUS_COLOR=driver_status_color; p3_id=driver_id;end
if (n=4) then begin p4=driver_number; p4_color=car_ktg_color; p4_car_id=car_id; P4_STATUS_COLOR=driver_status_color; p4_id=driver_id;end
if (n=5) then begin p5=driver_number; p5_color=car_ktg_color; p5_car_id=car_id; P5_STATUS_COLOR=driver_status_color; p5_id=driver_id;end
if (n=6) then begin p6=driver_number; p6_color=car_ktg_color; p6_car_id=car_id; P6_STATUS_COLOR=driver_status_color; p6_id=driver_id;end
if (n=7) then begin p7=driver_number; p7_color=car_ktg_color; p7_car_id=car_id; P7_STATUS_COLOR=driver_status_color; p7_id=driver_id;end
if (n=8) then begin p8=driver_number; p8_color=car_ktg_color; p8_car_id=car_id; P8_STATUS_COLOR=driver_status_color; p8_id=driver_id;end
if (n=9) then begin p9=driver_number; p9_color=car_ktg_color; p9_car_id=car_id; P9_STATUS_COLOR=driver_status_color; p9_id=driver_id;end
if (n=10) then begin p10=driver_number; p10_color=car_ktg_color; p10_car_id=car_id; P10_STATUS_COLOR=driver_status_color; p10_id=driver_id;end
if (n=11) then begin p11=driver_number; p11_color=car_ktg_color; p11_car_id=car_id; P11_STATUS_COLOR=driver_status_color; p11_id=driver_id;end
if (n=12) then begin p12=driver_number; p12_color=car_ktg_color; p12_car_id=car_id; P12_STATUS_COLOR=driver_status_color; p12_id=driver_id;end
if (n=13) then begin p13=driver_number; p13_color=car_ktg_color; p13_car_id=car_id; P13_STATUS_COLOR=driver_status_color; p13_id=driver_id;end
if (n=14) then begin p14=driver_number; p14_color=car_ktg_color; p14_car_id=car_id; P14_STATUS_COLOR=driver_status_color; p14_id=driver_id;end
if (n=15) then begin p15=driver_number; p15_color=car_ktg_color; p15_car_id=car_id; P15_STATUS_COLOR=driver_status_color; p15_id=driver_id;end
if (n=16) then begin p16=driver_number; p16_color=car_ktg_color; p16_car_id=car_id; P16_STATUS_COLOR=driver_status_color; p16_id=driver_id;end
if (n=17) then begin p17=driver_number; p17_color=car_ktg_color; p17_car_id=car_id; P17_STATUS_COLOR=driver_status_color; p17_id=driver_id;end
if (n=18) then begin p18=driver_number; p18_color=car_ktg_color; p18_car_id=car_id; P18_STATUS_COLOR=driver_status_color; p18_id=driver_id;end
if (n=19) then begin p19=driver_number; p19_color=car_ktg_color; p19_car_id=car_id; P19_STATUS_COLOR=driver_status_color; p19_id=driver_id;end
if (n=20) then begin p20=driver_number; p20_color=car_ktg_color; p20_car_id=car_id; P20_STATUS_COLOR=driver_status_color; p20_id=driver_id;end
if (n=21) then begin p21=driver_number; p21_color=car_ktg_color; p21_car_id=car_id; P21_STATUS_COLOR=driver_status_color; p21_id=driver_id;end
if (n=22) then begin p22=driver_number; p22_color=car_ktg_color; p22_car_id=car_id; P22_STATUS_COLOR=driver_status_color; p22_id=driver_id;end
if (n=23) then begin p23=driver_number; p23_color=car_ktg_color; p23_car_id=car_id; P23_STATUS_COLOR=driver_status_color; p23_id=driver_id;end
if (n=24) then begin p24=driver_number; p24_color=car_ktg_color; p24_car_id=car_id; P24_STATUS_COLOR=driver_status_color; p24_id=driver_id;end
end
suspend;
end
end^
SET TERM ; ^
Код: Выделить всё
Depth: 2, leaf buckets: 18, nodes: 29282
Average data length: 0.00, total dup: 29070, max dup: 2856
nodes - число ключей. если оно больше числа записей+версий, значит ты просто собрал статистику в тот момент, когда происходила сборка мусора.
кроме того, у тебя после работы data pages не 2, а 43. Т.е. записи размазаны по этим 43-м страницам. И страниц индекса после работы получается 18. В общем, надо что-то делать с частотой обновлений. и минимизировать время жизни транзакций. Потому что в результате текущего поведения приложения в конце работы в таблице версий в 10 раз больше чем записей.
статистику в письме грохнул.
Последний раз редактировалось kdv 14 авг 2006, 11:40, всего редактировалось 1 раз.
блин, наврал.... база была отресторена месяц назад а не 2 часа.
2 часа назад делал на ней sweep - индексам не помогло.
скорость работы соответственно потихоньку снижается
по поводу жизни транзакций -
Oldest transaction 603568
Oldest active 603569
Oldest snapshot 603543
Next transaction 603584
вроде неплохо
2 часа назад делал на ней sweep - индексам не помогло.
скорость работы соответственно потихоньку снижается
по поводу жизни транзакций -
Oldest transaction 603568
Oldest active 603569
Oldest snapshot 603543
Next transaction 603584
вроде неплохо
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
1 - расскажи как сделать очередь через генератор
2 - очередь машин движется по кольцу по сути дела.
соответственно есть перый позывной. но при получении заказа его скидываем в конец очереди.
соответственно, тот кто был за первым, сам становится первым (parent_id=0)
иногда водителей вручную переставляют в начало (parent_id=0, тот кто был первым становится вторым)
а иногда в конец
чесно говоря ничего умнее связки parent_id + триггеры я не придумал
удалений нет. есть только апдейты parent_id.
2 - очередь машин движется по кольцу по сути дела.
соответственно есть перый позывной. но при получении заказа его скидываем в конец очереди.
соответственно, тот кто был за первым, сам становится первым (parent_id=0)
иногда водителей вручную переставляют в начало (parent_id=0, тот кто был первым становится вторым)
а иногда в конец
чесно говоря ничего умнее связки parent_id + триггеры я не придумал
удалений нет. есть только апдейты parent_id.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Я так понял, 24 - это число очереди из такси. Непонятны две вещи:
1. Почему у тебя запросы на выборку такси без сортировки. Теоретически должно быть "прыганье" записей с такси внутри результата.
2. Переименуй ХП (обе либо одну). По наименованию непонятно, чем они различаются. Можно только предположить, что которая Queue вызывает Q, а что конкретно делает последняя - хз. Сам потом будешь голову ломать.
3. Почему вместо выдачи 24 записей сделал выдачу записей в одной строке, но с 24-мя параметрами на каждую машину?
1. Почему у тебя запросы на выборку такси без сортировки. Теоретически должно быть "прыганье" записей с такси внутри результата.
2. Переименуй ХП (обе либо одну). По наименованию непонятно, чем они различаются. Можно только предположить, что которая Queue вызывает Q, а что конкретно делает последняя - хз. Сам потом будешь голову ломать.
3. Почему вместо выдачи 24 записей сделал выдачу записей в одной строке, но с 24-мя параметрами на каждую машину?
1 - без сортировки потомучто они автоматически идут по порядку (по цепочке) из первой процедуры
2 - система пока разрабатывается, названия процедур - рабочие моменты.
похоже, все равно всю очередь переделывать, поэтому не ругай за неэстетичный код
3. потому что сначало было 4 параметра, а когда надо было расширить решил что так будет быстрее переделать.
думаю, тему пора закрывать.
Спасибо участникам
2 - система пока разрабатывается, названия процедур - рабочие моменты.
похоже, все равно всю очередь переделывать, поэтому не ругай за неэстетичный код
3. потому что сначало было 4 параметра, а когда надо было расширить решил что так будет быстрее переделать.
думаю, тему пора закрывать.
Спасибо участникам
я бы очередь организовал по таймштампу.
т.е. такой штамп(текущее время) присваивается таксисту в момент получения заказа(или когда освободился, а лучше и то и другое). в таком случае сортировка свободных машин по данному полю(времени) в обратном порядке даст нам текущее состояние очереди. (самый старый = самый первый)
но т.к. теоретически может одновременно проштамповаться какое-то количество записей, то вместо времени(или вдобавок к нему) можем завести генератор и использовать его значение для сортировки.
хм... по-моему задача тривиальна.
P.S. а периодическое пересторение индекса(отключение/включение) можно завести на системный шедулер. я к примеру для таких задач "обслуживания" базы использую PHP+nnCron или Unix Cron - довольно портируемая и беспроблемная связка ИМХО.
т.е. такой штамп(текущее время) присваивается таксисту в момент получения заказа(или когда освободился, а лучше и то и другое). в таком случае сортировка свободных машин по данному полю(времени) в обратном порядке даст нам текущее состояние очереди. (самый старый = самый первый)
но т.к. теоретически может одновременно проштамповаться какое-то количество записей, то вместо времени(или вдобавок к нему) можем завести генератор и использовать его значение для сортировки.
хм... по-моему задача тривиальна.
P.S. а периодическое пересторение индекса(отключение/включение) можно завести на системный шедулер. я к примеру для таких задач "обслуживания" базы использую PHP+nnCron или Unix Cron - довольно портируемая и беспроблемная связка ИМХО.