Re: fb 2.1: decompression overran buffer

2008-02-17 Пенетрантность Khorsun Vlad


"Леонид Агафонов" ...

после переноса баз на другой сервак проблема повторилась ... :(

попробуем понизить версию до 2.0.3


пока пытались перевсти базу на 2.0.3 проблема на время исчезла ...

с 07.02 неделю полёт был нормальный, но 15.02 ошибка опять
появилась ... :(

вопрос наверное к Владу, может быть подробнее раскажете чем внутри
сервера может быть вызвана ошибка, может у нас появиться мысль в какую
сторону копать?
если такая ошибка возникает только у нас, то очень бы хотелось понять
какие наши действия могут приводить к подобной проблеме



   Сложно сказать... Ну, например, сочетанием неизвестного бага в кеше
метаданных и сменой формата таблицы на ходу. Но это - пальцем в небо, увы.

   IBFirstAid'у такую базу не кормили ? Сразу после багчека

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

--
Хорсун Влад 





Re: fb 2.1: decompression overran buffer

2008-02-17 Пенетрантность Леонид Агафонов
> после переноса баз на другой сервак проблема повторилась ... :(
>
> попробуем понизить версию до 2.0.3

пока пытались перевсти базу на 2.0.3 проблема на время исчезла ...

с 07.02 неделю полёт был нормальный, но 15.02 ошибка опять
появилась ... :(

вопрос наверное к Владу, может быть подробнее раскажете чем внутри
сервера может быть вызвана ошибка, может у нас появиться мысль в какую
сторону копать?
 если такая ошибка возникает только у нас, то очень бы хотелось понять
какие наши действия могут приводить к подобной проблеме

С уважением, Леонид Агафонов

п.с. у gsAlexander'a такая же ошибка возникала на "другой" базе на
"другом" железе, но структура базы и метаданных очень схожи

Re: fb 2.1: decompression overran buffer

2008-02-17 Пенетрантность gsAlexander
  Добрый вечер. Возникла такая же проблема. FB 2.1.0.17735 SS иногда
зависает намертво, диспетчер задач задач показывает, что процессор не
загружен в данный момент. Подключиться к базе не возможно (Unable to
complete network request to host ...). В логе данная ошибка, помогает
только рестарт сервера. Изначально БД было под YA, под 2.0.3 работает
нормально, компоненты доступа используются IBX.
  Подскажите, как бороться с данной проблемой, или как её отловить.

Re: Интересности оптимизатора

2008-02-17 Пенетрантность Кузнецов Евгений




select * from
 (select first 1 *
  from test_table3 t1
  order by t1.id1) dt
inner join
  test_table3 t2
 on t2.id2 is null


В общем случае, разумеется, надо включить
first 1 и во внешний запрос



Re: Интересности оптимизатора

2008-02-17 Пенетрантность Кузнецов Евгений



А ведь ошибся :(


Но для

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2  and t2.id2 = 3

получаем
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2, TEST_TABLE3_ID1))
и 10/2 чтений


Число чтений верное, но план, разумеется, такой
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2))


Оказывается,
select * from test_table3 t1 left join test_table3 t2
 on ((t1.ID1 = t2.id2) OR (t1.ID1 is null and t2.ID2 is null)) and 
(t2.id2 = 3)


при плане PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE4_ID2, 
TEST_TABLE4_ID2))

требует аж 10/16 чтений


Естественно, PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2,
 TEST_TABLE3_ID2))



Интересности оптимизатора

2008-02-17 Пенетрантность Кузнецов Евгений


Доброго времени суток!

Немножко погонял 2.1.0.17735 RC1 и обнаружил
следующие интересные (для меня) вещи.
Возможно, они заинтересуют кого-нибудь еще.
Насколько я понимаю, все это верно и для 2.0.x

Итак, начнем

CREATE TABLE TEST_TABLE3 (
ID1  INTEGER,
ID2  INTEGER
);

COMMIT;


INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (3, 7);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (9, 8);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (6, 3);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (7, 7);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (4, 9);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (3, 5);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (9, 2);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (10, 8);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (7, 2);
INSERT INTO TEST_TABLE3 (ID1, ID2) VALUES (4, 5);

COMMIT;

CREATE INDEX TEST_TABLE3_ID1 ON TEST_TABLE3 (ID1);
CREATE INDEX TEST_TABLE3_ID2 ON TEST_TABLE3 (ID2);

COMMIT;

Пример 1.

select Count(*) from test_table3 t1 inner join test_table3 t2
 on t1.ID1 = t2.ID2
where t2.id2 = 3

PLAN JOIN (T1 INDEX (TEST_TABLE3_ID1), T2 INDEX (TEST_TABLE3_ID2))

Честно скажу, не сразу сообразил, что оптимизатор превращает
условие t1.ID1 = t2.ID2 and t2.id2 = 3 в t1.ID1 = t2.ID2 and t1.id1 = 3

В данном случае, это немного хуже варианта с
select Count(*) from test_table3 t2 inner join test_table3 t1
 on t1.ID1 = t2.ID2
where t2.id2 = 3
с планом
PLAN JOIN (T2 INDEX (TEST_TABLE3_ID2), T1 INDEX (TEST_TABLE3_ID1))

- 4 и 3 индексных чтения соответственно.

Впрочем, в реальных условиях для разных таблиц, нужно сильно 
постараться, чтобы потерять в производительности - например, если 
селективности индексов совпадают, но по ID1 идет перекос в сторону 3,

а в ID2 - в сторону 5.

Это, естественно, не баг, а особенность реализации.

Пример 2.

Оптимизатор хорошо обрабатывает условия с равенствами и неравенствами
в where

select Count(*) from test_table3 t1 inner join test_table3 t2
 on t1.ID1 = t2.ID2
where (t2.id1 = t1.id2)
план
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2, TEST_TABLE3_ID1))

select Count(*) from test_table3 t1 inner join test_table3 t2
 on t1.ID1 = t2.ID2
where (t2.id1 >= t1.id2)
план
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2, TEST_TABLE3_ID1))

Но стоит немного усложнить выражение:

select Count(*) from test_table3 t1 inner join test_table3 t2
 on t1.ID1 = t2.ID2
where (t2.id1 = t1.id2-1)

или

select Count(*) from test_table3 t1 inner join test_table3 t2
 on t1.ID1 = t2.ID2
where (t2.id1 > t1.id2-1)

как получаем

PLAN JOIN (T2 NATURAL, T1 INDEX (TEST_TABLE3_ID1))

хотя в этих случаях, на первый взгляд, ничто не мешает
задействовать индекс по t2.id1

Пример 3.

Итак, условия в where при inner-связке оптимизатор более-менее обрабатывает.

Как насчет left?

Поскольку таблица всего одна, далее будем использовать сокращение
U / I - U безиндексных и I индексных чтения из таблицы TEST_TABLE3


Оказывается, условие в where не всегда учитывается должным образом

Например,
select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2
where t2.id2 = 0

с планом
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2))

требует всего 10 / 0 чтений - т.е. условие
в where было принято во внимание, и не потребовалось 10 раз читать по 
индексу T2.


Но если взять

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2
where t2.id2 = 3

с планом
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2)),

то получим 10 /10 чтений - т.е. оптимизатор условие в Where
проигнорировал.
Чтобы этого не случилось, нужно включить t2.id2 = 3 в условие связки

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2 and t2.id2 = 3
where t2.id2 is not null

Получаем 10 / 2 чтения.

Что ж, это еще одна причина не писать кривых запросов (а запрос, и в 
самом деле, кривой), используя left там, где требуется inner.


Пример 4

Так же хорошо оптимизируется нововведение is not distinct from,
как и обычный предикат равенства?

И

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2,

и

select * from test_table3 t1 inner join test_table3 t2
 on t1.ID1 is not distinct from t2.ID2

выполняются с одинаковым планом:
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2))

требуя 10 / 8  чтений.

Но для

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 = t2.ID2  and t2.id2 = 3

получаем
PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2, TEST_TABLE3_ID1))
и 10/2 чтений

а для

select * from test_table3 t1 left join test_table3 t2
 on t1.ID1 is not distinct from t2.ID2 and t2.id2 = 3

PLAN JOIN (T1 NATURAL, T2 INDEX (TEST_TABLE3_ID2))
и 10/10 чтений.

NULL-ов в тестовой таблице нет, поэтому по идее разницы быть не должно.
Скорее всего, внутри сервера t1.ID1 is not distinct from t2.ID2
раскладывается в (t1.ID1 = t2.id2) OR (t1.ID1 is null and t2.ID2 is 
null). Попробуем выполнить эту замену в самом запросе


Оказывается,
select * from test_table3 t1 left join test_table3 t2
 on ((t1.ID1 = t2.id2)

Re: Непонятки с order by. То ли лыжи не едут, то ли...

2008-02-17 Пенетрантность Taras Kucher


Dmitry Yemanov пишет:

Бага:
http://tracker.firebirdsql.org/browse/CORE-1089


Может я не зарегистрирован там и не увидел, но нарыл вот ещё что.
Если пробовать сортировать указанное представление VW_TEST по полю 
TEST_VALUE_NAME detail-таблицы TB_TEST_VALUE, то сортировка проходит 
успешно. А вот по полям master-таблицы - фиг там...



С уважением,
Тарас Кучер