среда, 3 декабря 2014 г.

MSSQL – простые индикаторы нехватки индексов

Как обычно в нашей профессии, есть несколько способов решить задачу :)

Расскажу о трёх наиболее простых подходах (и одном бонусном), не углубляясь в детали. Если интересны как раз глубокие детали, рекомендую почитать документацию (начать стоит с Designing Indexes, а прочитав о проектировании продолжить Performance (Database Engine)).

Кстати, если тема плана выполнения для вас нова – неплохим стартом будет мой давний пост «SQL – execution plan».

DISCLAIMER: в этой статье я даю простые советы, которые чаще всего работают, однако в MSSQL практически невозможно дать рекомендации на все случаи жизни – данные бывают разные, запросы бывают разные…

1. Мысленный эксперимент

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

Что касается простейших советов, они следующие:

  1. Если данных не мизерное количество – вам нужны индексы.
  2. Если есть внешние ключи – настоящие или по смыслу (некоторые их принципиально не любят делать) – они хорошие кандидаты для индексирования.
  3. Чаще всего стоит сделать кластерный индекс и сделать его не слишком большим (потому что другие индексы будут ссылаться на строки по кластерному индексу). Кстати, кластерный индекс отлично подходит для выборки по диапазону (например, по диапазону дат).
  4. Помните, что индексы тоже хранятся на диске. Простейший вывод – большое количество индексов снизит скорость вставки (иногда и обновления) данных. Обычно до создания 5-7 индексов проблем не возникает.
  5. Статистика очень важна для правильного использования индексов. Хорошая новость – чаще всего MSSQL сам достаточно неплохо за ней следит, плохая новость – это не всегда срабатывает.
  6. Для наиболее критичных запросов, возвращающих небольшое количество столбцов, имеет смысл использовать покрытие индексом (это уже чуть более продвинутая техника, но ничего сложного в ней нет).

Поскольку я обещал не углубляться в детали – идём дальше.

вторник, 21 января 2014 г.

Практическое применение Integration Services

Изложение не претендует на полноту, сейчас я хочу показать лишь некоторые возможности SSIS, чтобы вы могли приблизительность оценить целесообразность его использования. А уже в случае такого выбора - изучать предмет более досконально.

1. Базы данных для примера

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

Итак, перед началом работы нам понадобится экземпляр MS SQL Server 2012 с установленной на нём БД AdventureWorks и созданной тестовой БД, назовём её TestSSIS. Для обучения проще держать MS SQL на том же компьютере, на котором будем работать с проектом Integration Services.

Распространённые технологии импорта данных

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

1. BULK INSERT/bcp

bcp - это утилита командной строки для импорта/экспорта данных, входящая в состав Microsoft SQL Server 2012 tools (для более ранних версий она тоже присутствует). BULK INSERT - команда T-SQL, позволяющая импортировать данные тем же способом что и bcp, но без использования командной строки.

Основное назначение bcp - быстрое копирование данных между аналогичными по структуре таблицами. В принципе, с помощью файла формата (указанного в качестве опции) можно копировать данные между таблицами с разной структурой. Нередко используется копирование с помощью bcp в промежуточные таблицы, из которых средствами T-SQL данные преобразуются в итоговые таблицы.

В простом случае, сначала данные экспортируют из таблицы в файл, а потом из файла импортируют в другую таблицу (в т.ч. в другой БД или на другом сервере). В принципе, файл можно подготовить и другими средствами. Например, можно использовать csv-файлы, но с ограничениями.

четверг, 16 января 2014 г.

Импорт данных с точки зрения бизнеса

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

1. Первоначальный/разовый импорт

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

Часто бывает, что старое решение использует разнородные (или как модно говорить - гетерогенные) источники данных. Это могут быть несколько СУБД, файлы Excel или даже просто текстовые файлы. Но даже в случае, когда источник данных - единственная БД того же производителя, задача может быть не очень тривиальной, учитывая различия в структуре данных.

Обычно для первоначального импорта в MS SQL Server используются Integration Services, BULK INSERT (или утилита командной строки bcp) или написанный специально для этой задачи программный код. Подробнее об этих технологиях будет рассказано далее.

2. Интеграция с помощью БД

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