ADG Оставить заявку
Блог Данные и аналитика 5 мин чтения

SQL Server 2008 RC0: тестируем Policy-Based Management и пространственные типы на реальном клиенте

Поставили RC0 SQL Server 2008 на тестовую среду клиента с геораспределённой сетью магазинов - смотрим на Policy-Based Management и типы GEOGRAPHY/GEOMETRY.

Контекст момента

Microsoft выпустила SQL Server 2008 RC0 в июле 2008 - последний кандидат перед ожидаемым релизом в августе

RC0 вышел тихо, без фанфар - просто появился в загрузках на Microsoft Connect. Мы отложили текущие задачи примерно на полдня и поставили его на тестовую среду, потому что один клиент уже несколько недель спрашивает насчёт пространственных типов данных. У него розничная сеть, магазины разбросаны по нескольким городам, и люди из коммерческого отдела хотят строить какие-то «тепловые карты по охвату» прямо из базы. Задача реальная, и RC0 - подходящий момент, чтобы понять, насколько это вообще работает.

Policy-Based Management: зачем и как устроено

Первое, на что обратили внимание после установки - раздел Policy Management в Management Studio. SQL Server 2008 добавляет формализованный механизм управления политиками сервера: можно описать условие (например, «имя базы должно начинаться с определённого префикса», «параметр AUTO_SHRINK должен быть выключен» и так далее) и назначить его применение к объектам.

Выглядит это примерно так: создаёшь Condition - выражение-предикат над свойствами объекта. Потом создаёшь Policy, которая связывает Condition с набором целей (один сервер, группа серверов через Central Management Server, конкретные базы). Режимов применения несколько: On demand (проверяешь вручную), On schedule (по расписанию через SQL Agent) и On change - prevent (блокирует нарушение DDL-триггером).

Нас сразу заинтересовал On change - prevent, потому что одна из хронических проблем у клиентов с несколькими администраторами - это «кто-то зашёл и поменял настройку». Проверили: если создать политику, запрещающую AUTO_SHRINK, и попытаться включить его через SSMS или ALTER DATABASE - политика действительно блокирует операцию с внятной ошибкой. Это работает.

Есть нюансы. Политики живут на конкретном экземпляре и не синхронизируются автоматически между серверами - для multi-server management нужен Central Management Server, который в RC0 тоже появился. Мы его пока не поднимали, это отдельная история. Экспорт/импорт политик через XML работает, так что набор корпоративных политик теоретически можно версионировать и раскатывать скриптом.

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

GEOGRAPHY и GEOMETRY: что это такое и зачем

SQL Server 2008 вводит два новых CLR-типа данных: GEOGRAPHY и GEOMETRY. Разница принципиальная:

  • GEOMETRY работает в плоской эвклидовой геометрии - координатная плоскость без кривизны земли. Подходит для CAD-данных, планов помещений, чего угодно, где земная кривизна несущественна.
  • GEOGRAPHY оперирует геодезическими координатами на эллипсоиде WGS 84 - то есть реальными широтой/долготой. Расстояния считаются по дуге большого круга.

Для задачи клиента нужен именно GEOGRAPHY: координаты магазинов в реальных широте/долготе, расстояния по земле, зоны охвата.

Синтаксис выглядит так:

-- Создаём таблицу с пространственным столбцом
CREATE TABLE stores (
    store_id   INT PRIMARY KEY,
    store_name NVARCHAR(100),
    location   GEOGRAPHY
);

-- Вставляем точку через WKT (Well-Known Text)
INSERT INTO stores VALUES (
    1, 'Магазин Центральный',
    GEOGRAPHY::STGeomFromText('POINT(37.6173 55.7558)', 4326)
);

-- Запрос: все магазины в радиусе 10 км от точки
SELECT store_name, location.STDistance(
    GEOGRAPHY::STGeomFromText('POINT(37.6000 55.7500)', 4326)
) AS dist_meters
FROM stores
WHERE location.STDistance(
    GEOGRAPHY::STGeomFromText('POINT(37.6000 55.7500)', 4326)
) < 10000
ORDER BY dist_meters;

SRID 4326 - это WGS 84, стандарт GPS-координат. STDistance возвращает метры. Работает.

Мы загрузили тестовую таблицу с несколькими десятками точек (реальные адреса магазинов, перегнанные в координаты через сторонний геокодер - SQL Server этим сам не занимается) и погоняли несколько запросов. Производительность без пространственного индекса на небольшой таблице вполне терпимая, запросы отдают результат быстро.

Пространственный индекс - без него на большом объёме не обойтись

На больших таблицах запросы типа «найди всё в радиусе» без индекса превращаются в полный скан с вычислением расстояния для каждой строки. SQL Server 2008 вводит пространственные индексы через четырёхуровневую иерархическую сетку (tessellation grid). Создаётся так:

CREATE SPATIAL INDEX idx_stores_location
ON stores(location)
USING GEOGRAPHY_GRID
WITH (
    GRIDS = (MEDIUM, MEDIUM, MEDIUM, MEDIUM),
    CELLS_PER_OBJECT = 16
);

Параметры GRIDS и CELLS_PER_OBJECT влияют на детализацию разбиения - подбирать их под конкретное распределение данных. Для равномерно распределённых точек по городу MEDIUM на всех уровнях - разумная отправная точка.

После создания индекса план запроса изменился: оптимизатор начал его использовать. На тестовой нагрузке разница заметная. С реальными объёмами клиента (несколько сотен точек сейчас, но планируют расти) пространственный индекс - не опция, а необходимость.

Что пока не трогали

Функций много, RC0 - не последний момент для полного аудита. За скобками остались:

  • Filtered indexes - индексы с предикатом WHERE, давно ждали этого
  • Change Data Capture - механизм аудита изменений в таблицах на уровне движка
  • Table-valued parameters - передача наборов строк в хранимые процедуры без XML-хаков
  • Новый оптимизатор запросов с улучшенной статистикой

Всё это в плане на следующий подход. RC0 ставится без очевидных проблем, тестовая среда под Windows Server 2008 завелась без сюрпризов.

Короткий вывод

Policy-Based Management - инструмент, который решает реальную задачу: стандартизация конфигурации серверов без ручного обхода и надежды на то, что все помнят чеклист. Пространственные типы работают так, как написано в документации, и для задачи с геораспределённой сетью магазинов это именно то, что нужно.

До RTM, судя по срокам, остаётся совсем немного. До релиза оценивать RC0 как производственную систему не стоит, но для сценариев, которые нам нужны, картина уже понятна.

Если ваши данные имеют географическое измерение и вы задумываетесь, что с этим делать на уровне базы - в рамках DWH и BI-проектов разберём задачу и подберём подходящий инструментарий.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.