将索引添加到axapta-table

时间:2010-07-08 10:27:35

标签: sql indexing axapta

我有一个sql查询,通过odbc从x ++执行非ax表(部分至少)。 sql-query-execution-plan建议在引用ax-table中添加索引,例如:

创建非集群索引[] ON [([field1]) 包括([几个字段])

我记得在ax-tables上通过management-studio创建任何索引并不是一个好主意,但是如何通过ax创建这样的索引?是否应该将include块中的字段添加到字段列表中?

另一个索引提示更容易:

创建非集群索引[] ON []([field1],[field2])

但即使在关于表和命名字段的ax中创建此索引 - 查询分析器仍建议创建此索引。

在sql managmement-studio中查看此索引的create-statement,包含dataAreaID-column(自动)....

任何提示? 提前谢谢!


回答评论:

它是从x ++执行的sql-query。使用的表是部分ax表,部分不是。 唯一似乎缺失的索引是ax-table上的一个。

我不想一般性地讨论索引优化,而只是询问是否有可能在ax中添加索引,表示第一个“create-index-query”的“include ...”部分!

我肯定知道在ax以外的查询中考虑DAID列的事实 - 我很惊讶管理工作室批评了fieldA + fieldB的缺失索引,而实际上这个索引已经存在(关于DAID)自动)。

感谢4回复!

2 个答案:

答案 0 :(得分:0)

它建议fieldA + fieldB表明您没有对查询进行DataAreaId选择。

AX始终将DataAreaId添加为索引中的第一个字段。

此外,您可以分析SQL查询,通过将SQL放入“管理/查询/数据库语句”中的“执行计划”对话框来获取执行计划...

这将指示正在使用的索引。

答案 1 :(得分:0)

我有一个类似的问题,这篇文章展示了如何在AX表上创建包含索引的索引。

基本上,您可以从X ++代码创建SQL索引:

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