0

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

创建非聚集索引 [] ON [ ([field1]) INCLUDE ([几个字段])

我记得通过管理工作室在 ax 表上创建任何这些索引都不是一个好主意,但是如何通过 ax 创建这样的索引?是否应该将包含块中的字段简单地添加到字段列表中?

另一个索引提示更简单:

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

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

在 sql managmement-studio 中查看该索引的创建语句,dataAreaID-column 被包括(自动)....

任何提示?提前致谢!


回复评论:

它是一个从 x++ 执行的 sql 查询。使用的表格部分是斧头表,部分不是。唯一似乎缺少的索引是 ax-table 上的一个。

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

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

谢谢4回复!

4

2 回答 2

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

于 2012-09-05T09:29:11.507 回答
0

它建议 fieldA+fieldB 的事实表明,您在查询中没有 DataAreaId 选择。

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

您还可以分析您的 SQL 查询,通过将 SQL 放在 Administration/Inquiries/Database statements 中的执行计划对话框中来获取执行计划...

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

于 2010-07-08T15:11:13.333 回答