Требования к статистике распределения для поставщиков OLE DB

Чтобы улучшить оптимизацию распределенных запросов, SQL Server вводит расширения спецификации OLE DB, которые поставщики OLE DB могут использовать для отчета о статистике распределения по наборам строк или таблицам. Хотя эти расширения определяются в документации SQL Server, отдельные разработчики поставщиков OLE DB должны включать поддержку расширений в программный код, если эти данные нужно сделать доступными для SQL Server. Если в программном коде поставщика предусмотрена поддержка этих расширений, SQL Server может использовать их для оптимизации производительности распределенных запросов. Если поставщик не поддерживает расширения, SQL Server использует приблизительную оценку статистики распределения.

ПримечаниеПримечание

Поставщик OLE DB для собственного клиента SQL Server (Microsoft) и поставщик OLE DB для Oracle (Microsoft) поддерживают статистику распределения.

Расширения статистики распределения строятся вокруг единицы, которая называется статистическим показателем. Каждая таблица может иметь один или несколько статистических показателей (или не иметь их вообще), а каждый отчет статистического показателя сообщает данные об одном или нескольких столбцах. Статистический показатель регистрирует следующие данные.

  • Кардинальное число значений или количество уникальных значений в каждом столбце.

  • Кардинальное число конкатенированных значений каждого столбца.

  • По выбору, гистограмму, сообщающую данные о разных диапазонах значений ключей в первом столбце, который охватывает статистическая характеристика. Значения, о которых сообщает статистический показатель, могут включать число строк в каждом диапазоне ключей, число уникальных значений в каждом диапазоне ключей или количество строк в таблице, значения ключей которой меньше или равны самому высокому значению ключа в диапазоне.

Ниже приводится пример таблицы.

ColumnA

ColumnB

'abc'

'xyz'

'abc'

'xyz'

'def'

'xyz'

'mno'

'xyz'

'mno'

'mmm'

'tuv'

'xyz'

Для статистического показателя столбцов ColumnA и ColumnB количество элементов объединенных значений двух столбцов равно 5. Это означает, что имеется пять уникальных сочетаний значений для столбцов ColumnA и ColumnB, поскольку первые две строки имеют одинаковое объединенное значение ('abc' + 'xyz').

Количество элементов одного столбца ColumnA — 4, а одного столбца ColumnB — 2. Отчет предоставляет простая четырехшаговая гистограмма в столбце ColumnA.

Диапазон значений

Процент строк таблицы в диапазоне

от "aaa" до "hzz"

50%

от "iaa" до "nzz"

33%

от "oaa" до "rzz"

00%

от "taa" до "zzz"

17%

Разные источники данных OLE DB регистрируют статистику распределения в различных комбинациях столбцов, а набор статистических показателей поставщика OLE DB определяется реализацией. Например SQL Server версии 6.5 и более ранних версий строит статистику распределения только по столбцам, охватываемым индексами, и имеет один статистический показатель на каждый индекс, определенный в таблице. SQL Server версии 7.0 и более поздних версий строит следующие статистические показатели.

  • Один статистический показатель на каждый индекс, определенный в таблице.

  • Один статистический показатель на каждую инструкцию CREATE STATISTIC.

  • Один статистический показатель на каждый автоматически созданный статистический показатель.

Столбец имеет большую степень селективности, если он может возвратить небольшое количество строк для каждого значения, заданного аргументом предиката. Статистика распределения может использоваться для предварительной оценки степени селективности.

  • Столбцы с большим количеством элементов имеют больше значений данных, а каждое значение данных, возможно, соответствует меньшему числу строк, чем столбец с небольшим количеством элементов.

  • Поставщик OLE DB предоставляет гистограмму, сообщающую о распределении значений в столбце, оптимизатор SQL Server может также предварительно оценить, находится ли конкретное значение аргумента предиката в диапазоне, имеющем высокую или низкую селективность.

Наличие подробной статистики распределения для связанного сервера может также помочь оптимизатору сформировать эффективный план выполнения для локальной части распределенного запроса.

Оптимизатор SQL Server использует статистику распределения, чтобы попытаться уменьшить объем данных, который необходимо передавать между поставщиком OLE DB и SQL Server. Например, при выполнении распределенного соединения таблицы TableA на локальном сервере и таблицы TableB на связанном сервере SQL Server может использовать статистику распределения, чтобы определить, какой из следующих процессов наиболее эффективен.

  • Отправка строк, соответствующих предикату соединения, из таблицы TableA на связанный сервер с тем, чтобы выполнить соединение на нем.

  • Извлечение строк, соответствующих предикату соединения, из таблицы TableB на локальный сервер с тем, чтобы выполнить соединение на нем.

Если поставщик OLE DB не сообщает о количестве элементов столбца, оптимизатор SQL Server предусматривает низкое кардинальное число. Если поставщик не предоставляет гистограмму статистического показателя, оптимизатор работает так, как если бы значения были равномерно распределены по строкам таблицы.

SQL Server использует следующие расширения от поставщика OLE DB для сообщения статистики распределения.

  • Свойство источника данных DBPROP_TABLESTATISTICS указывает, сообщает ли поставщик статистику распределения.

  • В IDBSchemaRowset, TABLE_STATISTICS, приводятся статистические данные, доступные для заданной базовой таблицы. Это включает количество элементов в столбцах и строках.

  • Метод IOpenRowset::OpenRowset принимает аргументы, задающие статистический показатель. Если указан статистический показатель, метод OpenRowset возвращает набор строк гистограммы, показывающий распределение значений в первом столбце, который обрабатывает статистический показатель, заданный идентификатором StatisticID.

Эти расширения OLE DB включены в OLE DB версии 2.6 и более поздние. Сведения об этих расширениях, касающихся статистики распределения, см. спецификацию OLE DB 2.6.

Поставщик OLE DB может реализовать расширения производительности, выбрав только часть строк в базовой таблице, чтобы определить статистику распределения и гистограммы. Эти поставщики должны масштабировать данные кардинального числа и гистограмм, чтобы отразить итоговые значения таблицы перед тем, как сообщить их в TABLE_STATISTICS и наборе строк гистограммы.

Будет ли поставщик OLE DB хранить эти данные в TABLE_STATISTICS и обновлять набор строк гистограммы текущим содержимым базовой таблицы, определяется установленной реализацией.

ПримечаниеПримечание

Чтобы создать наиболее эффективный план запроса при использовании таблицы на связанном сервере, обработчик запроса должен иметь статистику распределения данных со связанного сервера. Пользователи, имеющие ограниченные разрешения для работы со столбцами таблицы, могут не иметь возможности получить необходимую статистику и, как следствие, получат менее эффективный план запроса. Если связанный сервер является экземпляром SQL Server, для получения всей доступной статистики пользователь должен быть владельцем таблицы или членом предопределенной роли сервера sysadmin, db_owner или предопределенной роли базы данных db_ddladmin на связанном сервере.