добавить индекс в таблицу axapta - PullRequest
0 голосов
/ 08 июля 2010

У меня есть sql-запрос, выполненный против не Ax-таблиц (частично, по крайней мере) из x ++ через odbc.sql-query-execute-plan предлагает добавить индекс в ссылающуюся таблицу топоров, например:

CREATE NONCLUSTERED INDEX [] ON [([field1]) INCLUDE ([несколько полей])

я помню, что не было хорошей идеей создавать какие-либо из этих индексов через management-studio на топорах, но как создать такой индекс с помощью ax?следует ли просто добавлять поля в блоке включения в список полей?

другой индекс-подсказка была проще:

СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС [] ВКЛ [] ([поле1],[field2])

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

при просмотре оператора create для этого индексав sql managmement-studio столбец dataAreaID включается (автоматически) ....

есть какие-нибудь подсказки?заранее спасибо!


ответ на комментарии:

это sql-запрос, выполненный из x ++.используемые таблицы являются частично топорами, а частично нет.единственный отсутствующий индекс - это индекс в таблице топоров.

Я не хотел обсуждать оптимизацию индекса в целом, но просто спросил, есть ли возможность добавить индекс в топоре, представляющий «включить»... "часть первого" create-index-query "!

Я, конечно, знаю о том факте, что DAID-столбец рассматривается в запросах вне оси - я был просто удивлен, что студия управления критикует отсутствующий индекс для fieldA + fieldB, когда на самом деле этот индекс уже существует (относительно DAID автоматически).

спасибо 4 ответа!

Ответы [ 2 ]

0 голосов
/ 05 сентября 2012

У меня была проблема с similirar, и вот статья, в которой показано, как создавать индексы с включениями для таблиц AX.

По сути, вы создаете индекс SQL из кода X ++:

public static server void createSQLIndexPointTransferHeader()

Connection connection = new Connection();
Statemetn statement = connection.createStatement();
SqlStatementExecutionPermission sqlStatementExecutionPermission;
str createIndexSQL;
;
//Create the index
createIndexSQL = @"IF EXISTS (SELECT * FROM sys.Indexes WHERE onject_id=(N'[dbo].[LIO_POINTTRANSHEADER]) AND name=N'I_NEWWINECLUBCARD_IDX')

DROP INDEX [I_NEWWINECLUBCARD_IDX] ON [dbo].[LIO_POINTTRANSHEADER] WITH (ONLINE=OFF)
CREATE NONCLUSTEREDINDEX INDEX [I_NEWWINECLUBCARD_IDX] ON [dbo].[LIO_POINTTRANSHEADER]
(
[WINECLUBCARDID]
)
INCLUDE ([FIELD1],[FIELD2]/*OTHER FIELDS*/) WITH (PAD_INDEX=OFF /* OTHER WITH OPTIONS*/);

sqlStatementExecutionPermission = new SqlStatementPermission(createIndexSQL);
sqlStatementExecutionPermission .assert;

//BP Deviation Documented
statement.executeUpdate(createIndexSQL);
CodeAccessPermission::revertAssert();

... фактический текст индекса, который будет обновлен в соответствии с вашими требованиями.

http://daxdilip.blogspot.com/2011/05/tip-how-to-avoid-overriding-of-sql.html

0 голосов
/ 08 июля 2010

Тот факт, что он предлагает fieldA + fieldB, указывает на то, что у вас нет выбора DataAreaId в запросе.

AX всегда добавляет DataAreaId в качестве первого поля в индексе.

Также вы можете проанализировать ваш запрос SQL, чтобы получить план выполнения, поместив SQL в диалог плана выполнения в разделе Администрирование / Запросы/ Базы данных ...

Это будет указывать, какие индексы используются.

...