Bonjour,
J'utilise SQL Server 2005 Ent ed 64 bits pour notre base de données d'archives. Le serveur est en SP3.
Nous avons dans cette base deux tables définies comme ci après :
Pas d'index supplémentaires sur cette table. La seconde :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 USE [TPGD_Arc] CREATE TABLE [dbo].[CBL]( [TRIEUR] [tinyint] NOT NULL, [FICHIER_N7] [int] NOT NULL, [RANG] [int] NOT NULL, [LONGUEUR] [smallint] NULL, [UTILITE] [smallint] NOT NULL, [CODE_POSTAL_POS] [smallint] NULL, [CODE_POSTAL_LEN] [smallint] NULL, [POIDS_POS] [smallint] NULL, [POIDS_LEN] [smallint] NULL, [POIDS_COEF] [smallint] NULL, [TABLE_TRI] [char](2) NULL, [ALGO] [smallint] NULL, [LIEN_POS] [smallint] NULL, [LIEN_LEN] [smallint] NULL, [CODE_CLIENT_POS] [smallint] NULL, [CODE_CLIENT_LEN] [smallint] NULL, [NUMERO_COLIS_POS] [smallint] NULL, [NUMERO_COLIS_LEN] [smallint] NULL, [PARTIE_FIXE_POS] [smallint] NULL, [PARTIE_FIXE_LEN] [smallint] NULL, CONSTRAINT [PK_CBL] PRIMARY KEY CLUSTERED ( [TRIEUR] ASC, [FICHIER_N7] ASC, [RANG] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Cette table possède un index en plus de la clef :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE TABLE [dbo].[FICHIER_N7]( [TRIEUR] [tinyint] NOT NULL, [FICHIER_N7] [int] NOT NULL, [NOM] [varchar](50) NOT NULL, [DATE_INTEGRATION] [datetime] NOT NULL, CONSTRAINT [PK_FICHIER_N7] PRIMARY KEY CLUSTERED ( [TRIEUR] ASC, [FICHIER_N7] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY] ) ON [PRIMARY]
Mon problème est que les indexs ne sont pas utilisés correctement lorsque j'exécute la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE NONCLUSTERED INDEX [IX_FICHIER_N7_DATE_INTEGRATION] ON [dbo].[FICHIER_N7] ( [TRIEUR] ASC, [FICHIER_N7] ASC, [DATE_INTEGRATION] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY]
Il me fait un index scan sur les deux tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DECLARE @DUREE AS INT SET @DUREE = 13 SELECT CBL.FICHIER_N7 FROM dbo.CBL CBL JOIN dbo.FICHIER_N7 FI7 ON CBL.TRIEUR = FI7.TRIEUR AND CBL.FICHIER_N7 = FI7.FICHIER_N7 AND FI7.DATE_INTEGRATION < DATEADD( MONTH, -@DUREE, GETDATE() )
Si j'effectue un select sur une seule table à la fois avec des valeurs fixes, alors il fait un seek. Le pire c'est que si je remplace la variable @duree dans le code ci dessus par un valeur "en dur" alors il fait un index seek sur la table CBL.
Bref je comprend pas bien comment il utilise les indexs avec une date.
J'ai le même problème dans une table de 35M de lignes et un between sur une colonne indexée avec un index couvrant.
Merci pour votre aide !!
Partager