web-dev-qa-db-fra.com

Estimation des statistiques et des lignes

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

  1. Pourquoi une telle différence entre une estimation des rangées de 1re et 2e requête.
  2. 2e requête Comment SQL estimant à 700 des statistiques
  3. Tout bon article pour les apprendre.
5
user1716729

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);
1
user126897