оптимальная организация очереди

Модераторы: kdv, CyberMax

Ответить
aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

оптимальная организация очереди

Сообщение aaa3d » 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 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 авг 2006, 10:00

размер страницы у базы какой? похоже на 1 килобайт :!:
сделай 4к, и поставь DatabaseCachePages (или как его там, с утра не помню) в конфиге не 2048 страниц, а например 9 тысяч. База в кэш поместится.
ну и смотри число версий IBAnalyst-ом.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 10:09

размер страницы 16к
кэшь - 2000 страниц
размер таблицы про которую ведется речь - 2 страницы

проблемя исключительно в замусоривании индекса, как побороть - не знаю.
готов алгоритм переделывать уже :(

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 11:07

что интересно.... мусор есть только в индексе, в таблице его нет...
(имею в виду количество 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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 авг 2006, 11:10

Дай статистику по БД после двух часов.
И еще: после двух часов работы скорость уже не уменьшается?

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 11:29

ну смотри, сам попросил

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 ; ^

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 авг 2006, 11:35

Код: Выделить всё

 Depth: 2, leaf buckets: 18, nodes: 29282
Average data length: 0.00, total dup: 29070, max dup: 2856 
total dup - это число повторов. то есть, nodes - total dup = число уникальных значений столбца.

nodes - число ключей. если оно больше числа записей+версий, значит ты просто собрал статистику в тот момент, когда происходила сборка мусора.

кроме того, у тебя после работы data pages не 2, а 43. Т.е. записи размазаны по этим 43-м страницам. И страниц индекса после работы получается 18. В общем, надо что-то делать с частотой обновлений. и минимизировать время жизни транзакций. Потому что в результате текущего поведения приложения в конце работы в таблице версий в 10 раз больше чем записей.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 авг 2006, 11:37

статистику в письме грохнул.
Последний раз редактировалось kdv 14 авг 2006, 11:40, всего редактировалось 1 раз.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 11:39

блин, наврал.... база была отресторена месяц назад а не 2 часа.
2 часа назад делал на ней sweep - индексам не помогло.

скорость работы соответственно потихоньку снижается


по поводу жизни транзакций -

Oldest transaction 603568
Oldest active 603569
Oldest snapshot 603543
Next transaction 603584

вроде неплохо

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 авг 2006, 12:52

Что-то я не пойму двух вещей:
1) Зачем у тебя очередь организована через Parent а не через счетчик на генераторе.
2) Когда ты выбираешь из нее ты что - одну запись удаляешь а остальные апдейтишь?

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 13:25

1 - расскажи как сделать очередь через генератор
2 - очередь машин движется по кольцу по сути дела.
соответственно есть перый позывной. но при получении заказа его скидываем в конец очереди.
соответственно, тот кто был за первым, сам становится первым (parent_id=0)
иногда водителей вручную переставляют в начало (parent_id=0, тот кто был первым становится вторым)
а иногда в конец

чесно говоря ничего умнее связки parent_id + триггеры я не придумал

удалений нет. есть только апдейты parent_id.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 авг 2006, 13:37

Я бы сделал так: освободилась машина - добавляю ее в таблицу очереди (она получает максимальный номер из генератора). Понадобилась машина - SELECT ... FROM Queue ORDER BY... Если первая полученная машина подходит под какие-то условия - удаляем ее из очереди (пошла на задание). Все.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 13:37

нда.... все таки сделал то чего не хотел делать но пользователи достали

помогло deactivate/activate проблемного индекса...
но все равно неприятно. не получается необслуживаемая система

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 14:46

ндаа......
посыпаю голову пеплом.....
старею, не пришло в голову самое простое что только можно...

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 14 авг 2006, 16:58

Я так понял, 24 - это число очереди из такси. Непонятны две вещи:
1. Почему у тебя запросы на выборку такси без сортировки. Теоретически должно быть "прыганье" записей с такси внутри результата.
2. Переименуй ХП (обе либо одну). По наименованию непонятно, чем они различаются. Можно только предположить, что которая Queue вызывает Q, а что конкретно делает последняя - хз. Сам потом будешь голову ломать.
3. Почему вместо выдачи 24 записей сделал выдачу записей в одной строке, но с 24-мя параметрами на каждую машину?

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 14 авг 2006, 17:07

1 - без сортировки потомучто они автоматически идут по порядку (по цепочке) из первой процедуры
2 - система пока разрабатывается, названия процедур - рабочие моменты.
похоже, все равно всю очередь переделывать, поэтому не ругай за неэстетичный код :)
3. потому что сначало было 4 параметра, а когда надо было расширить решил что так будет быстрее переделать.

думаю, тему пора закрывать.
Спасибо участникам

dsd_corp
Сообщения: 8
Зарегистрирован: 12 ноя 2006, 15:32

Сообщение dsd_corp » 15 ноя 2006, 03:35

я бы очередь организовал по таймштампу.
т.е. такой штамп(текущее время) присваивается таксисту в момент получения заказа(или когда освободился, а лучше и то и другое). в таком случае сортировка свободных машин по данному полю(времени) в обратном порядке даст нам текущее состояние очереди. (самый старый = самый первый)

но т.к. теоретически может одновременно проштамповаться какое-то количество записей, то вместо времени(или вдобавок к нему) можем завести генератор и использовать его значение для сортировки.

хм... по-моему задача тривиальна.

P.S. а периодическое пересторение индекса(отключение/включение) можно завести на системный шедулер. я к примеру для таких задач "обслуживания" базы использую PHP+nnCron или Unix Cron - довольно портируемая и беспроблемная связка ИМХО.

Ответить