sys.dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Возвращает гистограмму статистики для указанного объекта (таблицы или индексированного представления) в текущем SQL ServerSQL Server базы данных.Returns the statistics histogram for the specified database object (table or indexed view) in the current SQL ServerSQL Server database. Аналогичную DBCC SHOW_STATISTICS WITH HISTOGRAM.Similar to DBCC SHOW_STATISTICS WITH HISTOGRAM.

Примечание

Данной функции DMF доступен, начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU2This DMF is available starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU2

СинтаксисSyntax

sys.dm_db_stats_histogram (object_id, stats_id)  

АргументыArguments

object_idobject_id
Идентификатор объекта текущей базы данных, для которого запрашиваются статистические свойства.Is the ID of the object in the current database for which properties of one of its statistics is requested. object_id имеет тип int.object_id is int.

stats_idstats_id
Идентификатор статистики для указанного аргумента object_id.Is the ID of statistics for the specified object_id. Идентификатор статистики может быть получен из динамического административного представления sys.stats .The statistics ID can be obtained from the sys.stats dynamic management view. stats_id имеет тип int.stats_id is int.

Возвращаемая таблицаTable Returned

Имя столбцаColumn name Тип данныхData type ОписаниеDescription
object_idobject_id intint Идентификатор объекта (таблицы или индексированного представления), для которого возвращаются свойства объекта статистики.ID of the object (table or indexed view) for which to return the properties of the statistics object.
stats_idstats_id intint Идентификатор объекта статистики.ID of the statistics object. Является уникальным в пределах таблицы или индексированного представления.Is unique within the table or indexed view. Дополнительные сведения см. в статье sys.stats (Transact-SQL).For more information, see sys.stats (Transact-SQL).
step_numberstep_number intint Номер шага в гистограмме.The number of step in the histogram.
range_high_keyrange_high_key sql_variantsql_variant Верхнее граничное значение столбца для шага гистограммы.Upper bound column value for a histogram step. Это значение столбца называется также ключевым значением.The column value is also called a key value.
range_rowsrange_rows realreal Предполагаемое количество строк, значение столбцов которых находится в пределах шага гистограммы, исключая верхнюю границу.Estimated number of rows whose column value falls within a histogram step, excluding the upper bound.
equal_rowsequal_rows realreal Предполагаемое количество строк, значение столбцов которых равно верхней границе шага гистограммы.Estimated number of rows whose column value equals the upper bound of the histogram step.
distinct_range_rowsdistinct_range_rows bigintbigint Предполагаемое количество строк с различающимся значением столбца в пределах шага гистограммы, исключая верхнюю границу.Estimated number of rows with a distinct column value within a histogram step, excluding the upper bound.
average_range_rowsaverage_range_rows realreal Среднее количество строк с повторяющимися значениями столбцов в пределах шага гистограммы, исключая верхнюю границу (RANGE_ROWS / DISTINCT_RANGE_ROWS для DISTINCT_RANGE_ROWS > 0).Average number of rows with duplicate column values within a histogram step, excluding the upper bound (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0).

ПримечанияRemarks

Результирующий набор для sys.dm_db_stats_histogram возвращает информацию, аналогичную DBCC SHOW_STATISTICS WITH HISTOGRAM , а также object_id, stats_id, и step_number.The resultset for sys.dm_db_stats_histogram returns information similar to DBCC SHOW_STATISTICS WITH HISTOGRAM and also includes object_id, stats_id, and step_number.

Так как столбец range_high_key является данных sql_variant типа, может потребоваться использовать CAST или CONVERT Если предикат выполняет сравнение с константой, не являющегося строкой.Because the column range_high_key is a sql_variant data type, you may need to use CAST or CONVERT if a predicate does comparison with a non-string constant.

ГистограммаHistogram

Гистограмма измеряет частоту появления каждого различающегося значения в наборе данных.A histogram measures the frequency of occurrence for each distinct value in a data set. Оптимизатор запросов вычисляет гистограмму для значений столбца в первом ключевом столбце объекта статистики, выбирая значения столбцов путем статистической выборки строк или при помощи полного просмотра всех строк в таблице или представлении.The query optimizer computes a histogram on the column values in the first key column of the statistics object, selecting the column values by statistically sampling the rows or by performing a full scan of all rows in the table or view. Если гистограмма создается на основе выбранного набора строк, то сохраняемые итоговые значения количества строк и количества различающихся значений являются приблизительными и не всегда выражаются целыми числами.If the histogram is created from a sampled set of rows, the stored totals for number of rows and number of distinct values are estimates and do not need to be whole integers.

Чтобы создать гистограмму, оптимизатор запросов сортирует значения столбцов, вычисляет количество значений, совпадающих с каждым различающимся значением столбца, а затем осуществляет статистическую обработку значений столбцов с получением непрерывных шагов гистограммы, максимальное количество которых составляет 200.To create the histogram, the query optimizer sorts the column values, computes the number of values that match each distinct column value and then aggregates the column values into a maximum of 200 contiguous histogram steps. Каждый шаг включает диапазон значений столбцов, за которым следует значение столбца, представляющее собой верхнюю границу.Each step includes a range of column values followed by an upper bound column value. В этот диапазон входят все возможные значения столбца между граничными значениями, за исключением самих граничных значений.The range includes all possible column values between boundary values, excluding the boundary values themselves. Наименьшим из отсортированных значений столбца является верхнее граничное значение первого шага гистограммы.The lowest of the sorted column values is the upper boundary value for the first histogram step.

На следующей диаграмме показана гистограмма с шестью шагами.The following diagram shows a histogram with six steps. Первый шаг — это область слева от первого верхнего граничного значения.The area to the left of the first upper boundary value is the first step.

В каждом шаге гистограммы:For each histogram step:

  • Полужирной линией обозначено верхнее граничное значение (range_high_key) и количество его вхождений (equal_rows).Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • Закрашенная область слева от range_high_key обозначает диапазон значений столбца и среднее количество вхождений каждого значения столбца (average_range_rows).Solid area left of range_high_key represents the range of column values and the average number of times each column value occurs (average_range_rows). В первом шаге гистограммы значение average_range_rows всегда равно 0.The average_range_rows for the first histogram step is always 0.

  • Пунктирные линии обозначают выбранные значения, которые используются для оценки общего числа различающихся значений (distinct_range_rows) и общего числа значений в диапазоне (range_rows).Dotted lines represent the sampled values used to estimate total number of distinct values in the range (distinct_range_rows) and total number of values in the range (range_rows). Оптимизатор запросов использует range_rows и distinct_range_rows для вычисления average_range_rows и не хранит выбранные значения.The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

Оптимизатор запросов определяет шаги гистограммы согласно их статистической значимости.The query optimizer defines the histogram steps according to their statistical significance. Он использует алгоритм максимальной разности для сведения к минимуму числа шагов в гистограмме и вместе с тем максимального увеличения разницы между граничными значениями.It uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. Максимальное число шагов — 200.The maximum number of steps is 200. Число шагов гистограммы может быть меньше, чем количество различающихся значений, даже для столбцов, в которых число граничных точек меньше 200.The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. Например, столбец со 100 различающимися значениями может иметь гистограмму, число граничных точек в которой меньше 100.For example, a column with 100 distinct values can have a histogram with fewer than 100 boundary points.

РазрешенияPermissions

Требуется наличие у пользователя разрешения на выбор столбцов статистики либо то, чтобы пользователь был владельцем таблицы или членом предопределенной роли сервера sysadmin, предопределенной роли базы данных db_owner или предопределенной роли базы данных db_ddladmin.Requires that the user has select permissions on statistics columns or the user owns the table or the user is a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

ПримерыExamples

A.A. Простой примерSimple example

Следующий пример создает и заполняет простую таблицу.The following example creates and populates a simple table. Затем создает статистику по Country_Name столбца.Then creates statistics on the Country_Name column.

CREATE TABLE Country
(Country_ID int IDENTITY PRIMARY KEY,
Country_Name varchar(120) NOT NULL);
INSERT Country (Country_Name) VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Country_Stats  
    ON Country (Country_Name) ;  

Первичный ключ занимает stat_id номер 1, поэтому вызовов sys.dm_db_stats_histogram для stat_id номер 2, для возврата гистограммы статистики для Country таблицы.The primary key occupies stat_id number 1, so call sys.dm_db_stats_histogram for stat_id number 2, to return the statistics histogram for the Country table.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 2);

Б.B. Удобный запрос:Useful query:

SELECT hist.step_number, hist.range_high_key, hist.range_rows, 
    hist.equal_rows, hist.distinct_range_rows, hist.average_range_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'<statistic_name>';

В.C. Удобный запрос:Useful query:

В следующем примере выбираются из таблицы Country с помощью предиката по столбцу Country_Name.The following example selects from table Country with a predicate on column Country_Name.

SELECT * FROM Country 
WHERE Country_Name = 'Canada';

Следующий пример проверяет ранее созданный статистический показатель в таблице Country и столбец Country_Name для шага гистограммы, соответствующие предикату в приведенном выше запросе.The following example looks at the previously created statistic on table Country and column Country_Name for the histogram step matching the predicate in the query above.

SELECT ss.name, ss.stats_id, shr.steps, shr.rows, shr.rows_sampled, 
    shr.modification_counter, shr.last_updated, sh.range_rows, sh.equal_rows
FROM sys.stats ss
INNER JOIN sys.stats_columns sc 
    ON ss.stats_id = sc.stats_id AND ss.object_id = sc.object_id
INNER JOIN sys.all_columns ac 
    ON ac.column_id = sc.column_id AND ac.object_id = sc.object_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) sh
WHERE ss.[object_id] = OBJECT_ID('Country') 
    AND ac.name = 'Country_Name'
    AND sh.range_high_key = CAST('Canada' AS CHAR(8));

См. такжеSee Also

Инструкция DBCC SHOW_STATISTICS (Transact-SQL) DBCC SHOW_STATISTICS (Transact-SQL)
Динамические административные представления и функции (Transact-SQL)Object Related Dynamic Management Views and Functions (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)sys.dm_db_stats_properties (Transact-SQL)