powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Использование индекса
7 сообщений из 7, страница 1 из 1
Использование индекса
    #34958603
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы:
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
 CREATE TABLE "DB2ADMIN"."ATTRIBUTES"  (
		  "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (  
		    START WITH + 1207040   
		    INCREMENT BY + 1   
		    MINVALUE + 0   
		    MAXVALUE + 1000000000000   
		    NO CYCLE  
		    CACHE  20   
		    NO ORDER ) , 
		  "ID_VAR" BIGINT NOT NULL , 
		  "ID_PROCESS" BIGINT NOT NULL , 
		  "VALUE_VAR" VARCHAR( 256 ) )   
		 IN "USERSPACE1" ; 

CREATE INDEX "DB2ADMIN"."QQQ" ON "DB2ADMIN"."ATTRIBUTES" 
		("ID_VAR" ASC)
		PCTFREE  10  CLUSTER MINPCTUSED  10 ;
ALTER TABLE "DB2ADMIN"."ATTRIBUTES" 
	ADD CONSTRAINT "CC1195719520266" PRIMARY KEY
		("ID");


CREATE TABLE "DB2ADMIN"."VARIABLES"  (
		  "ID_VAR" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (  
		    START WITH + 631   
		    INCREMENT BY + 1   
		    MINVALUE + 1   
		    MAXVALUE + 1000000   
		    NO CYCLE  
		    CACHE  20   
		    NO ORDER ) , 
		  "NAME_VAR" VARCHAR( 128 ) , 
		  "TYPE_VAR" VARCHAR( 32 ) , 
		  "ADDITION_VAR" VARCHAR( 2048 ) , 
		  "ID_TYPE_PROCESS" INTEGER NOT NULL WITH DEFAULT  0  , 
		  "VALUE_BY_DEFAULT" VARCHAR( 256 ) , 
		  "IS_ID" SMALLINT NOT NULL WITH DEFAULT  0  , 
		  "IS_MAIN" SMALLINT NOT NULL WITH DEFAULT  0  )   
		 IN "USERSPACE1" ; 

ALTER TABLE "DB2ADMIN"."VARIABLES" 
	ADD CONSTRAINT "PK_VARIABLES" PRIMARY KEY
		("ID_VAR");

выполняю запрос
Код: plaintext
1.
2.
3.
SELECT V.NAME_VAR, A.VALUE_VAR, V.TYPE_VAR, V.ADDITION_VAR, V.IS_ID, V.IS_MAIN
FROM DB2ADMIN.ATTRIBUTES AS A, DB2ADMIN.VARIABLES AS V
WHERE A.ID_PROCESS =  123456  AND V.ID_VAR = A.ID_VAR;
план доступа показывает (см. рисунок), что по обеим таблицам идет не индексированный доступ (команда TBSCAN). Пробовал создавать различные индексы, собирать статистику по таблицам, индексам, план не меняется. Что необходимо сделать для того чтобы запрос выполнялся по индексам 2-х таблиц?
...
Рейтинг: 0 / 0
Использование индекса
    #34958715
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для таблицы ATTRIBUTES логично использовать сканирование таблицы. Не надо делать чтение индекса, т.к. в любом случае надо читать данные таблицы.

Для талицы VARIABLES получаем множество ключей из предыдущей таблицы. Опять же, чтение индекса не выгодно, т.к. надо читать данные из таблицы.

Когда, стоимость чтение индекса и поднятия страниц данных станет дешевле стоимости чтения всей таблицы, тогда БД будет использовать индекс.
...
Рейтинг: 0 / 0
Использование индекса
    #34958997
Rust()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но операция сканирования слишком дорогая, нельзя ли увеличить производительность такого запроса?
...
Рейтинг: 0 / 0
Использование индекса
    #34959207
use-se
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может размер таблиц небольшой?
...
Рейтинг: 0 / 0
Использование индекса
    #34959726
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Размер таблицы может быть очень большим. Однако, СУБД может посчитать, что полное сканирование таблицы дешевле.
С такой штукой я сталкивался и при работе с Oracle, где количество записей в таблице было около 10^7.
На Oracle спасло ситуацию использование хинта - нужно быстрее получить первую запись. В этом случае СУБД оценивало, что получить быстрый ответ легче, если используется индекс. Суммарное время общей выборки получалось немного медленнее, нежели полное сканирование.

Исходя из вашего запроса, напрашивается использование индекса для ATTRIBUTES по полю ID_PROCESS.

Можно попробовать обмануть БД, написав предварительную выборку из объединения множеств индексов.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select ...
from ATTRIBUTES, VARIABLES, 
  (
   select ATTRIBUTES.ID_VAR from ATTRIBUTES, VARIABLES 
   where ATTRIBUTES.ID_VAR=VARIABLES.ID_VAR
  ) T
where ATTRIBUTES.ID_VAR=T.ID_VAR and VARIABLES.ID_VAR=T.ID_VAR and ...

Если оптимизатор шибко умный, он поймет, что его хотят надуть и возьмет полное сканирование.
В противном случе он для первой выборки воспользуется индексами.
...
Рейтинг: 0 / 0
Использование индекса
    #34960188
Vladimir Kiselev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
db2advis не пробовал?
Мы обычно его используем, потом смотрим какие индексы он хочет и т.п. Таким образом оптимизируем запросы, получается неплохо.
...
Рейтинг: 0 / 0
Использование индекса
    #34979280
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно читал статью: http://www.dbazine.com/db2/db2-mfarticles/mullins-db2indexing

Там есть такая фраза: Sometimes, however, it can be advantageous to include additional columns in an index to increase the chances of index-only access. (Index-only access is discussed further in Chapter 21 “The Optimizer.”) For example, suppose that there is an index on the DEPTNO column of the DSN8810.DEPT table...

И ещё такой совет: keep creating indexes to enhance the performance of your queries until the performance of data modification becomes unacceptable. Then delete the last index you created.


Может быть Вам попробовать создать некластерный индекс по полям A.VALUE_VAR, V.ID_VAR, A.ID_PROCESS - я предполагаю что у A.VALUE_VAR минимальная селективность (cardinality).

Тогда оптимизатор, по-идее, должен "увидеть" возможность считать данные из индекса и соответственно выберет индекс.

Было бы интересно узнать результат.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Использование индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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