powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По планам
3 сообщений из 28, страница 2 из 2
По планам
    #40012839
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подрезюмирую. После разных экспериментов, пришёл к выводу, что единственный вариант - ситуативное отключение индексов по +0.

Заменить FOREIGN KEY на триггеры, т.е. убрать плохие индексы совсем, тоже не панацея. Плохие индексы тоже могут приносить пользу. Ниже привожу пример.

Пример. Запрос на заполнение всё той же таблицы (статистика индексов остается та же, распределение данных по полю "id" немного другое):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
execute block
AS
  declare cnt integer;
  declare k integer;
begin
  k = 0;
  cnt = 0;
  while (cnt < 100000) do
  begin
    insert into tbl(id, fld) values(:cnt/16667, :k);
    k = k + 1;
    if (k > 4663) then k = 0;
    cnt = cnt + 1;
  end
  execute statement 'set statistics index TBL_IDX_FLD';
  execute statement 'set statistics index TBL_IDX_ID';
end



Тестовый запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
execute block
as
  declare i integer;
  declare tmp boolean;
begin
  i = 0;
  while (i < 100) do
  begin
    tmp = exists (select * from tbl where id = 1);
    tmp = exists (select * from tbl where id = 2);
    tmp = exists (select * from tbl where id = 3);
    tmp = exists (select * from tbl where id = 4);
    tmp = exists (select * from tbl where id = 5);
    i = i + 1;
  end
end



С плохим индексом

Plan
PLAN (TBL INDEX (TBL_IDX_ID))
PLAN (TBL INDEX (TBL_IDX_ID))
PLAN (TBL INDEX (TBL_IDX_ID))
PLAN (TBL INDEX (TBL_IDX_ID))
PLAN (TBL INDEX (TBL_IDX_ID))

Prepare time = 0ms
Execute time = 156ms
Current memory = 28 270 576
Max memory = 32 234 688
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 6 335

Без индекса

Plan
PLAN (TBL NATURAL)
PLAN (TBL NATURAL)
PLAN (TBL NATURAL)
PLAN (TBL NATURAL)
PLAN (TBL NATURAL)

Prepare time = 0ms
Execute time = 7s 718ms
Current memory = 28 218 880
Max memory = 32 234 688
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 25 646 715
...
Рейтинг: 0 / 0
По планам
    #40012931
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ggreggory
Заменить FOREIGN KEY на триггеры, т.е. убрать плохие индексы совсем, тоже не панацея.

Это вообще идея так себе.
Триггеры работают в контексте транзакции, т.е. видеть могут далеко не всё.
FK работают вне транзакций.
...
Рейтинг: 0 / 0
По планам
    #40012968
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks,

да и сравнивать выборку по индексу и натуралом - тоже идея так себе.
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По планам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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