Die Frage bezieht sich auf MS SQL Server 2008+.Index Suche nach geschätzten Zeilen
Mit Tabelle (sagen wir, 5-10M Reihen)
CREATE TABLE [Test].[Persons](
[PersonId] [int] NOT NULL,
[FirstName] [varchar] (50) NOT NULL,
[LastName] [varchar] (50) NOT NULL,
[OtherNames] [varchar] (50) NULL,
[BirthDate] [varchar] (10) NULL
CONSTRAINT [PK_Persons] PRIMARY KEY CLUSTERED ([PersonId] ASC)
)
Mit Index
CREATE NONCLUSTERED INDEX [IX_Persons_LastName_FirstName]
ON [Test].[Persons] ([LastName] ASC, [FirstName] ASC)
Ausführen einfache Abfrage wie
SELECT [FirstName],[LastName],[BirthDate]
FROM [Test].[Persons] WHERE [LastName] = 'Decker'
Ich sehe, dass mit Index Seek Operator, wenn der Schlüssel nicht im Statistik-Histogr ist Genaue Werte, geschätzte Zeilen unterscheiden sich stark von tatsächlichen Zeilen.
Für einige bestimmte Schlüssel kann es etwa 15 geschätzte Zeilen vs 10k tatsächlichen Zeilen sein.
Scheint wie in diesem Fall "Geschätzte Zeilen" Wert wird direkt von AVG_RANGE_ROWS für entsprechende Intervall (d. H. Nächsten Histogramm Wert) genommen.
Ist es erwartetes Verhalten? Ich meine, weiß "SQL Server", dass der Wert nicht exakt ist und verwendet diese Tatsache bei der Berechnung der Abfragekosten, oder ist es ein mögliches falsches Abfrageplanproblem?
Versucht mit SQL2008R2, 2012, 2014 (alle mit OLD Cardinality Estimator) Soweit ich weiß, ändert neues CE Dinge nur, wenn es um mehrere Tabellen in der Abfrage geht. Es ist interessant zu versuchen, aber ich habe es noch nicht.
Ich glaube, es liegt daran, dass die Statistiken Probe nur an, wie viele DECKER errät Sie haben wahrscheinlich - versuchen Sie einige häufige und seltene Namen und sehen Sie, ob es ein Muster gibt – Cato
Versuchen Sie, UPDATE STATISTICS –
@Tab Alleman Statistiken wurden mit FULLSCAN kurz vor der Abfrage Ausführung aktualisiert. – Marvin