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 :
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]
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
 
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]
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
 
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]
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
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() )
Il me fait un index scan sur les deux tables.
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 !!