Требования к статистике распределения для поставщиков 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. Это означает, что имеются 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, предопределенной роли базы данных bd_owner или bd_ddladmin на связанном сервере.