Отфильтрованная статистика, созданная для одной таблицы, используемая для оценки количества элементов другой таблицы в запросе TSQL - PullRequest
0 голосов
/ 03 сентября 2018

Как отфильтрованная статистика, созданная для одной таблицы, может использоваться для оценки количества элементов в другой таблице в запросе TSQL?

Пример кода, который я вставил ниже, взят из http://www.sqlpassion.at/archive/2013/10/29/fixing-cardinality-estimation-errors-with-filtered-statistics/?awt_l=OGZ5i&awt_m=3sMpQpfwa9YUUTS

-- Create a new database
CREATE DATABASE FilteredStatistics
GO

-- Use it
USE FilteredStatistics
GO

-- Create a new table
CREATE TABLE Country
(
ID INT PRIMARY KEY, 
Name VARCHAR(100)
) 
GO

-- Create a new table
CREATE TABLE Orders
(
ID INT, 
SalesAmount DECIMAL(18, 2)
) 
GO

-- Create a Non-Clustered Index
CREATE NONCLUSTERED INDEX idx_Name ON Country(Name) 
GO

-- Create a Clustered Index
CREATE CLUSTERED INDEX idx_ID_SalesAmount ON Orders(ID, SalesAmount) 
GO

-- Insert a few records into the Lookup Table
INSERT INTO Country VALUES(0, 'Austria') 
INSERT INTO Country VALUES(1, 'UK')
INSERT INTO Country VALUES(2, 'France') 
GO

-- Insert uneven distributed order data
INSERT INTO Orders VALUES(0, 0)

DECLARE @i INT = 1 

WHILE @i <= 1000
BEGIN 
INSERT INTO Orders VALUES (1, @i) 
SET @i += 1
END
GO

-- Update the Statistics on both tables
UPDATE STATISTICS Country WITH FULLSCAN 
UPDATE STATISTICS Orders WITH FULLSCAN 
GO

--incorrect row estimate for Orders table
SELECT SalesAmount FROM Country
INNER JOIN Orders ON Country.ID = Orders.ID
WHERE Name = 'UK'

--create filtered statistics on table country
CREATE STATISTICS Country_UK ON Country(ID) 
WHERE Name = 'UK'

--correct row estimate for Orders table
SELECT SalesAmount FROM Country
INNER JOIN Orders ON Country.ID = Orders.ID
WHERE Name = 'UK'

Перед созданием отфильтрованной статистики обратите внимание, что оценочное число строк, возвращаемых из таблицы «Заказы», ​​составляет 500,5, что является оценкой, полученной из вектора плотности (1001 * .5) в таблице «Заказы».

Execution plan info

Вот вектор плотности и гистограмма для таблицы заказов Statistics object

После того, как отфильтрованные статистические данные были созданы в таблице Country, оценка строк, возвращаемых из таблицы Order, является правильной. Как отфильтрованная статистика в таблице Страна помогает с оценкой количества элементов в таблице «Заказы»? Correct cardinality estimation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...