Показать сообщение отдельно
Старый 20.01.2011, 21:51   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Post Отключение функциональных индексов для Oracle и Axapta 3.0
Цитата:
Сообщение от fed Посмотреть сообщение
А ты, я полагаю, хочешь включить Case Insensitive collation в самом оракле и работать с ним так, как аксапта с SQL Server работает.
К слову, как минимум в трешке такая возможность была (как выясняется ): не знаю, интересно ли это кому на фоне разговоров про AX 2012, но в ядре трешки обнаружились как-то хинты, которые позволяют отключить использование SUBSTR() и NLS_LOWER() при работе с оракловой базой. После этого остается только перебить NLS_SORT в ktd-шниках на binary_ci, как было описано здесь, - и готово Правда, в промышленной эксплуатации эта идея мной не опробовалась. Так вот, по поводу хинтов: для эксперимента я тогда использовал нижеприведенный запрос в Х++ и игрался на лету хинтами для текущей сессии с помощью SqlSystem::databasehints().
X++:
select firstonly forceliterals RecId
    from    salesTable
    where   salesTable.SalesId == 'ЗаКаЗ012345' 
    join    RecId 
    from    salesLine 
    where   salesLine.SalesId == salesTable.SalesId;
Если использовать в коде forceplaceholders, то ядро не будет создавать новые запросы при изменении хинтов, а будет гнать один и тот же запрос, созданный в первый раз – это на случай, если повторять эксперимент. Вот хинты и запросы, которые при них получаются:

0x000000A7 – хинты для Оракла по умолчанию
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A
,SALESLINE B
WHERE 
((SUBSTR(NLS_LOWER(A.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (
SUBSTR(NLS_LOWER(A.SALESID),1,20)=NLS_LOWER('         ЗаКаЗ012345')))
AND ((
SUBSTR(NLS_LOWER(B.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (
SUBSTR(NLS_LOWER(B.SALESID),1,20)=SUBSTR(NLS_LOWER(A.SALESID),1,20))) 
0x00000000 – отключено всё
PHP код:
SELECT A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A
,SALESLINE B
WHERE 
((SUBSTR(NLS_LOWER(A.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (
SUBSTR(NLS_LOWER(A.SALESID),1,20)=NLS_LOWER('         ЗаКаЗ012345')))
AND ((
SUBSTR(NLS_LOWER(B.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (
SUBSTR(NLS_LOWER(B.SALESID),1,20)=SUBSTR(NLS_LOWER(A.SALESID),1,20))) 
0x00004000 – 14-й бит
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A
,SALESLINE B
WHERE 
((A.DATAAREAID=NLS_LOWER('dat'))
AND (
A.SALESID=NLS_LOWER('         ЗаКаЗ012345')))
AND ((
B.DATAAREAID=NLS_LOWER('dat'))
AND (
B.SALESID=A.SALESID)) 
0x00008000 – 15-й бит
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A
,SALESLINE B
WHERE 
((A.DATAAREAID='dat')
AND (
A.SALESID='         ЗаКаЗ012345'))
AND ((
B.DATAAREAID='dat')
AND (
B.SALESID=A.SALESID)) 
0x0000C000 – 14-й + 15-й
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A
,SALESLINE B
WHERE 
((A.DATAAREAID='dat')
AND (
A.SALESID='         ЗаКаЗ012345'))
AND ((
B.DATAAREAID='dat')
AND (
B.SALESID=A.SALESID)) 
Если с хинтом 32768 (0x8000) пересоздать индексы, то они тоже создаются "как положено" без всяких там функций от строковых полей.
За это сообщение автора поблагодарили: Logger (10).