Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / определить ближайшие min & max значения для заданного / 18 сообщений из 18, страница 1 из 1
25.02.2008, 16:28
    #35153587
Арсентий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Здравствуйте, помогите корректо составить запрос следующей ф-ности:
есть некая таблица состояний объекта:

stateid|stateDate|state

где stateDate - дата изменения состояния объекта, state - новое значение состояния

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

например, для
01.12.2006 - income
02.12.2006 - in_transfering
05.12.2006 - arrived
05.12.2006 - stored

для заданной даты 03.12.2006 - объект находится в состоянии in_transfering
когда же для 05.12.2006 - stored

Спасибо!
...
Рейтинг: 0 / 0
25.02.2008, 17:12
    #35153677
Арсентий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
...ну тогда хоть куда копать подскажите? я нет перерыл, но везде обычные between попадают,
давайте упростим:
как определить ближайшие min & max значения для заданного
то есть без всяких изменений состояния в один и тот же день, как это сделать, например, просто для последовательности:

заданное число: 15
ряд чисел: 1,2,8,10,22,25,45

мин и макс, для этого случая должно быть: 10 и 22 соотвественно...
...
Рейтинг: 0 / 0
25.02.2008, 18:00
    #35153762
Арсентий
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Господа, ну что, никаких предложений??????
...
Рейтинг: 0 / 0
25.02.2008, 18:53
    #35153861
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
1. В твоём примере есть 2 одинаковых даты - нехорошо... Добавляй ЕЩЁ признак, по которому их упорядочить. StateId?
2. Нужно одним SELECT'ом - или ХП подойдёт? вариантов решения - море...
3. Пример:
SELECT FIRST 1 state
FROM States
WHERE stateDate <= p_MyDate
ORDER BY
stateDate DESC
, stateid DESC
...
Рейтинг: 0 / 0
26.02.2008, 22:55
    #35156690
Julian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
select state from States
where stateid = (
select max(stateid) from States
where stateDate <= mdy(12,3,2006)
);
по идее, будет побыстрее.
В любом случае нужен индекс по stateDate.

--

select
(select max(num) from Num_List where num < 15) min_num,
(select min(num) from Num_List where num > 15) max_num
from systables
where tabid = 1;
...
Рейтинг: 0 / 0
27.02.2008, 08:25
    #35156965
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Julian
по идее, будет побыстрее.
;не будет, медленнее.
...
Рейтинг: 0 / 0
27.02.2008, 21:17
    #35159267
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
АнатоЛой1. В твоём примере есть 2 одинаковых даты - нехорошо... Это не "нехорошо". Это плохо. Потому что при таких раскладах (изменение статуса чаще чем раз в день) сам по себе вопрос "Каков был статус заданного объекта на дату Х?" лишен смысла (в общем случае).
Арсентийнапример, для
01.12.2006 - income
02.12.2006 - in_transfering
05.12.2006 - arrived
05.12.2006 - stored

когда же для 05.12.2006 - storedЭто, скажите мне, откуда следует?!
...
Рейтинг: 0 / 0
28.02.2008, 01:00
    #35159458
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Журавлев Денисне будет, медленнее.
Почему? Поиск максимума дороже сортировки по двум полям?
...
Рейтинг: 0 / 0
28.02.2008, 08:41
    #35159595
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
bk0010 Журавлев Денисне будет, медленнее.
Почему? Поиск максимума дороже сортировки по двум полям?два захода в таблицу дороже чем один. Сортировки там не должно быть, в смысле у меня бы не было, проход по индексу с конца (наверно нужно +first_rows для верности, оптимизатор FIRST 1 не видит)
...
Рейтинг: 0 / 0
01.03.2008, 00:59
    #35164661
Julian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Или два захода (очень быстрые и легкие, кстати), или сортировка. Сортировка всегда хуже, и по количеству обращений к данным (индексу) проигрывает значительно. Директива вряд ли существенно поможет. Можно посмотреть план на какой-нибудь таблице, но вообще-то такая конструкция с некоррелированным подзапросом очень хорошо себя показывает, в моей практике по крайней мере. Если Вы говорите о каком-то третьем варианте - без сортировки и без подзапроса, то было бы интересно его показать.
...
Рейтинг: 0 / 0
03.03.2008, 11:33
    #35166482
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
JulianИли два захода (очень быстрые и легкие, кстати), или сортировка. Сортировка всегда хуже, и по количеству обращений к данным (индексу) проигрывает значительно. Директива вряд ли существенно поможет. Можно посмотреть план на какой-нибудь таблице, но вообще-то такая конструкция с некоррелированным подзапросом очень хорошо себя показывает, в моей практике по крайней мере. Если Вы говорите о каком-то третьем варианте - без сортировки и без подзапроса, то было бы интересно его показать.Не ссорьтесь, горячие финские парни!!!
Погодите обсуждать технические детали. У человека серьезные проблемы с пониманием ситуации, а вы уже в тюнинг углубились!
...
Рейтинг: 0 / 0
03.03.2008, 12:15
    #35166615
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Евгений ФадеевНе ссорьтесь, горячие финские парни!!!
Погодите обсуждать технические детали. У человека серьезные проблемы с пониманием ситуации, а вы уже в тюнинг углубились!Мы не ссоримся, мы просто пытаемся померить.
Топикстартер и его проблемы нам мало интересны, тем более он наверно все давно решил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table curs(d date, val decimal( 20 , 2 ));

create procedure fill_curs(s integer);
  define i integer;
  define d0 date;
  let d0 = '01.01.2000';
  for i =  0  to s
  insert into curs values (d0,  24 );
  let d0=d0+ 1 ;
  end for;
end procedure;

execute procedure fill_curs( 100000 );

create unique index ixcurs on curs(d);

update statistics high for table curs;

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
QUERY:
------
select /*+ explain */ first 1 d, val
from curs
where d <= '10.01.2003'
order by d desc

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 54  и стоимость и кол-во возвращаемых строк неверны (я не знаю субд которые оценивают такой вариант правильно)
Estimated # of Rows Returned: 1106

  1) informix.curs: INDEX PATH

    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d <= 10.01.03 
никаких сортировок план идеален, этот запрос без сомнений быстрее.


QUERY:
------
select /*+ explain */ d, val
from curs
where d = (select max(d) from curs where d <= '10.01.2003')

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 4
Estimated # of Rows Returned: 1

  1) informix.curs: INDEX PATH

    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d = <subquery> 

    Subquery:
    ---------
    Estimated Cost: 3
    Estimated # of Rows Returned: 1

      1) informix.curs: INDEX PATH

        (1) Index Keys: d   (Key-Only)  (Aggregate)  (Serial, fragments: ALL)
            Lower Index Filter: informix.curs.d <= 10.01.03 


Проблема в том, что лишь последние версии информикса позволяют first в подзапросах.


Да и еще: своим программерам я рекомендую делать два поля дата_начала(default 0101001) и дата_конца(31129999), нужна конечно проверка непересекаемости периодов, но запросы становятся красивее between. Вообще можно сделать вью и instead of триггер который будет заполнять дата_конца.
...
Рейтинг: 0 / 0
03.03.2008, 13:47
    #35166947
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Журавлев Денис
Код: plaintext
1.
2.
3.
4.
5.
6.
  let d0 = '01.01.2000';
  for i =  0  to s
  insert into curs values (d0,  24 );
  let d0=d0+ 1 ;
...
execute procedure fill_curs( 100000 );

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
QUERY:
------
select /*+ explain */ first 1 d, val
from curs
where d <= '10.01.2003'
order by d desc

Estimated Cost: 54  и стоимость и кол-во возвращаемых строк неверны (я не знаю субд которые оценивают такой вариант правильно)

Estimated # of Rows Returned: 1106

Я , наверное, глючу, но именно 1106 строк и должно вернуться исходя из твоих условий ? (first 1 ведь будет применено только в конце, для готовой выборки ?)
И как ты определил неверность стоимости (этих условных "попугаев") ?
Индексные и табличные страницы то читать нужно (key only нет).

Журавлев Денис
Код: plaintext
1.
2.
3.
4.
  1) informix.curs: INDEX PATH
    (1) Index Keys: d   (Serial, fragments: ALL)
        Lower Index Filter: informix.curs.d <= 10.01.03 
никаких сортировок план идеален, этот запрос без сомнений быстрее.

Я правильно понял, что этот коммент относится к первому запросу ?
Мне он идеальным не показался.
А вот второй кажется значительно быстрее :)
А как все таки на практике на разных версиях ?
...
Рейтинг: 0 / 0
03.03.2008, 13:55
    #35166978
Евгений Фадеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Журавлев ДенисДа и еще: своим программерам я рекомендую делать два поля дата_начала(default 0101001) и дата_конца(31129999), нужна конечно проверка непересекаемости периодов, но запросы становятся красивее between. Вообще можно сделать вью и instead of триггер который будет заполнять дата_конца.Это называется темпоральная модель. Именно для таких случаев и используется. Только, возвращаясь к началу, у автора большие проблемы именно в постановке (там до решения далеко еще).
...
Рейтинг: 0 / 0
03.03.2008, 14:47
    #35167167
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
vasilis
Я , наверное, глючу, но именно 1106 строк и должно вернуться исходя из твоих условий ? (first 1 ведь будет применено только в конце, для готовой выборки ?)
Спустится по индексу 3, сходит в таблицу 1, стоп-конец.

vasilis
И как ты определил неверность стоимости (этих условных "попугаев") ?
Индексные и табличные страницы то читать нужно (key only нет).
IMHO: Его стоимость 3+1=4, строк вернется 1.


vasilisЯ правильно понял, что этот коммент относится к первому запросу ?
Мне он идеальным не показался.
А вот второй кажется значительно быстрее :)
А как все таки на практике на разных версиях ?К первому там один шаг, один заход в таблицу, во втором случае два шага, стоимость 7.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create procedure test_curs1(s integer);
  define i integer;
  define d0 date;
  define v0 decimal( 20 , 2 );
  for i =  0  to s
     foreach 
     select first  1  d, val into d0, v0
     from curs
     where d <= '10.01.2003'
     order by d desc
     end foreach;
  end for;
end procedure;

create procedure test_curs2(s integer);
  define i integer;
  define d0 date;
  define v0 decimal( 20 , 2 );
  for i =  0  to s
    select d, val into d0, v0
    from curs
    where d = (select max(d) from curs where d <= '10.01.2003');
  end for;
end procedure;

> time echo "execute procedure test_curs1(100000);"|dbaccess a
real 0m4.566s
> time echo "execute procedure test_curs1(100000);"|dbaccess a
real 0m4.782s


> time echo "execute procedure test_curs2(100000);"|dbaccess a
real 0m8.160s
> time echo "execute procedure test_curs2(100000);"|dbaccess a
real 0m8.540s

Кто еще что хочет померять?
...
Рейтинг: 0 / 0
03.03.2008, 15:12
    #35167224
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
и что интересно, если сделать индекс по обоим полям, получим желаемый
Index Keys: d val (Key-Only)

Но временные показатели ухудшаются до 5 и 9.
Т.е. не стоит индексировать длинные поля типа decimal(20,2).
...
Рейтинг: 0 / 0
03.03.2008, 15:14
    #35167228
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
Журавлев ДенисТ.е. не стоит индексировать длинные поля типа decimal(20,2).
точнее мне при моих настройках в этом случае не стоит индексировать длинные поля типа decimal(20,2).
...
Рейтинг: 0 / 0
03.03.2008, 16:14
    #35167461
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить ближайшие min & max значения для заданного
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / определить ближайшие min & max значения для заданного / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]