2010-07-20 5 views
1

Changer et trouver des choses dans une base de données contenant quelques dizaines de tables avec environ un demi-million de lignes dans les grands que je cours dans les délais d'expiration assez souvent.SQL Timeout et les indices

Certains de ces délais d'attente ne sont pas compris. Par exemple, je suis arrivé ce tableau:

CREATE TABLE dbo.[VPI_APO] 
(
    [Key] bigint IDENTITY(1,1) NOT NULL CONSTRAINT [PK_VPI_APO] PRIMARY KEY, 
    [PZN] nvarchar(7) NOT NULL, 
    [Key_INB] nvarchar(5) NOT NULL, 
) ON [PRIMARY] 
GO 

ALTER TABLE dbo.[VPI_APO] ADD CONSTRAINT [IX_VPI_APOKey_INB] UNIQUE NONCLUSTERED 
(
    [PZN], 
    [Key_INB] 
) ON [PRIMARY] 
GO 

Je reçois souvent des délais d'attente lorsque je recherche un élément dans ce tableau comme celui-ci (lors de l'insertion des volumes élevés d'articles):

SELECT [Key] FROM dbo.[VPI_APO] WHERE ([PZN] = @Search1) AND ([Key_INB] = @Search2) 

Ces délais d'attente lors de la recherche sur la Des contraintes uniques arrivent assez souvent. Je m'attendais à ce que les contraintes uniques aient les mêmes avantages que les indices, me trompais-je? Ai-je besoin d'un index sur ces champs aussi?
Ou devrais-je chercher différemment pour bénéficier de la contrainte? J'utilise SQL Server 2008 R2.

+0

Est-ce que NVARCHAR est '@ Search1' et' @ Search2'? Si ce ne sont pas des chaînes Unicode alors j'ai vu ce genre de chose (incompatibilité de collation) causant de tels problèmes de performance avant. –

Répondre

2

Une contrainte unique crée un index. En fonction de la requête et de la contrainte définies, vous devriez être dans une situation de couverture, ce qui signifie que l'index fournit tout ce dont la requête a besoin sans avoir besoin de revenir au cluster ou au tas pour récupérer les données. Je soupçonne que votre index n'est pas suffisamment sélectif ou que vos statistiques sont périmées. Essayez d'abord de mettre à jour les statistiques avec sp_updatestats. Si cela ne change pas le comportement, essayez d'utiliser UPDATE STATISTICS VPI_APO WITH FULL SCAN. Si aucune de ces méthodes ne fonctionne, vous devez examiner la sélectivité de l'index à l'aide de DBCC SHOW_STATISTICS.

2

Ma première pensée est le reniflage de paramètres.

Si vous êtes sur SQL Server 2008, essayez « OPTIMIZE FOR UNKNOWN » plutôt que paramètre de masquage

2ème pensée est de changer le constrant unique à un index et inclure la colonne clé explicitement. En interne, ils sont identiques, mais en tant qu'index vous avez plus de flexibilité (par exemple, filtre, include, etc.)

+0

Ça pourrait être ça. Quand je commence, la base de données peut même être vide, ce qui va probablement générer un plan d'exécution totalement différent de ce qui est nécessaire plus tard. – Sam