powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как правильно построить индексы для соединения двух таблиц по двум полям?
7 сообщений из 32, страница 2 из 2
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33374792
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбегалло
Код: plaintext
1.
2.
create table tbl (referens varchar( 50 ), rs_rownum int8);
    insert into tbl  values (i, i || '                              ');

Инсерт с ошибкой? Поля наоборот.
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33374796
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВыбегаллоПеределал процедуру на повторяющтиеся значения в f1 :
Код: plaintext
1.
2.
DYNAMIC HASH JOIN 
    Dynamic Hash Filters: (informix.a.f2 = informix.t1.f2 AND informix.a.f1 = informix.t1.f1 ) 
Выполняется все равно моментально, на лаптопе.

Поле f2 все равно уникальное, информикс поменял порядок предикатов в фильтре. Попробуй в поле f2 положить mod 10
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33374814
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
create procedure popul (nrows int);
  define i int;
  delete from tbl;
  for i =  1  to nrows
    insert into tbl  values (mod(i, 10 ) || '                         ', mod(i,  20 ));
  end for
end procedure;

Занимает ~ 16  sec, возвращает 
      (count(*))
         20643089 

План не поменялся :

QUERY:
------
select
count(*) from t2 A, t1
where A.f1=t1.f1 and A.f2=t1.f2

Estimated Cost:  11205 
Estimated # of Rows Returned:  1 

   1 ) informix.a: SEQUENTIAL SCAN

   2 ) informix.t1: SEQUENTIAL SCAN


DYNAMIC HASH JOIN 
    Dynamic Hash Filters: (informix.a.f2 = informix.t1.f2 AND informix.a.f1 = informix.t1.f1 ) 

В таком вот аксепте
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33377622
Выбегалло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
win-kim
Код: plaintext
1.
2.
3.
select 
count(*) from t2 A, t1
where A.f1=t1.f1 and A.f2=t1.f2;
Код: plaintext
1.
20319


Я думаю, что запрос на соединении двух таблиц по 20 тыс строк, который выполняется пол минуты это неправильно.

По одному полю соединение таблиц в 1 млн строк идет быстрее. Все таки нужно как то сделать быстрее.


Зависит от избирательности фильтра. В предельном случае у вас будет декартово произведение таблиц в 400 миллионов записей - вполне может и больше полминуты выполняться :-)
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33385342
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ids 9.50tc1 (10.0tc1)
OPTCOMPIND 2
DS_NONPDQ_QUERY_MEM 128 # по умолчанию, меньше к сожалению не сделать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create temp table t1(a varchar(50), b  serial8 );
create temp table t2(a varchar(50), b  serial8 );

insert into t1 select name, 0 from  sysobjstate; -- 10 раз 
24110 rows
insert into t2 select * from  t1;
24110 rows
Update statistics medium for table t1;
Update statistics medium for table t2;

select{+ Explain} count(*)
from t1, t2
where t1.a=t2.a and t1.b=t2.b

DIRECTIVES FOLLOWED: 
EXPLAIN 
DIRECTIVES NOT FOLLOWED: 

Estimated Cost: 12865
Estimated # of Rows Returned: 1

  1) informix.t1: SEQUENTIAL SCAN
  2) informix.t2: SEQUENTIAL SCAN
DYNAMIC HASH JOIN 
    Dynamic Hash Filters: (informix.t1.b = informix.t2.b AND informix.t1.a = informix.t2.a ) 

24110 rows -  0.3  sec. При PDQPriority 100 -  0.2  sec
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33406843
Сугубый
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял, секвентал скан на больших таблицах (не умещающихся в памяти) - очень дорогостоящая операция (чтение с диска) и её следует избегать при оптимизации. Тот же коленкор с DYNAMIC HASH JOIN - сервер при каждом запросе строит индекс! Как же неоптимально должны быть созданы индексы (или вообще не созданы) что бы планировщик решил сначала создать индекс, а потом делать выборку...

(Народ, интересно, читал статейку An Overview of the IBM Informix Dynamic Server Optimizer ?)
...
Рейтинг: 0 / 0
Как правильно построить индексы для соединения двух таблиц по двум полям?
    #33407102
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
An ogre is like an onion.

Дальше мое имхо, можете спокойно не верить, просто попытайтесь задуматься.

1. Читаем всегда страницами (либо 2,4,8...кб).
2. Оптимизатор строит множество планов запросов и выбирает с наименьшей стоимостью.
3. Стоимость плана вычисляется в чтениях (см. пункт 1). Оптимизатор не волнует кеширование (легко понять почему).
4. Стоимость секскана таблички размером одна станица 1 (одно чтение), стоимость при индексном доступе 3 (три чтения).
5. Тоже самое для таблички любого размера (если надо прочесть всю таблицу!!!!), сначала идем в индекс читаем верхний уровень, снова идем в индекс читаем второй уровень находим ровид, идем в саму таблицу.
6. Если надо соединить две таблицы большого размера и в результате получится МНОГО строк, хешджойн будет дешевле и быстрее чем нестидлуп.
7. Хешджойн дешевле и быстрее чем нестидлуп, но жрет больше процессора и памяти.

СугубыйНасколько я понял, секвентал скан на больших таблицах (не умещающихся в памяти) - очень дорогостоящая операция (чтение с диска)
В принципе не надо много памяти, прочитал чуть-чуть отфильтровал/отдал клиенту, читай следующий кусок.

Сугубыйи её следует избегать при оптимизации.
Когда как. Если все равно надо прочитать всю таблицу для выполнения запроса, то чтение через индекс дороже чем секскан.

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

Сугубый
Как же неоптимально должны быть созданы индексы (или вообще не созданы) что бы планировщик решил сначала создать индекс, а потом делать выборку...
сексканы бывают полезны, иногда;
иногда полезнен картезиан;
индексы иногда мешают;
в oltp хорошо нестидлуп, хешджойн плохо, в dss вероятно наоборот;

Сугубый(Народ, интересно, читал статейку An Overview of the IBM Informix Dynamic Server Optimizer ?)Я не четал, я чукча-песатель. :-)
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как правильно построить индексы для соединения двух таблиц по двум полям?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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