
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
21.07.2004, 15:04:44
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
есть две таблицы: create table items ( itemid integer not null, name varchar(128) not null) itemid name --------------- 1 item1 2 item2 3 item3 4 item4 5 item5 и create table itemvalues ( itemid integer not null, ondate date not null, ivalue double precision) itemid ondate ivalue ---------------------- 1 1.1.2000 1.000 1 1.2.2000 2.000 2 1.1.2000 1.500 4 1.3.2000 4.000 Следующий прок должен выбрать значения итемов на дату: CREATE PROCEDURE SP_GET RETURNS ( ITEMID INTEGER, NAME VARCHAR(128), IVALUE DOUBLE PRECISION, IONDATE DATE) AS begin for select itemid, name from items into :ITEMID, :NAME do begin IVALUE = null; IONDATE = null; select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=:ITEMID and iv.ondate= (select max(ondate) from itemvalues where itemid=:ITEMID and ondate<='1.1.2005') into :IVALUE, :IONDATE; suspend; end end результат должен быть такой: itemid name ivalue iondate ------------------------------ 1 item1 2.000 1.2.2000 2 item2 1.500 1.1.2000 3 item3 null null 4 item4 4.000 1.3.2000 5 item5 null null а возвращается: itemid name ivalue iondate ------------------------------ 1 item1 2.000 1.2.2000 2 item2 null null 3 item3 null null 4 item4 null null 5 item5 null null причём, что интересно, если в подзапросе пишу: ... (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') ... то всё работает, как надо. Где здесь могут быть грабли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:07:59
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Грабли в подробностях. Как ты запускаешь процедуру? Ккие компоненты/инструменты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:09:21
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
запускаю ibexpert-ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:10:25
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
та же фигня при запуске через ibx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:11:28
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
и ещё - проверялось на fb1.5 и fb1.03. результаты одинаковые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:14:37
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
Грабли известные. Некоррелированый подзапрос, зависящий от параметра. Обходи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:15:48
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Кинь сюда скриптик, создающий и заполняющий таблицы и создающий процедуру - я проверю на FB1.5.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:16:29
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Это не грабли. Тебе просто надо понять 1. что такое iv и зачем оно нужно 2. таблица во внешнем запросе и во вложенном с т.з. самого запроса - разные таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 15:26:09
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
itemid name ivalue iondate ------------------------------ 1 item1 2.000 1.2.2000 2 item2 1.500 1.1.2000 3 item3 null null 4 item4 4.000 1.3.2000 5 item5 null null -у меня это и возвращается... Так что у тебя где-то в системе глюк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:08:57
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
2Gold: CREATE TABLE ITEMS ( ITEMID INTEGER NOT NULL, NAME VARCHAR(128) NOT NULL ); CREATE TABLE ITEMVALUES ( ITEMID INTEGER NOT NULL, ONDATE DATE NOT NULL, IVALUE DOUBLE PRECISION ); INSERT INTO ITEMS (ITEMID, NAME) VALUES (1, 'Item1'); INSERT INTO ITEMS (ITEMID, NAME) VALUES (2, 'Item2'); INSERT INTO ITEMS (ITEMID, NAME) VALUES (3, 'Item3'); INSERT INTO ITEMS (ITEMID, NAME) VALUES (4, 'Item4'); INSERT INTO ITEMS (ITEMID, NAME) VALUES (5, 'Item5'); INSERT INTO ITEMVALUES (ITEMID, ONDATE, IVALUE) VALUES (1, '2000-01-01 00:00:00', 1); INSERT INTO ITEMVALUES (ITEMID, ONDATE, IVALUE) VALUES (1, '2000-02-01 00:00:00', 2); INSERT INTO ITEMVALUES (ITEMID, ONDATE, IVALUE) VALUES (2, '2000-01-01 00:00:00', 1.5); INSERT INTO ITEMVALUES (ITEMID, ONDATE, IVALUE) VALUES (4, '2000-03-01 00:00:00', 4); ALTER TABLE ITEMS ADD CONSTRAINT PK_ITEMS PRIMARY KEY (ITEMID); ALTER TABLE ITEMVALUES ADD CONSTRAINT FK_ITEMVALUES FOREIGN KEY (ITEMID) REFERENCES ITEMS (ITEMID); SET TERM ^ ; CREATE PROCEDURE SP_GET RETURNS ( ITEMID INTEGER, NAME VARCHAR(128), IVALUE DOUBLE PRECISION, IONDATE DATE) AS begin for select itemid, name from items into :ITEMID, :NAME do begin IVALUE = null; IONDATE = null; select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=:ITEMID and iv.ondate= (select max(ondate) from itemvalues where itemid=:ITEMID and ondate<='1.1.2005') into :IVALUE, :IONDATE; suspend; end end ^ SET TERM ; ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:19:01
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
2Johnmen: авторЭто не грабли. То есть, ты хочешь, сказать, что так быть и должно? авторТебе просто надо понять 1. что такое iv и зачем оно нужно 2. таблица во внешнем запросе и во вложенном с т.з. самого запроса - разные таблицы А что конкретно надо понять? Чё-то я тебя недопонял. 2Мимопроходящий: спасибо, хотя вот Johnmen говорит, что это не грабли. и кому в этом случае верить? обойти-то я обошёл, правда прок стал работать медленнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:34:19
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
У меня на FB1.5.1.4481 нормальные результаты: ITEMID NAME IVALUE IONDATE 1 Item1 2 01.02.2000 2 Item2 1,5 01.01.2000 3 Item3 4 Item4 4 01.03.2000 5 Item5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:43:56
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Да-да, у меня на том же - то же. Скажи свою версию FB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:52:04
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
1.5.0.4306 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 16:55:28
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Ну, загрузи 1.5.1 sourceforge.net/project/showfiles.php?group_id=9028 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 17:10:49
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
ok - скачаю. теперь новый прикол: на таблице itemvalues индекс IV_IDX(ITEMID, ONDATE), в самой таблице ~3500000 записей. для коррелированного и некоррелированного подзапросов выходит разное время выполнения: select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=iv.itemid and ondate<='1.1.2005') Plan PLAN (ITEMVALUES INDEX (IV_IDX)) PLAN (IV INDEX (IV_IDX)) Adapted Plan PLAN (ITEMVALUES INDEX (IV_IDX)) PLAN (IV INDEX (IV_IDX)) ------ Performance info ------ Prepare time = 0ms Execute time = 735ms Avg fetch time = 735,00 ms Current memory = 1 726 128 Max memory = 2 504 592 Memory buffers = 2 048 Reads from disk to cache = 0 Writes from cache to disk = 6 Fetches from cache = 254 657 select iv.ivalue, iv.ondate from itemvalues iv where iv.itemid=1 and iv.ondate= (select max(ondate) from itemvalues where itemid=1 and ondate<='1.1.2005') Plan PLAN (ITEMVALUES INDEX (IV_IDX)) PLAN (IV INDEX (IV_IDX)) Adapted Plan PLAN (ITEMVALUES INDEX (IV_IDX)) PLAN (IV INDEX (IV_IDX)) ------ Performance info ------ Prepare time = 0ms Execute time = 16ms Avg fetch time = 16,00 ms Current memory = 1 652 648 Max memory = 2 504 592 Memory buffers = 2 048 Reads from disk to cache = 0 Writes from cache to disk = 6 Fetches from cache = 838 В первом случае он чуть ли не весь кэш перелопатил - можно подумать, что индекс не использовался, хотя пишет, что таки использовался. Как такое можно объяснить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 17:13:00
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Вот, к стати, в Release Notes 1.5.1 нарыл: авторOld tracking logic bug fixed A nested query that contained a variable in the WHERE clause would be erroneously flagged as invariant (SF #627057 and #922602), e.g. select max(d2.id) from demo d2 where d2.id < :id Request cloning logic was broken. Clones of procedures/triggers were not accounting for invariants and the requests opened by them at all. Thus, they were inheriting invariant values from previous executions and were not freeing resources (highly limited! - you can have only 1000 copies of a request open). This is why most recursive procedures didn't work at all and using procedures from multiple Superserver connections produced results that were inconsistent or timing-dependent. Invariant dependency tracking was not working properly. The engine now keeps account of which variables an invariant depends on and clears the cached invariant value when values are being assigned to these variables. (Nickolay Samofatov) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 17:13:14
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Дедушка Мазай прикалывается над зайцами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 17:15:40
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Ты скачай 1.5.1 и там посмотри - может всё нормально будет ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
21.07.2004, 17:31:56
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
>Как такое можно объяснить? Очень просто. В первом случае поздапрос выполняется для каждой записи внешнего. Во втором - один раз. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.07.2004, 11:37:15
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
авторОчень просто. В первом случае поздапрос выполняется для каждой записи внешнего. Во втором - один раз. :) дык и в первом, и во втором случае одна запись возвращается. я так думаю, что сервер идёт по индексу и для каждой записи c itemid=1 (а их порядка 300) выполняет один и тот же подзапрос. Получается, что оптимизатор не выполнил свою основную задачу? или как? 2mv: ты что, как можно? зайцы - это для меня святое :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.07.2004, 15:00:58
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
>Dedushka Mazai >дык и в первом, и во втором случае одна запись возвращается. Причём тут это ? Правильно ! Непричем. Но очень причем, сколько раз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.07.2004, 15:37:23
|
|||
|---|---|---|---|
|
|||
Где грабли? |
|||
|
#18+
2Johnmen: умеешь ты, однако, загадками говорить... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
22.07.2004, 15:58:58
|
|||
|---|---|---|---|
Где грабли? |
|||
|
#18+
Я думал понятно... Тогда так. Неважно, сколько записей возвращает вложенный запрос, важно, сколько раз он выполнится в рамках выполнения основного. (в контексте рассматриваемой проблемы/непроблемы) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/search_topic.php?author=djois2009&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
205ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 669ms |
| total: | 1018ms |

| 0 / 0 |
