J'espère que quelqu'un peut m'aider à apprendre comment SQL Server utilise des statistiques pour estimer le nombre d'enregistrements.
Scripts de test
USE [tempdb]
GO
CREATE TABLE t1
(
a INT NOT NULL,
b INT NOT NULL,
c INT CHECK (c between 1 and 50),
CONSTRAINT pk_a primary key(a)
);
GO
INSERT INTO t1(a,b,c)
SELECT number, number%1000+1, number%50+1
FROM master..spt_values
WHERE type = 'P' AND number BETWEEN 1 and 1000;
GO
CREATE STATISTICS s_b ON t1(b);
CREATE STATISTICS s_c ON t1(c);
GO
Exemple de requête
DECLARE @c INT=300
SELECT * FROM t1 WHERE b>@c
SELECT * FROM t1 WHERE b>300
Query 1
Nombre estimé de lignes 300
Query 2
Nombre estimé de lignes 700
questions
Réponse de la communauté Wiki :
Pour le premier cas, voir le Q & A: Comment SQL Server génère un plan de requête avec Statistiques de création automatique définies . Vous utilisez une variable , il est donc considéré comme une entrée inconnue et est estimée à 30% de la cardinalité du tableau (30% de 1000 lignes).
Dans le second cas, il utilise des statistiques histogrammes. Vous pouvez en apprendre davantage sur SQL Server: Partie 2: Tout sur les statistiques SQL Server: Histogramme de Nelson John.
Vous obtiendrez également l'estimation de 700 lignes pour votre requête paramétrée si vous forcez un nouveau plan à compiler en fonction de la valeur actuelle de @c1
. Par exemple:
SELECT * FROM t1 WHERE b>@c OPTION (RECOMPILE);