powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SAP vs DB2, использование %_HINTS
8 сообщений из 8, страница 1 из 1
SAP vs DB2, использование %_HINTS
    #38837959
MerCOOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Сразу скажу, что я не администратор DB2, а SAP Basis администратор. В компании САП крутится на ДБ2 (09.07.0007, OS Linux), к сожалению администратора БД нет, а с ней иногда случаются странные вещи и специалистов по ней как назло не найти...
Ладно, перейду к сути проблемы. Есть запрос в ABAP'е к одной табличке, причем в условиях WHERE достаточно много значений. К этой табличке есть так же много стандартных индексов, причем в многих из них эти условия встречаются. По не понятной причине оптимизатор БД стал использовать "плохой" индекс и прямые чтения по этой табличке взлетели до небесь и процесс по сути встал. Пробовал пересобирать статистику, как по индексу, так и по табличке, не помогало. Помогало сделать rubuild index но теперь и это не помогает.
Вот так этот запрос выглядит в БД:
Код: sql
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.
SELECT *
   FROM "DIFT_POS_IDENT" T_00 , (
           SELECT *
             FROM ( VALUES ( CAST ( ? AS VARCHAR ( 9 ) ) , CAST ( ? AS VARCHAR ( 12 ) ) , CAST ( ? AS VARCHAR ( 12 ) ) , CAST ( ? AS VARCHAR ( 9 ) ) , CAST ( ? AS VARCHAR ( 12 ) ) , CAST ( ? AS VARCHAR (
                          12 ) ) , CAST ( ? AS VARCHAR ( 36 ) ) , CAST ( ? AS VARCHAR ( 30 ) ) , CAST ( ? AS VARCHAR ( 39 ) ) , CAST ( ? AS VARCHAR ( 30 ) ) , CAST ( ? AS VARCHAR ( 30 ) ) , CAST ( ? AS
                        VARCHAR ( 39 ) ) , CAST ( ? AS VARCHAR ( 30 ) ) , CAST ( ? AS VARCHAR ( 16 ) FOR BIT DATA ) , CAST ( ? AS VARCHAR ( 3 ) ) , CAST ( ? AS VARCHAR ( 39 ) ) , CAST ( ? AS VARCHAR (
                          30 ) ) , CAST ( ? AS VARCHAR ( 15 ) ) ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ,
                      ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? ,
                      ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? ,
                      ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) , ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ,
                      ? , ? ) ) AS FAE_TMP ( "C_01" , "C_02" , "C_03" , "C_04" , "C_05" , "C_06" , "C_07" , "C_08" , "C_09" , "C_10" , "C_11" , "C_12" , "C_13" , "C_14" , "C_15" , "C_16" , "C_17" ,
                    "C_18" )
            GROUP BY "C_01" , "C_02" , "C_03" , "C_04" , "C_05" , "C_06" , "C_07" , "C_08" , "C_09" , "C_10" , "C_11" , "C_12" , "C_13" , "C_14" , "C_15" , "C_16" , "C_17" , "C_18"
        ) AS "T_01"
  WHERE T_00."MANDT" = ?
    AND T_00."CONTEXT" = ?
    AND T_00."VALUATION_AREA" = T_01.C_01
    AND T_00."VALUATION_CLASS" = T_01.C_02
    AND T_00."COM_VAL_CLASS" = T_01.C_03
    AND T_00."PRODUCT_TYPE" = T_01.C_04
    AND T_00."ACCOUNTING_CODE" = T_01.C_05
    AND T_00."COMPANY_CODE" = T_01.C_06
    AND T_00."TRADER" = T_01.C_07
    AND T_00."PORTFOLIO" = T_01.C_08
    AND T_00."SECURITY_ID" = T_01.C_09
    AND T_00."ACCOUNT_GROUP" = T_01.C_10
    AND T_00."SECURITY_ACCOUNT" = T_01.C_11
    AND T_00."LOANS_CONTRACT" = T_01.C_12
    AND T_00."POSITION_ACCOUNT" = T_01.C_13
    AND T_00."LOT_ID" = T_01.C_14
    AND T_00."FLAG_LONG_SHORT" = T_01.C_15
    AND T_00."DEAL_NUMBER" = T_01.C_16
    AND T_00."EXTERNAL_ACCOUNT" = T_01.C_17
    AND T_00."DIFF_CURRENCY" = T_01.C_18



Оптимайзер использует индекс LOT со следующими полями:
MANDT
LOT_ID
ACCOUNTING_CODE
VALUATION_AREA
VALUATION_CLASS

Я считаю, что он должен использовать другой индекс, SEC с полями:
MANDT
CONTEXT
ACCOUNTING_CODE
VALUATION_AREA
VALUATION_CLASS
PORTFOLIO
ACCOUNT_GROUP
SECURITY_ACCOUNT
SECURITY_ID

А index adviser говорит вообще о третьем индексе FUT с полями:
MANDT
CONTEXT
ACCOUNTING_CODE
VALUATION_AREA
VALUATION_CLASS
POSITION_ACCOUNT
SECURITY_ID
FLAG_LONG_SHORT

Я решил попробовать прописать в коде хинты на использование нужного мне индекса. Прочитал САПовские ноты
724614 - DB2-z/OS: Database hints in Open SQL as of Kernel Rel 6.20
150037 - Database hints in Open SQL for DB6 (DB2 for LUW)
868888 - DB6: Optimization Guidelines
так же еще нашел ноты, где прямо в коде указывался хинт для db2. Честно говоря, как я не пробовал и не менял синтаксис, все равно хинт не работает и берет старый индекс.
Исходный запрос в АБАПе выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    SELECT * FROM dift_pos_ident
           INTO TABLE l_tab_buffer_tmp
           FOR ALL ENTRIES IN l_tab_selector
    WHERE context          EQ im_context
    AND   valuation_area   EQ l_tab_selector-valuation_area
    AND   valuation_class  EQ l_tab_selector-valuation_class
    AND   com_val_class    EQ l_tab_selector-com_val_class
    AND   product_type     EQ l_tab_selector-product_type
    AND   accounting_code  EQ l_tab_selector-accounting_code
    AND   company_code     EQ l_tab_selector-company_code
    AND   trader           EQ l_tab_selector-trader
    AND   portfolio        EQ l_tab_selector-portfolio
    AND   security_id      EQ l_tab_selector-security_id
    AND   account_group    EQ l_tab_selector-account_group
    AND   security_account EQ l_tab_selector-security_account
    AND   loans_contract   EQ l_tab_selector-loans_contract
    AND   position_account EQ l_tab_selector-position_account
    AND   lot_id           EQ l_tab_selector-lot_id
    AND   flag_long_short  EQ l_tab_selector-flag_long_short
    AND   deal_number      EQ l_tab_selector-deal_number
    AND   external_Account EQ l_tab_selector-external_account
    AND   diff_currency    EQ l_tab_selector-diff_currency



сейчас у меня такой синтаксис у хинта:
Код: sql
1.
%_HINTS DB2 '<IXSCAN TABLE=''DIFT_POS_IDENT'' INDEX=''"DIFT_POS_IDENT~SEC"'' />'.


пробовал менять DB2 на DB6, INDEX на SAP_INDEX, так же пробовал вот такой синтаксис (это в саповских нотах встречал)
Код: sql
1.
2.
3.
4.
%_HINTS DB2
  'CTE_HINT=WITH DSN_INLINE_OPT_HINT ' &
  '(TABLE_NAME, ACCESS_TYPE, ACCESS_NAME)' &
  ' AS (VALUES ( ''DIFT_POS_IDENT'', ''INDEX'', ''DIFT_POS_IDENT~SEC''))'.


ничего не помогло.
Так же встретил упоминание, что должен быть включен какой-то параметр:
авторDB2 ZPARM OPTHINTS must be set to YES
но как там же написано, это до 9-й версии, выше 9-ки он включен по умолчанию

Прошу помощи, как побороть этот недуг, очень надо :)
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38838041
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MerCOOL,

Я не SAP специалист, но если у вас DB2 for Linux, Unix and Windows, а не DB2 for Z/OS, то вам везде надо использовать DB6, а не DB2.
Судя по нотам, в ктороых описывается синтакис хинтов для DB2 for LUW в SAP, у вас должно быть:

%_HINTS DB6 '<IXSCAN TABLE=''DIFT_POS_IDENT'' INDEX=''"DIFT_POS_IDENT~SEC"'' />'
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38838051
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще попробуйте использовать алиас таблицы, а не её имя.

Код: sql
1.
%_HINTS DB6 '<IXSCAN TABLE=''T_00'' INDEX=''"DIFT_POS_IDENT~SEC"'' />' 


По крайней мере в натуральных хинтах в DB2 для запросоы с алиасами надо именно их использовать, а не имена самих таблиц.
Не знаю, изменяет ли САП пользовательский хинт сам при трансляции его текста в DB2-шный синтаксис...
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38838156
MerCOOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Марк огромнейшее вам спасибо, с алиасом 'T_00' все заработало, теперь запрос летает!



А можно как-то понять, почему он выбирает другой индекс? В оракле есть такое понятие, как качество индекса, может как-то можно и в ДБ2 это посмотреть и поправить без хинтов в коде?
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38838423
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MerCOOL,

На план запроса, конечно, много чего влияет, но вкратце так.

Статистику по индексам можно посмотреть в:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
  INDNAME
, FIRSTKEYCARD, FIRST2KEYCARD, FIRST3KEYCARD, FIRST4KEYCARD, FULLKEYCARD
FROM SYSCAT.INDEXES 
WHERE TABNAME='DIFT_POS_IDENT'
--AND TABSCHEMA='...'


там кардинальность (кол-во разных значений) как всего индекса, так и первых одного, двух, трех и четырех полей.
В вашем случае эти индексы отличаются по большому счету 2-мя первыми полями, поэтому посмотрите, какие для них будут
FIRSTKEYCARD, FIRST2KEYCARD, FULLKEYCARD.
Кроме того, оно может смотреть на статистику распределения данных в этих полях
Код: sql
1.
2.
3.
4.
SELECT COLCARD, COLNAME
FROM SYSCAT.COLUMNS
WHERE TABNAME='DIFT_POS_IDENT' AND COLNAME IN ('MANDT', 'LOT_ID', 'CONTEXT')
--AND TABSCHEMA='...'


Большего, наверное, оно не может использовать (ну, еще может цену i/o исходя из размеров индексов), т.к. у вас параметры используются, т.е. на момент компиляции запроса непонятно, какие там актуальные значения будут.

То, что вы можете попробовать, это заставить запрос компилироваться каждый раз при выполнении, когда актуальные значения будут известны. Наверное, это у САП делается хинтом со словами REOPT ALWAYS или как-то по-другому ему где-то в настройках этого запроса указывать.
Либо попробовать собрать групповую статистику на пару полей типа:
Код: sql
1.
runstats on table myschema.DIFT_POS_IDENT on all columns and columns ((MANDT, LOT_ID), (MANDT, CONTEXT)) and indexes all

И посмотреть, что получится...
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38839358
MerCOOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Результат первого запроса:
Код: sql
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.
INDNAME            	   FIRSTKEYCARD        FIRST2KEYCARD        FIRST3KEYCARD        FIRST4KEYCARD          FULLKEYCARD
------------------ -------------------- -------------------- -------------------- -------------------- --------------------
DIFT_POS_IDENT~0                      1             48106040                   -1                   -1             48106040
DIFT_POS_IDENT~AC                     3                   -1                   -1                   -1                    3
DIFT_POS_IDENT~AG                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~CC  		      2                   -1                   -1                   -1                    2
DIFT_POS_IDENT~CV                     2                   -1                   -1                   -1                    2
DIFT_POS_IDENT~DN                 29753                   -1                   -1                   -1                29753
DIFT_POS_IDENT~FD                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~IDF                    1             48106040                   -1                   -1             48106040
DIFT_POS_IDENT~LC                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~LO               9968997                   -1                   -1                   -1              9968997
DIFT_POS_IDENT~LS                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~PA                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~PF                    33                   -1                   -1                   -1                   33
DIFT_POS_IDENT~PT                     5                   -1                   -1                   -1                    5
DIFT_POS_IDENT~SA                   317                   -1                   -1                   -1                  317
DIFT_POS_IDENT~SE               4680359                   -1                   -1                   -1              4680359
DIFT_POS_IDENT~TR                     1                   -1                   -1                   -1                    1
DIFT_POS_IDENT~VA                     2                   -1                   -1                   -1                    2
DIFT_POS_IDENT~VC                     2                   -1                   -1                   -1                    2
DIFT_POS_IDENT~ZD0                    1                    3                    6             14041080             47790400
DIFT_POS_IDENT~FUT                    1                    3                    5                    5             14041079
DIFT_POS_IDENT~LDB                    1                    3                   15                   18             48106035
DIFT_POS_IDENT~LOA                    1                    3                    5                    5                    5
DIFT_POS_IDENT~LOT                    1              9968997              9968999              9968999              9968999
DIFT_POS_IDENT~OTC                    1                    3                    6               178459               178459
DIFT_POS_IDENT~SEC                    1                    3                    5                    5             47790399
DIFT_POS_IDENT~TRQ                    1                    3                    6             14117535             27017504
DIFT_POS_IDENT~Z02                    1                    3                    3                    3             48106035
DIFT_POS_IDENT~Z03                    1                    5                   -1                   -1                    5
DIFT_POS_IDENT~EXA                    1                    3                    3                    3                    6



А это второго:
Код: sql
1.
2.
3.
4.
5.
COLCARD  	     COLNAME
-------------------- -------
                   3 CONTEXT
             9968997 LOT_ID
                   1 MANDT
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38840042
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MerCOOL,

Код: sql
1.
2.
3.
4.
INDNAME            	   FIRSTKEYCARD        FIRST2KEYCARD        FIRST3KEYCARD        FIRST4KEYCARD          FULLKEYCARD
------------------ -------------------- -------------------- -------------------- -------------------- --------------------
DIFT_POS_IDENT~LOT                    1              9968997              9968999              9968999              9968999
DIFT_POS_IDENT~SEC                    1                    3                    5                    5             47790399


Кардинальность всего индекса SEC гораздо выше, чем LOT, все поля индекса SEC в условиях выборки.
Хотя для SEC первые 4 поля дают низкую кардинальность (всего 5 разных значений). Может быть, это и влияет на выбор оптимизатора.
Тут можно сравнить планы запросов, использующих эти индексы, и посмотреть, как оно оценивает их стоимость.
...
Рейтинг: 0 / 0
SAP vs DB2, использование %_HINTS
    #38841758
MerCOOL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

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


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