我有一个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回复!
答案 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