powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Где грабли?
48 сообщений из 48, показаны все 2 страниц
Где грабли?
    #32614972
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть две таблицы:

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')
...
то всё работает, как надо. Где здесь могут быть грабли?
...
Рейтинг: 0 / 0
Где грабли?
    #32614982
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грабли в подробностях. Как ты запускаешь процедуру? Ккие компоненты/инструменты?
...
Рейтинг: 0 / 0
Где грабли?
    #32614992
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запускаю ibexpert-ом
...
Рейтинг: 0 / 0
Где грабли?
    #32614995
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
та же фигня при запуске через ibx
...
Рейтинг: 0 / 0
Где грабли?
    #32614998
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё - проверялось на fb1.5 и fb1.03. результаты одинаковые
...
Рейтинг: 0 / 0
Где грабли?
    #32615015
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Грабли известные.
Некоррелированый подзапрос, зависящий от параметра.
Обходи.
...
Рейтинг: 0 / 0
Где грабли?
    #32615019
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кинь сюда скриптик, создающий и заполняющий таблицы и создающий процедуру - я проверю на FB1.5.1
...
Рейтинг: 0 / 0
Где грабли?
    #32615022
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не грабли.
Тебе просто надо понять
1. что такое iv и зачем оно нужно
2. таблица во внешнем запросе и во вложенном с т.з. самого запроса - разные таблицы
...
Рейтинг: 0 / 0
Где грабли?
    #32615045
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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


-у меня это и возвращается...

Так что у тебя где-то в системе глюк.
...
Рейтинг: 0 / 0
Где грабли?
    #32615201
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ; ^
...
Рейтинг: 0 / 0
Где грабли?
    #32615230
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Johnmen:
авторЭто не грабли.
То есть, ты хочешь, сказать, что так быть и должно?
авторТебе просто надо понять
1. что такое iv и зачем оно нужно
2. таблица во внешнем запросе и во вложенном с т.з. самого запроса - разные таблицы
А что конкретно надо понять? Чё-то я тебя недопонял.

2Мимопроходящий: спасибо, хотя вот Johnmen говорит, что это не грабли. и кому в этом случае верить?
обойти-то я обошёл, правда прок стал работать медленнее
...
Рейтинг: 0 / 0
Где грабли?
    #32615266
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня на 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
...
Рейтинг: 0 / 0
Где грабли?
    #32615294
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да-да, у меня на том же - то же. Скажи свою версию FB.
...
Рейтинг: 0 / 0
Где грабли?
    #32615323
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.5.0.4306
...
Рейтинг: 0 / 0
Где грабли?
    #32615338
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, загрузи 1.5.1

sourceforge.net/project/showfiles.php?group_id=9028
...
Рейтинг: 0 / 0
Где грабли?
    #32615392
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

В первом случае он чуть ли не весь кэш перелопатил - можно подумать, что индекс не использовался, хотя пишет, что таки использовался.
Как такое можно объяснить?
...
Рейтинг: 0 / 0
Где грабли?
    #32615402
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, к стати, в 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)
...
Рейтинг: 0 / 0
Где грабли?
    #32615403
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка Мазай прикалывается над зайцами.
...
Рейтинг: 0 / 0
Где грабли?
    #32615409
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты скачай 1.5.1 и там посмотри - может всё нормально будет ...
...
Рейтинг: 0 / 0
Где грабли?
    #32615449
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Как такое можно объяснить?

Очень просто. В первом случае поздапрос выполняется для каждой записи внешнего. Во втором - один раз.
:)
...
Рейтинг: 0 / 0
Где грабли?
    #32616496
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОчень просто. В первом случае поздапрос выполняется для каждой записи внешнего. Во втором - один раз.
:)
дык и в первом, и во втором случае одна запись возвращается.

я так думаю, что сервер идёт по индексу и для каждой записи c itemid=1 (а их порядка 300) выполняет один и тот же подзапрос. Получается, что оптимизатор не выполнил свою основную задачу? или как?

2mv:
ты что, как можно? зайцы - это для меня святое :)
...
Рейтинг: 0 / 0
Где грабли?
    #32617076
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dedushka Mazai
>дык и в первом, и во втором случае одна запись возвращается.

Причём тут это ? Правильно ! Непричем.
Но очень причем, сколько раз...

...
Рейтинг: 0 / 0
Где грабли?
    #32617194
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Johnmen:
умеешь ты, однако, загадками говорить... :)
...
Рейтинг: 0 / 0
Где грабли?
    #32617258
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал понятно...
Тогда так.
Неважно, сколько записей возвращает вложенный запрос, важно, сколько раз он выполнится в рамках выполнения основного.
(в контексте рассматриваемой проблемы/непроблемы)
:)
...
Рейтинг: 0 / 0
Где грабли?
    #32617575
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага - значит таки оптимизатор криво работает. тогда на этом вопрос закрыт
...
Рейтинг: 0 / 0
Где грабли?
    #32617600
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закрывать рано, т.к. ТАК ПРАВИЛЬНО И ОПТИМАЛЬНО работает оптимизатор !

...
Рейтинг: 0 / 0
Где грабли?
    #32617703
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и где же тут оптимальность его работы? два запроса, возвращающие одну и ту же запись, выполняются один быстрее, другой медленнее.
обоснуй, плиз, своё утверждение.

ты вот с этим
авторя так думаю, что сервер идёт по индексу и для каждой записи c itemid=1 (а их порядка 300) выполняет один и тот же подзапрос
согласен? если нет, объясни, где я неправ
...
Рейтинг: 0 / 0
Где грабли?
    #32618216
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dedushka Mazai

Ёкарный бабай ! Ну нельзя же так тупить, ей богу !
:)

Для некореллированного запроса вложенный запрос выполняется ОДИН РАЗ . После чего вып-ся внешний.
Для коррелированного запроса вложенный запрос выполняется СТОЛЬКО РАЗ, СКОЛЬКО ЗАПИСЕЙ в таблице itemvalues.

Чего тут может быть неясно ???????????
...
Рейтинг: 0 / 0
Где грабли?
    #32618400
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу нельзя же так тупить, ей богу !
туплю, кажися, не я :)

авторвложенный запрос выполняется СТОЛЬКО РАЗ, СКОЛЬКО ЗАПИСЕЙ в таблице itemvalues. - это ты погорячился.
сколько себя помню, всегда считал, что коррелированный подзапрос выполняется столько раз, сколько записей возвращает основной запрос

так что, борис - ты неправ
...
Рейтинг: 0 / 0
Где грабли?
    #32618411
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дедушка.

Если коррелирующий подзапрос - в условии Where, то прав Йохмен.
...
Рейтинг: 0 / 0
Где грабли?
    #32618426
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты говоришь про общую голую теорию безотносительно какого "типа" вложенный запрос.
А я тебе - про конкретный твой запрос.
Но если ты хочешь "подогнать" под неё, считай "столько раз, сколько записей возвращает основной запрос", в данном случае = сколько записей в таблице.
...
Рейтинг: 0 / 0
Где грабли?
    #32618596
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну не может он выполняться для всех записей, не может. в таблице их больше 3 млн. Простой select count по этой таблице выполняется 3 сек, а этот меньше секунды. к тому же Perfomance Analysis показал, что было выполнено 100 с лишним тысяч чтений индекса, но никак не 3 млн и не NATURAL, если бы эта ботва выполнялась для ВСЕХ записей из таблицы.

авторТы говоришь про общую голую теорию безотносительно какого "типа" вложенный запрос.
а коррелированные подзапросы бывают разных типов?

авторНо если ты хочешь "подогнать" под неё, считай "столько раз, сколько записей возвращает основной запрос", в данном случае = сколько записей в таблице.
уточняю ещё раз: оба запроса (с коррелированным и некоррелированным подзапросами) возращают ОДНУ запись, ОДНУ! а не все 3 млн.
...
Рейтинг: 0 / 0
Где грабли?
    #32618628
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
....................
...
Рейтинг: 0 / 0
Где грабли?
    #32619032
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такое ощущение, что мы о разных вещах говорим.
ладно, Johnmen, давай по-другому.
вот тебе запрос:

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')

а теперь, если тебе не сложно, объясни мне алгоритм, по которому сервер формирует результирующий набор данных (желательно в терминологии бд).
я не исключаю, что меня переклинило: в таком случае ткни меня, плиз, носом
в этот клин, за что буду тебе весьма благодарен
...
Рейтинг: 0 / 0
Где грабли?
    #32619043
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Пришить бы вас всех..."

Доцент (original). Джентльмены удачи.
...
Рейтинг: 0 / 0
Где грабли?
    #32619056
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2mv: спасибо, я уже просёк, что от тебя ничего конструктивного не дождёшься
...
Рейтинг: 0 / 0
Где грабли?
    #32619078
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я такой.
...
Рейтинг: 0 / 0
Где грабли?
    #32619176
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dedushka Mazaiselect 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')


для внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше

для каждой полученной записи выполняется кореллированный подзапрос
и фильтрует их по условию iv.ondate = (select max(ondate) ...

Проблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он должен это делать ;)
...
Рейтинг: 0 / 0
Где грабли?
    #32619246
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну наконец-то

автордля внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше
на самом деле это даёт одну запись, хотя перебирает он их все в процессе сканирования индекса(их у меня 355 для itemid=1)

ну а дальше
автордля каждой полученной записи выполняется кореллированный подзапрос
и фильтрует их по условию iv.ondate = (select max(ondate) ...
вот о чём я и говорю: он 355 раз выполняет один и тот же подзапрос.
355*355=126025. аналайзер показал 126380 чтений индекса - как раз где-то так и выходит. порядка 300 чтений серверу надо чтобы по дереву добраться до itemid=1.

авторПроблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он
должен это делать ;)
получается, что проблемы таки есть. то бишь оптимизатор не оправдывает возложенных на него надежд. собственно, проверять коррелированный подзапрос на некоррелированность от него и не требуется.
нужно всего лишь проверить, изменились ли параметры для вложенного подзапроса при переборе записей основного, и выполнять подзапрос только в том случае, если изменение имело место. а так получается мартышкин труд.
так это у меня и данных-то немного, а положим что их количество вырастет в несколько раз - так тут такие тормоза начнутся, что мама не горюй
...
Рейтинг: 0 / 0
Где грабли?
    #32619337
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dedushka Mazai

Учти в своих рассуждениях ещё один существенный в данном случае момент.
Булево выражение вычисляется не слева-направо, а справа-налево.
Если опять что-то будет неясно, то в понедельник...
...
Рейтинг: 0 / 0
Где грабли?
    #32619355
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dedushka Mazaiну наконец-то

автордля внешнего запроса сканируется индекс IV_IDX для условия iv.itemid=1. это даёт не 1-у запись, а много больше
на самом деле это даёт одну запись, хотя перебирает он их все в процессе сканирования индекса(их у меня 355 для itemid=1)Нет, это даёт 355 записей, т.к. используется только один сегмент индекса (itemid) а для второго значение еще не определено

Dedushka Mazai
авторПроблемы оптимизатора в том, что он не понимает того, что подзапрос на самом деле не кореллированный, т.е. не комбинирует условие корелляции itemid=iv.itemid с условием внешнего запроса iv.itemid=1. Не уверен, что он
должен это делать ;)
получается, что проблемы таки есть. то бишь оптимизатор не оправдывает возложенных на него надежд.Проблемы у всех есть. Если видишь - обходи. В данном случае это не сложно.

Dedushka Mazaiсобственно, проверять коррелированный подзапрос на некоррелированность от него и не требуется.
нужно всего лишь проверить, изменились ли параметры для вложенного подзапроса при переборе записей основного, и выполнять подзапрос только в том случае, если изменение имело место. а так получается мартышкин труд.
так это у меня и данных-то немного, а положим что их количество вырастет в несколько раз - так тут такие тормоза начнутся, что мама не горюй Можешь оформить bug report на SF
...
Рейтинг: 0 / 0
Где грабли?
    #32621342
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnmenУчти в своих рассуждениях ещё один существенный в данном случае момент.
Булево выражение вычисляется не слева-направо, а справа-налево.
а это здесь каким боком?
...
Рейтинг: 0 / 0
Где грабли?
    #32621526
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dedushka Mazai

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')

Поменяй местами сравнения вокруг and. И еще раз посмотри статистику выполнения...
...
Рейтинг: 0 / 0
Где грабли?
    #32621633
Dedushka Mazai
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего не поменялось - всё по-прежнему. а какие тут могут быть проблемы?
...
Рейтинг: 0 / 0
Где грабли?
    #32621887
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Johnmen

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')

Поменяй местами сравнения вокруг and. И еще раз посмотри статистику выполнения...

Это ты зря. Слева направо или наоборот - это порядок вычисления предикатов. В данном случае индексный поиск произойдет ранее. А потом порядок уже пофиг - "iv.itemid = 1" всегда будет истинно и влиять на подзапрос не будет.
...
Рейтинг: 0 / 0
Где грабли?
    #32621915
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>dimitr

>Это ты зря. Слева направо или наоборот - это порядок вычисления
>предикатов.

Где там предикаты ? М.б.все же булевого выражения ?
:)

>В данном случае индексный поиск произойдет ранее. А потом порядок уже
>пофиг - "iv.itemid = 1" всегда будет истинно и влиять на подзапрос не будет.

Возможно ты прав. Но это заслуга парсера и оптимизатора. Тогда в случае =1 выполнение подзапроса неизбежно. Т.е. он выполнится столько раз, сколько записей с =1. А вот во втором случае (см.выше) только один раз.
...
Рейтинг: 0 / 0
Где грабли?
    #32624477
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взято из Release Notes для Firebird 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.
...
Рейтинг: 0 / 0
Где грабли?
    #32624638
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery ShiskinВзято из Release Notes для Firebird 1.5.1Абсолютно не в тему
...
Рейтинг: 0 / 0
48 сообщений из 48, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Где грабли?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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