2010-07-08 10 views
0

J'ai une requête sql, exécutée contre des tables non ax (au moins partiellement) à partir de x ++ via odbc. le plan sql-query-exécution-suggère d'ajouter un index à la hache table se référant, par exemple:add index to axapta-table

CREATE NONCLUSTERED INDEX [] SUR [([Field1]) Include ([plusieurs champs])

Je me souviens que ce n'était pas une bonne idée de créer un de ces indices via management-studio sur les tables ax, mais comment créer un tel index via ax? les champs du bloc include doivent-ils simplement être ajoutés dans la liste des champs?

un autre indice-indice était un plus facile:

CREATE NONCLUSTERED INDEX [] ON [] ([Field1], [field2])

mais même la création de cet indice dans la hache sur la table en ce qui concerne et le champ nommé - l'analyseur de requête suggère toujours de créer cet index.

visualisation de la création-déclaration pour cet indice dans managmement studio sql, la colonne dataAreaID est inclus (automatiquement) ....

des conseils? merci d'avance!


réponse aux commentaires:

est une requête SQL requête exécutée de x ++. les tables utilisées sont partiellement ax-tables et partiellement non. le seul index qui semble manquer est celui sur la table de hache. Je ne voulais pas parler des optimisations d'index en général, mais je demande simplement s'il est possible d'ajouter un index dans ax, représentant la partie "include ..." de la première "create-index-query"!

je connais sûrement le fait de considérer la colonne DAID dans des requêtes en dehors de ax - je étais juste surpris que le management-studio critique un index manquant pour fieldA + fieldB, alors qu'en fait cet index existe déjà (en ce qui concerne DAID automatiquement).

merci 4 réponse!

+1

Qu'est-ce: sql-requête exécutée contre les non-hache-tables ... la table de hache référence. Utilisez-vous des tables AX ou non? –

+0

La colonne dataAreaID est incluse (automatiquement). Oui, c'est ainsi que fonctionne AX. Vous devriez avoir explicitement un DataAreaId == "xxx" dans votre clause where lorsque vous utilisez des tables AX en dehors de AX. –

+0

Pourriez-vous montrer le code requête? Il est difficile de discuter des optimisations d'index sur un plan abstrait. –

Répondre

0

Le fait qu'il suggère fieldA + fieldB indique que vous n'avez pas de sélection DataAreaId sur une requête.

AX ajoute toujours DataAreaId en tant que premier champ dans un index.

vous pouvez également vous analyser la requête SQL, pour obtenir un plan d'exécution en mettant le SQL dans la boîte de dialogue de plan d'exécution dans l'administration/Enquêtes/déclarations de base de données ...

Ceci indique que les indices sont en cours d'utilisation.

0

J'ai eu un problème similaire, et voici un article qui montre comment créer des index avec des tables inclues sur AX.

Essentiellement, vous créez l'index SQL de X ++ code:

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(); 

... le texte réel de l'indice à être mis à jour à vos besoins specfic.

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