Параметризованные фильтры: оптимизация предварительно вычисляемых секций

Применимо к:SQL Server

Предварительно вычисляемые секции — это способ оптимизации производительности, который может использоваться с фильтрованными публикациями слиянием. Предварительно вычисляемые секции необходимы также для использования логических записей в фильтрованных публикациях. Дополнительные сведения о логических записях см. в статье Группирование изменений в связанных строках с помощью логических записей.

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

Однако если издатель и подписчик работают в Microsoft SQL Server 2005 (9.x) или более поздней версии, и вы используете предварительно компилированные секции, членство секций для всех изменений на издателе предварительно компьютируется и сохраняется во время внесения изменений. В результате, когда подписчик синхронизируется с издателем, он может немедленно начать загрузку изменений, соответствующих его секции, без необходимости прохождения через процесс оценки секции. Такой принцип работы приводит к увеличению производительности, если публикация имеет большое количество изменений, подписчиков или статей.

В дополнение к использованию предварительно вычисляемых секций выполните предварительное создание моментальных снимков или разрешите подписчикам запрашивать создание и применение моментального снимка при первоначальной синхронизации. Используйте один или оба этих параметра, чтобы предоставить моментальные снимки публикациям, использующим параметризованные фильтры. Если не указать один из этих параметров, подписки будут инициализированы с помощью серии инструкций SELECT и INSERT, а не с использованием программы bcp . Этот процесс — гораздо более медленный. Дополнительные сведения см. в статье Snapshots for Merge Publications with Parameterized Filters.

Использование предварительно вычисляемых секций

Предварительно вычисляемые секции включены по умолчанию для всех новых и существующих публикаций, соответствующих описанным выше требованиям. Этот параметр можно изменить с помощью СРЕДЫ SQL Server Management Studio или программно. Дополнительные сведения см. в разделе Optimize Parameterized Row Filters.

Требования к использованию предварительно вычисляемых секций

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

Требования, предъявляемые к предложениям фильтра

  • Любые функции, используемые в параметризованных фильтрах строк, например: HOST_NAME() и SUSER_SNAME() — должны находиться непосредственно в предложении параметризованного фильтра, а не быть вложенными в представление или динамическую функцию. Дополнительные сведения об этих функциях см. в статьях HOST_NAME (Transact-SQL), SUSER_SNAME (Transact-SQL) и параметризованные фильтры строк.

  • Значения, возвращаемые каждому подписчику, не должны изменяться после создания секции. Например, если в фильтре используется HOST_NAME() (и при этом значение HOST_NAME() не переопределяется), не изменяйте имя компьютера подписчика.

  • Фильтры соединения не должны содержать динамических функций (например, HOST_NAME() и SUSER_SNAME(), которые возвращают разные значения в зависимости от синхронизируемого подписчика). Динамические функции должны содержаться только в параметризованных фильтрах строк.

  • В предложении фильтра нельзя использовать недетерминированные функции. Дополнительные сведения о недетерминированных функциях см. в разделе Deterministic and Nondeterministic Functions.

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

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

Параметры сортировки базы данных

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

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

    • Таблица содержит столбец ComputerName, который сравнивается с именем узла размещения подписчика в параметризованном фильтре.

    • Таблица содержит одну строку со значением «МОЙКОМПЬЮТЕР» и одну строку со значением «мойкомпьютер» в том же столбце.

    Если подписчик синхронизируется с узлом по имени «мойкомпьютер», подписчик получит только одну строку, потому что сравнение учитывает регистр символов (параметры сортировки базы данных). Если предварительно вычисляемые секции не используются, подписчик получит обе строки, поскольку таблица имеет параметры сортировки, не зависящие от регистра.

Производительность предварительно вычисляемых секций

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

См. также

Параметризованные фильтры строк