22.07.2010, 18:43 | #1 |
Участник
|
Неужели в AX 2009 можно отключить для Оракла функциональные индексы?
Читал тут на досуге руководство по написанию скриптов обновления данных и в разделе «Oracle only: Applying NLS_LOWER on String Columns in the WHERE Clause» наткнулся на прелюбопытнейшее замечание:
Цитата:
Note that if customers have de-selected the option in the Server Configuration utility to not use SUBSTR and NLS_LOWER, they will not have functional indexes; they will have regular indexes and thus the SUBSTR and NLS_LOWER is not required.
Отсюда возникло 3 вопроса:
|
|
23.07.2010, 09:00 | #2 |
Moderator
|
Не уверен, но мне кажется, что результатом подобных экспериментов станет тот режим работы с ораклом, который был до версии 3.00. То есть - любое поле, включенное в любой индекс, будет автоматически апперкейсится при записи в БД силами самой аксапты. Поскольку в версии 3.0, помниться, слегка подковыряв конфигурацию, можно было добиться подобного эффекта...
А ты, я полагаю, хочешь включить Case Insensitive collation в самом оракле и работать с ним так, как аксапта с SQL Server работает. Последний раз редактировалось fed; 23.07.2010 в 10:11. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
23.07.2010, 09:31 | #3 |
Участник
|
|
|
23.07.2010, 10:40 | #4 |
Участник
|
Конечно, раз Оракл давно поддерживает case insensitive collation, более того, в упомянутом выше документе написано: "если клиенты отключили использование SUBSTR(NLS_LOWER()), то у них будут обычные, а не функциональные индексы, так что использовать SUBSTR(NLS_LOWER()) будет не нужно". Для меня это означает, что сравнение будет работать без учета регистра, а не то, что надо будет приводить все к верхнему регистру и пользоваться тем же самым регистрозависимым сравнением. В последнем случае должно было бы быть написано "...и тогда нужно будет использовать NLS_UPPER()", поскольку в прямом SQL-запросе можно задать литералы в т.ч. в нижнем и смешанном регистре.
|
|
23.07.2010, 12:01 | #5 |
Moderator
|
Меня вот давно занимает вопрос - нельзя ли эту проблему решить, просто подковыряв нужные переменные в таблице SQLSystemVariables. Там вроде бы были переменные и про функциональные ключи и про lowercase. Только вот Оракла чтобы попробовать нету...
|
|
|
За это сообщение автора поблагодарили: Logger (3). |
23.07.2010, 12:12 | #6 |
Участник
|
А еще что-то было в переменных ktd файлов.
Что важнее - фиг знает. |
|
20.01.2011, 21:51 | #7 |
Участник
|
Отключение функциональных индексов для Oracle и Axapta 3.0
Цитата:
X++: select firstonly forceliterals RecId from salesTable where salesTable.SalesId == 'ЗаКаЗ012345' join RecId from salesLine where salesLine.SalesId == salesTable.SalesId; 0x000000A7 – хинты для Оракла по умолчанию PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
|
|
|
За это сообщение автора поблагодарили: Logger (10). |
28.09.2011, 17:36 | #8 |
Участник
|
Отключение функциональных индексов для Oracle убрали из ядра AX 2009
Цитата:
За использование функциональных индексов в ядре отвечают, насколько я смог разглядеть, три функции, чьи настоящие имена удалось-таки недавно узнать: MONOCASE_FIELD(), MONOCASE_LITERAL() и MONOCASE_PLACEHOLDER(). Вот, к примеру, как выглядит псевдокод функции MONOCASE_FIELD() в ax32serv.exe версии 3.0 KR3 X++: char* MONOCASE_FIELD(char *pszBuf, CSqlFieldInfo *pSqlFieldInfo, bool forceMonoCase) { if (gDatabaseCLI == DatabaseCLI::OCI) { if ( !forceMonoCase || !pSqlFieldInfo || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 14) & 1) || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1) ) { strcpy(pszBuf, "%s"); } else { sprintf(pszBuf, "SUBSTR(%s,1,%i)", "NLS_LOWER(%s)", pSqlFieldInfo->cbStringFieldBufSize - 1); } } else { if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { strcpy(pszBuf, "%s"); } else { strcpy(pszBuf, "{fn LCASE(%s)}"); } } return pszBuf; } X++: char* MONOCASE_FIELD(wchar_t *pwszBuf, unsigned int cnBufSize, struSqlFieldInfo *pSqlFieldInfo, bool forceMonoCase) { int len; if (sql_dbcli != DatabaseCLI::OCI) { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"{fn LCASE(%s)}"); } return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } if (!forceMonoCase || !pSqlFieldInfo) { return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } len = pSqlFieldInfo->BaseType == Types::String ? (*&pSqlFieldInfo->cbStringFieldBufSize >> 1) - 1 : 0; return StringCchPrintfW(pwszBuf, cnBufSize, L"SUBSTR(%s,1,%i)", L"NLS_LOWER(%s)", len); } X++: theDatabase()->DatabaseId == DatabaseId::Oracle X++: char* MONOCASE_LITERAL(char *pszBuf, bool forceMonoCase) { if (gDatabaseCLI == DatabaseCLI::OCI) { if (forceMonoCase && !((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { return strcpy(pszBuf, "NLS_LOWER(%s)"); } } else { if (forceMonoCase && !((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) { return strcpy(pszBuf, "{fn LCASE(%s)}"); } } return strcpy(pszBuf, "%s"); } X++: wchar_t* MONOCASE_LITERAL(wchar_t *pwszBuf, unsigned int cnBufSize, bool forceMonoCase) { if (sql_dbcli != DatabaseCLI::OCI) { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"{fn LCASE(%s)}"); } } else { if (forceMonoCase) { return StringCchCopyW(pwszBuf, cnBufSize, L"NLS_LOWER(%s)"); } } return StringCchCopyW(pwszBuf, cnBufSize, L"%s"); } X++: void MONOCASE_PLACEHOLDER(char *pszBuf, void *a2, bool forceMonoCase, char *pszInOutBuf) { // ... if (*pszInOutBuf) { v5 = *a2 + 1; } else { v5 = *(a2 + 4) + 1; } if (gDatabaseCLI == DatabaseCLI::OCI) { strcpy(pszInOutBuf), *pszInOutBuf ? "in" : "out"); if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) sprintf(pszBuf, ":%s%i", &pszInOutBuf, v5); else sprintf(pszBuf, "NLS_LOWER(:%s%i)", &pszInOutBuf, v5); } else { if (!forceMonoCase || ((fnGetSessionInfo()->getSqlSystem()->DatabaseHints >> 15) & 1)) sprintf(pszBuf, "?"); else sprintf(pszBuf, "{fn LCASE(?)}"); } } X++: void MONOCASE_PLACEHOLDER(wchar_t *a1, unsigned int *a2, void *pSqlField, void *pSqlMonocaseParamCnt, bool forceMonoCase, bool bIsIn) { int v6; wchar_t v12; if (bIsIn) { ++*pSqlMonocaseParamCnt; v6 = *pSqlMonocaseParamCnt; } else { ++*(pSqlMonocaseParamCnt + 1); v6 = *(pSqlMonocaseParamCnt + 1); } if (sql_dbcli == DatabaseCLI::OCI) { StringCchCopyW(&v12, 4, bIsIn ? L"in" : L"out"); StringCchPrintfExW(a1, *a2, &a1, a2, 0, forceMonoCase ? L"NLS_LOWER(:%s%i)" : L":%s%i", &v12, v6); } else { StringCchPrintfExW(a1, *a2, &a1, a2, 0, forceMonoCase ? L"{fn LCASE(?)}" : L"?"); } } |
|
|
За это сообщение автора поблагодарили: shred (0), sukhanchik (15), Logger (18), lev (10), S.Kuskov (10). |
28.09.2011, 18:28 | #9 |
Участник
|
Шикарно.
Как считаешь возможно это безболезненно пропатчить ? |
|
28.09.2011, 18:55 | #10 |
Участник
|
ну... подобные обсуждения выходят за рамки того, что разрешено лицензионным соглашением и правилами форума
|
|
16.11.2011, 14:16 | #11 |
Участник
|
Собственно - в какой-то ветке обещался проверить возможность работы Ах3 без FBI .
Сейчас стоит железяка, которую можно временно потерзать. Чем собственно и зянялся ;-) Состав - IBM x3650 M3 132Gb RAM 8*Xeon 2.5 + Win2003Server x64 Eng + Oracle 11.2.0.2 x64 + Axapta 3.0 KR2. Согласно исследованиям gl00mie было выставлено: Цитата:
-hint=49152
Цитата:
NLS_SORT = 'RUSSIAN_CI'
Цитата:
ALTER SESSION SET NLS_COMP = 'LINGUISTIC'
НО, дьявол как всегда в деталях! Есс-но после установки новых параметров была проведена переиндексация - действительно, индексы создались нормальные - без NLS_LOWER и всяких там SUBSTRINGов ! Казалось-бы вот оно, щасте! Ан нифига - планы генерируются настолько странные, шо ни пером описать! Вроде и индекс используется, но почти везде фул скан его с каким-то странным выражением фильтра, включающим в себя преобразования NLS,,, ! Соответственно скорость ну совсем никакая. В общем можно считать, что эта фича не была поддержана в ядре косяпты как положено и осталась как рудимент экспериментов разработчиков! Мог, конечно, что-то упустить в установках - еще поизучаю маленько!
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
|
За это сообщение автора поблагодарили: Logger (2). |
16.11.2011, 14:44 | #12 |
Участник
|
Цитата:
Кстати после переиндексации, не забудьте обновить статистику, причем для сессии которая обновляет статистику тоже должно быть включено Цитата:
ALTER SESSION SET NLS_COMP = 'LINGUISTIC'
NLS_SORT = 'RUSSIAN_CI' NLS_SORT = 'RUSSIAN_BI' или еще как. Она вам бесполезна, поэтому наверно оптимизер и хватает фуллсканы. |
|
16.11.2011, 14:48 | #13 |
Участник
|
Вообще-то начиная с 10 версии CREATE INDEX обновляет и статистику. Но в принципе возможно, что и нужно обновить - попробую
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
16.11.2011, 14:56 | #14 |
Участник
|
Цитата:
Аксапта кстати, какой-то неоптимальный способ для сбора статистики для оракла использует. Погуглите тему. |
|
16.11.2011, 15:35 | #15 |
Участник
|
Цитата:
Я попробую позапускать, конечно, с разными параметрами.
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
16.11.2011, 15:47 | #16 |
Moderator
|
Цитата:
Но судя по тому что egorych пишет, в каких-то более поздних версиях оракла это дело починили... |
|
16.11.2011, 16:50 | #17 |
Участник
|
Цитата:
Сообщение от egorych
планы генерируются настолько странные, шо ни пером описать! Вроде и индекс используется, но почти везде фул скан его с каким-то странным выражением фильтра, включающим в себя преобразования NLS...! В общем можно считать, что эта фича не была поддержана в ядре косяпты как положено и осталась как рудимент экспериментов разработчиков!
В общем, для чистоты эксперимента я бы переустановил оракл с теми NLS-настройками, которые вы пытаетесь использовать для работы с аксаптовской схемой. |
|
16.11.2011, 17:01 | #18 |
Участник
|
Еще вроде в оракловом клиенте можно делать настройки по умолчанию.
Их тоже лучше на всякий пожарный подкрутить. |
|
24.11.2011, 09:46 | #19 |
Участник
|
Конец экспериментов!
В общем не знаю - то-ли я что-то упустил, то-ли еще что, но суть такая - параметры везде поменял, и в базе по умолчанию, и переменные среды выставил и даже триггер на logon нарисовал, где параметры сессии менял, и в ktd тоже - один черт! Все тормозит, форма заказов открывается минут 5, планы запросов совершенно сумасшедшие (пример во вложении)!
Вернув все вздад и перестроив индексы и статистику получил замечательную, шуструю работу! В общем я пас, господа! Делаю вывод - пока вариант с человеческими индексами и запросами не работоспособен, ну или у меня не хватило мозгов заставить его работать!
__________________
Axapta 3.0 sp - хз какой, kr2 |
|
|
За это сообщение автора поблагодарили: Logger (3). |
Теги |
ax2009, ax3.0, oracle, администрирование, индекс, настройка, полезное, субд |
|
|