Сильное падение производительности сервера

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 15 ноя 2007, 21:10

База прыжком не увеличивалась. Обычно, раз в год, добавляется около 1 млн. записей. Потом немного "обвески" (около 500 тыс.). И это все. Далее идут апдейты. Причем, после добавления записей, я всегда делаю backup/restore.
Первый запрос можно и по натуралу прогнать. Даже быстрее работает, сегодня проверял. Но все равно, очень медленно!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 ноя 2007, 11:34

Дмитрий писал(а):Первый запрос можно и по натуралу прогнать. Даже быстрее работает, сегодня проверял. Но все равно, очень медленно!
Ты мой вариант пробовал?

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 16 ноя 2007, 11:56

WildSery писал(а):
Дмитрий писал(а):Первый запрос можно и по натуралу прогнать. Даже быстрее работает, сегодня проверял. Но все равно, очень медленно!
Ты мой вариант пробовал?
Да, пробовал. Выполняется быстро, только в том виде, в каком проедура выложена, она не компилится.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 ноя 2007, 13:04

Дмитрий писал(а):только в том виде, в каком проедура выложена, она не компилится.
7.5 не умеет по выражению сортировать, я подозреваю? (order by customer_id+0).
А без него в плане есть ORDER ?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 16 ноя 2007, 14:08

WildSery писал(а):Ты мой вариант пробовал?
Твой вариант хорош и способствует взращиванию в вопрошающем алгоритмиста. Но я бы таки советовал ему и разобраться зачем нужны индексы и как они используются. Скажем, я почти уверен, что если форсировать во внутреннем запросе 5-й индекс, а не третий, то это существенно улучшит ситуяйцию и в его варианте. А если вторым сегментом всунуть в этот индекс между CUSTOMER_ID и DOC_ID дату, то вообще мухой полетит.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 16 ноя 2007, 15:06

Merlin писал(а):если форсировать во внутреннем запросе 5-й индекс, а не третий
Наверное, всё же 5й вместо 1го ;)
Merlin писал(а):Но я бы таки советовал ему и разобраться зачем нужны индексы и как они используются.
Мне показалось, что это очевидно - автор не понял индексов, надо читать :)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 16 ноя 2007, 15:30

WildSery писал(а):
Merlin писал(а):если форсировать во внутреннем запросе 5-й индекс, а не третий
Наверное, всё же 5й вместо 1го ;)
А, ну да, естественно.

fb.bird
Сообщения: 13
Зарегистрирован: 26 окт 2007, 11:57

Сообщение fb.bird » 17 ноя 2007, 22:21

Обратите внимание на порядок столбцов в индексе
Дмитрий писал(а):

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

CREATE UNIQUE INDEX DOC_HIS1 ON DOC_HISTORY (DOC_ID, CUSTOMER_ID);
CREATE INDEX DOC_HIS2 ON DOC_HISTORY (CUSTOMER_ID);
в процедуре CLEAR_DOC_HISTORY
Дмитрий писал(а):

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

   FOR SELECT CUSTOMER_ID, DOC_ID
       FROM DOC_HISTORY
       WHERE (CUSTOMER_ID = :CUSTOMER_ID)  AND ...
          ...
          ...
       PLAN (DOC_HISTORY INDEX (DOC_HIS1))
Ах вот ты где, Северный Олень!
Здесь в плане запроса нужно указать индекс DOC_HIS2, будет работать быстрее - сравните до изменения и после, не поленитесь.

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 18 ноя 2007, 00:12

fb.bird писал(а):Обратите внимание на порядок столбцов в индексе
Дмитрий писал(а):

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

CREATE UNIQUE INDEX DOC_HIS1 ON DOC_HISTORY (DOC_ID, CUSTOMER_ID);
CREATE INDEX DOC_HIS2 ON DOC_HISTORY (CUSTOMER_ID);
в процедуре CLEAR_DOC_HISTORY
Дмитрий писал(а):

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

   FOR SELECT CUSTOMER_ID, DOC_ID
       FROM DOC_HISTORY
       WHERE (CUSTOMER_ID = :CUSTOMER_ID)  AND ...
          ...
          ...
       PLAN (DOC_HISTORY INDEX (DOC_HIS1))
Ах вот ты где, Северный Олень!
Здесь в плане запроса нужно указать индекс DOC_HIS2, будет работать быстрее - сравните до изменения и после, не поленитесь.
Да, сам заметил. В понедельник пробовать буду. Вообще-то надо этот индекс перестроить.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 ноя 2007, 19:00

fb.bird писал(а):Ах вот ты где, Северный Олень!
Здесь в плане запроса нужно указать индекс DOC_HIS2, будет работать быстрее - сравните до изменения и после, не поленитесь.
Чего несёшь-то? DOC_HIS5 будет однозначно быстрее чем DOC_HIS2.
А самый быстрый выбор в этом запросе будет по индексу (CUSTOMER_ID, DOC_DATE, DOC_ID), как уже намекнул Мерлин.

Дмитрий
Сообщения: 127
Зарегистрирован: 26 окт 2004, 11:05

Сообщение Дмитрий » 19 ноя 2007, 09:55

Н-да... А где бы почитать про индексы? Так сказать заполнить пробел в знаниях. Только не типа "индексы для чайников", а что-нибудь серьезное!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 19 ноя 2007, 10:55

Описанного в статье мне хватило для понимания.

Ответить