Columnstore Index - T

advertisement
http://www.EkbIT.Pro
Колоночные индексы
Алексей Князев
a.knyazev@t-sql.ru
http://www.t-sql.ru
Содержание
• SQL Server 2012 (Denali)
• Индексы
– Кластерный
– Некластерный
– Full Text
– XML
– Spatial
• Колоночные СУБД
• Columnstore Index
– Проект Appolo
– Ключевые особенности
– Демо
– Ограничения использования
• Заключение
• Вопросы?
2
SQL Server 2012
Codename “Denali”
Версии SQL Server
Релиз
Кодовое название
Год выхода
SQL Server 1.0 (16bit) (OS/2)
1989
SQL Server 1.1 (16bit) (OS/2)
1990
SQL Server 4.2 под Microsoft OS/2
-
1992
SQL Server 4.21 под Windows NT
SQLNT
1993
SQL Server 6.0
SQL95
1995
SQL Server 6.5
Hydra
1996
SQL Server 7.0
Sphinx
1998
SQL Server 7.0 OLAP
Plato
1999
SQL Server 2000 32-bit (8.0)
Shiloh
2000
SQL Server 2000 64-bit (8.0)
Liberty
2003
SQL Server 2005 (9.0)
Yukon
2005
SQL Server 2008 (10.0)
Katmai
2008
SQL Server 2008 R2 (10.5)
Kilimanjaro
2010
SQL Server 2012 (11.0)
Denali
2012
4
SQL Server 2012
Название
Версия
Дата выхода
SQL Server Denali CTP1
11.00.1103
08.11.2010
SQL Server Denali CTP3
11.00.1440
11.07.2011
SQL Server 2012 RC0
11.00.1750
17.11.2011
SQL Server 2012 RC1
11.00.1913
16.12.2011
SQL Server 2012 RTM
?
Март – апрель 2012 (???)
CTP - Community Technical Preview
RC - Release Candidate
RTM - Release To Manufacturing
5
Кодовые названия
• SQL Server 2000
– x32 Shiloh - National Military Park (США, Теннесси)
– x64 Liberty - State Park (США, Нью-Джерси)
• SQL Server 2005
– Yukon - заповедник в Канаде
• SQL Server 2008
– Katmai - гора на Аляске - высота 2,286м.
• SQL Server 2008 R2
– Kilimandjaro - самая высокая гора в Африке, высота 5,895м. (4 место в мире)
• SQL Server 2012
– Denali - высочайшая гора Аляски (Мак-Кинли), высота 6,194м. (3 место в мире)
• ???
6
Что дальше?
• Аконкагуа – 2 место
– Это самая высокая горная вершина
Южноамериканских Анд. Высота Аконкагуа – 6962 м.
Также это гора является самым высоким потухшим
вулканом на нашей планете. Туман, который вы видите
внизу на фотографии, на самом деле является
гигантским снежным вихрем.
• Эверест – 1 место
– Это самая высокая гора в мире. Жители Тибета
называют ее Джомолунгма, а непальцы – Сагарматха.
Ученые пока окончательно не определили истинную
высоту пика и по разным данным высота Эвереста
составляет от 8844 до 8852 м.
7
Индексы
Что такое индекс? 
• Индекс (англ. index) — объект базы данных, создаваемый
с целью повышения производительности поиска данных.
Таблицы в базе данных могут иметь большое количество
строк, которые хранятся в произвольном порядке, и их
поиск по заданному критерию путем последовательного
просмотра таблицы строка за строкой может занимать
много времени. Индекс формируется из значений одного
или нескольких столбцов таблицы и указателей на
соответствующие строки таблицы и, таким образом,
позволяет искать строки, удовлетворяющие критерию
поиска. Ускорение работы с использованием индексов
достигается в первую очередь за счёт того, что индекс
имеет структуру, оптимизированную под поиск например, сбалансированного дерева.
http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1
%81_(%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%B
D%D1%8B%D1%85)
9
Кластерный индекс (Clustered Indexes)
• Может быть только 1 кластерный индекс на таблицу
• Является частью таблицы
• Может содержать в себе максимум 16 столбцов
– 15 столбцов, если в таблице имеется один или несколько индексов
XML
• Для ограничения PRIMARY KEY создается уникальный
кластеризованный индекс по умолчанию
• Хранится в той же файловой группе, где и сама
таблица
• Кластерный индекс должен быть как можно меньше
насколько возможно
• Необязательный, но рекомендуемый.
10
Кластерный индекс (Clustered Indexes)
11
Некластерный индекс (Non-clustered Indexes)
• Количество некластеризованных индексов у таблицы 999,
начиная с SQL Server 2008
– 255 в SQL Server 2005 и ниже
• Может содержать в себе максимум 16 столбцов
• Может содержать в себе большее количество неключевых
столбцов
• Некластерные индексы всегда содержат столбцы кластерного
индекса (когда у таблицы есть кластерный индекс)
• Если таблица является «кучей», то каждый некластерный
индекс содержит в себе идентификатором строки в таблице
(RID)
• Может быть создан в любой файловой группе данной БД
• Может быть с условием (фильтром), чтобы иметь меньший
размер.
12
Некластерный индекс (Non-clustered Indexes)
13
Полнотекстовый индекс (Full Text Indexes)
• Не используется при обычных запроса T-SQL
• Для использования служат предикаты:
–
–
–
–
CONTAINS
CONTAINSTABLE
FREETEXT
FREETEXTTABLE
• Может использоваться, чтобы осуществлять поиск по
файлам (doc, docx, xls, pdf), сохраненным в БД
• Для таблицы или индексированного представления
допускается только один полнотекстовый индекс
• Полнотекстовый индекс может содержать не более 1024
столбцов
• Может индексировать XML-документы, но только
индексирует значения, не теги
• Natural Language Search.
14
XML индекс (XML Indexes)
• Позволяет индексировать определенные узлы XMLдокумента
• 249 XML индексов на одну таблицу
• Требует Кластерного индекса на таблице
• У каждого ХМL столбца может быть единственный
основной (Primary) индекс XML и множество вторичных
индексов XML
• XML индексы могут быть созданы на единственном XML
столбце
• Нет on-line перестроения
• Не доступны для переменных XML. Только используются
на таблицах.
15
Пространственный индекс (SPATIAL Indexes)
• Пространственный индекс можно создать только на
столбце типа geometry или geography
• Пространственные индексы можно определить только
для таблицы, у которой имеется первичный ключ
• Можно создать до 249 пространственных индексов для
каждого пространственного столбца в таблице
• Для построения индексов нельзя воспользоваться
доступным параллелизмом процессов
• Пока для таблицы определен пространственный индекс,
изменить метаданные первичного ключа невозможно
• Пространственные индексы не могут быть определены
для индексированных представлений
16
Колоночные СУБД
Строчное хранение и колоночное хранение
Под построчным хранением данных обычно понимается физическое хранение всей
строки таблицы в виде одной записи, в которой поля идут последовательно одно за
другим, а за последним полем записи в общем случае идет первое следующей
записи. Приблизительно так:
[A1, B1, C1], [A2, B2, C2], [A3, B3, C3]…
где A, B и С — это поля (столбцы), а 1,2 и 3 — номер записи (строки).
Колоночное хранение - с точки зрения SQL-клиента данные представлены как
обычно в виде таблиц, но физически эти таблицы являются совокупностью колонок,
каждая из которых по сути представляет собой таблицу из одного поля. При этом
физически на диске значения одного поля хранятся последовательно друг за
другом — приблизительно так:
[A1, A2, A3], [B1, B2, B3], [C1, C2, C3] и т.д.
18
Плюсы и минусы
Строчное хранение
Колоночное хранение
(+) Простая модификация данных
(+) Чтение только нужных блоков
данных
(-) Записи кортежа требуют
множественных обращений к данным
(-) Избыточные чтения данных
Таким образом, колоночное хранение являются подходящими для интенсивных
чтений
19
Почему колоночное хранение выгоднее
• Большинство запросов не обрабатывает все атрибуты
определенной таблицы
• Пример запроса:
Select c.name and c.address
From CUSTOMES as c
Where c.region=Mumbai;
• В запросе используются только три (name, address,
region) столбца таблицы CUSTOMES. При этом у
таблицы может быть на много больше колонок
• При колоночном хранении данных, при чтении
операции IO являются более эффективными, т.к. они
считывают, только те атрибуты, которые указаны в
запросе
20
Когда стоит использовать
• Может работать значительно быстрее чем строчное
хранение данных для ряда приложений
– В выборку попадают только столбцы, указанные в
запросе
– Более эффективная работа с кэшем
– Лучшая степень сжатия (данные в столбцах, как
правило однотипные)
• При этом ряд задач может работать медленнее
– OLTP с большим количеством операций INSERT и т.д.
21
Сравнение с классическими реляционными СУБД
• Реляционные СУБД:
•
•
•
•
•
соблюдается целостность данных (foreign keys, транзакционность)
четко структурированные данные
запросы по всей структуре БД, используя стандартизованный язык
результат запроса это небольшой (относительно БД) кусок данных
быстрое извлечение нужной структуры (в том числе быстрая реализация
запроса)
• Колоночные БД:
• хранят большие объемы данных, упрощённый шардинг, репликация и пр.
• данные гораздо менее структурированы
• данные обрабатываются большим блоком (параллельно, massive parallel
processing), или вообще сразу вся база
• оптимальным будет индивидуальный подход к обработке, тесная
интеграция с данными
• худшая (ручная) поддержка целостности данных
22
Список колоночных СУБД
•
•
Commercial
– 1010data's Tenbase database
– Alterian's Engine
– Aster Data Systems
– Calpont InfiniDB Enterprise Edition
– EXASOL
– FAME
– FluidDB
– Greenplum
– Hive Intelligence Ltd Hex Engine
– Infobright Enterprise Edition
– KDB
– Kickfire
– Oracle Retail Predictive Application Server (RPAS)
– Paraccel Analytic Database
– SAND CDBMS
– SAP HANA
– SenSage
– Sybase IQ
– Microsoft SQL Server 2012 (Enterprise Edition)
– Vectorwise
– Vertica
Free and open source software
– Calpont InfiniDB Community Edition
– Infobright Community Edition
– Greenplum Community Edition
– LucidDB
– Metakit
– MonetDB
– C-Store
– S programming language and GNU R incorporate column-oriented data structures for statistical analyses
23
Колоночные индексы (Columnstore)
SQL Server 2012
«Аполлон» (Apollo)
«Аполлон-11» (англ. Apollo 11) — пилотируемый космический корабль серии
«Аполлон», в ходе полёта которого люди впервые в истории совершили посадку на
поверхность другого небесного тела — Луны.
25
«Аполлон» (Apollo)
Apollo – кодовое имя нового оптимизатора запросов, ориентированного на нужные
поля результирующей выборки. В действительности, это одна из самых мощных
особенностей SQL Server Denali. Компания Microsoft считает, что
производительность запросов с новым механизмом оптимизации в ряде случаев
может быть увеличена в 10 раз.
Такой прирост производительности обеспечивается сущностью «Columnstore
Indexes». Суть инновации заключается в том, что списки полей хранятся не только в
таблицах данных, но еще и в специальных страницах.
• Считывание из базы данных производится только по тем полям, которые реально
нужны для составления результата запроса (часто это менее 15% всех полей в
таблице)
• Данные легче сжимаются, благодаря их избыточности в пределах одного поля
• Увеличивается эффективность использования буфера. Во-первых, уменьшен
объем извлекаемых данных, а во-вторых, производится анализ частоты
обращения к полям – и редко запрашиваемые поля выгружаются из памяти.
26
Колоночные индексы
• Цель: Уменьшить TCO (Total cost of ownership)
существенным ускорением запросов хранилища
данных (data warehouse)
• Две новые технологии в SQL Server 2012
– Колоночные индексы
– Векторное выполнение запроса (пакетная обработка)
– 10-100 - кратное ускорение
• Уменьшаются аппаратные потребности
• Уменьшается время агрегации
• Меньшее время отклика для конечного
пользователя
• Более полезные данные за короткое время
•
•
110010100
101001010
011101011
00101001
http://social.technet.microsoft.com/wiki/contents/articles/sql-server-columnstore-performance-tuning.aspx
http://social.technet.microsoft.com/wiki/contents/articles/sql-server-columnstore-index-faq.aspx
27
Когда мне нужны колоночные индексы
Создайте колоночный
индекс, если у вас
• Рабочая нагрузка дала выигрыш в
производительности
• Большинство обновлений добавляет
новые данные
• Обычно ночная загрузка новых данных
• Большинство запросов соответствует
образцу звездообразного объединения
или влечет за собой сканирование и
агрегацию больших объемов данных
• Большая таблица фактов или измерений
Не создавайте
колоночный индекс,
если у вас
• Частые обновления
• Большое количество мелких (точечных)
запросов
• Строчное хранение (B-tree) индексов
может дать большую производительность
• Рабочая нагрузка не дала прироста
производительности
28
Увеличение производительности
• Зависит от данных, запросов и т.д.
• Обусловлено тем, на сколько эффективный план запроса, сколько
используется столбцов из колоночного индекса и используется ли
пакетная обработка (до 100 кратного ускорения)
• 1 TB version of TPC-DS DB 32 proc, 256 GB RAM
SELECT w_city, w_state, d_year, SUM(cs_sales_price) AS cs_sales_price
FROM warehouse, catalog_sales, date_dim
WHERE w_warehouse_sk = cs_warehouse_sk and cs_sold_date_sk = d_date_sk
and w_state = 'SD‘ and d_year = 2002
GROUP BY w_city, w_state, d_year
ORDER BY d_year, w_state, w_city;
and c.address
Row store
Columnstore + batch
Speedup
Cold Buffer Pool
CPU
Elapsed
259 s 20 s
19.8 s 0.8 s
13 X
25 X
Warm Buffer Pool
CPU
Elapsed
206 s
3.1 s
16.3 s 0.3 s
13 X
10 X
29
Рабочая нагрузка хранилища данных (DataStorage)
• Основные запросы – это чтение
• Загружаются большие объёмы данных
• Все данные монотонно увеличиваются ( process_datetime, ididentity )
• Обновление происходит крайне редко
• Данные хранятся в течении времени (например 5 лет с помесячной
разбивкой)
• Доступ к данным в режиме sliding window
30
Sliding window ( «скользящее окно» )
2010
2010
2011
2009
2009
2010
2008
2008
2009
2008
2007
2007
31
Схемы хранилища данных и запросы
• Схема «звезда»
• Большая таблица фактов  создаём колоночные индексы
• Небольшие таблицы измерений
• Звездообразные объединения (Star joins)
• Большинство запросов – это агрегация данных
32
Схема «звезда»
FactSales( CustomerKey int
, ProductKey int
, EmployeeKey int
, StoreKey int
, OrderDateKey int
, SalesAmount money
)
FactSales
DimDate
DimEmployee
DimCustomer( CustomerKey int
, FirstName nvarchar(50)
, LastName nvarchar(50)
, Birthdate date
, EmailAddress nvarchar(50)
)
DimCustomer
DimStore
DimProduct …
33
Запросы типа «звезда»
SELECT TOP 10 p.ModelName, p.EnglishDescription,
SUM(f.SalesAmount) as SalesAmount
FROM FactResellerSalesPart f, DimProduct p, DimEmployee e
WHERE f.ProductKey=p.ProductKey
AND e.EmployeeKey=f.EmployeeKey
AND f.OrderDateKey >= 20030601
AND p.ProductLine = 'M' -- Mountain
AND p.ModelName LIKE '%Frame%'
AND e.SalesTerritoryKey = 1
GROUP BY p.ModelName, p.EnglishDescription
ORDER BY SUM(f.SalesAmount) desc;
34
«Типичные» запросы хранилища данных
•
•
•
•
Запросы к большому объёму данных
Создание отчётов
Медленная обработка данных (минуты, а то и часы)
DBA/DBD прилагают значительные усилия для исправления
ситуации
• Создание новых (возможно временных) индексов
• Оптимизация запросов
• Создание сводных таблиц
• Создание индексированных представлений
• OLAP - кубы
35
Columnstore Index Demo
SQL Server 2012
Структура колоночных индексов
C1
C2
C3
C4
C5
C6
Uses VertiPaq
compression
Патентованная технология
Microsoft VertiPaq
37
Уменьшаем IO за счет колоночных индексов
SELECT region, sum (sales) …
C2
C1
C3
C4
C5
C6
• Чтение с диска только
необходимых столбцов
• Столбцы сжаты
• Меньшее число операций IO
• Улучшенная работа с буфером
38
Технология выполнения сложного запроса
• Пакетное выполнение некоторых
операций
• Группы пакетных обработок в плане
запроса
• Пакетная обработка строк
• Эффективное представление данных
• Очень эффективные алгоритмы
• Улучшенный параллелизм
39
Сегменты столбца
C1
C2
C3
C4
C5
C6
• Сегмент столбца содержит
значения одного столбца для 1М
строк
• Сегмент столбца в сжатом виде
• Каждый сегмент столбца сохранен
в отдельном LOB
• Сегмент столбца – единица
хранения и обращения к данным с
диска
Set of about
1M rows
Column Segment
40
Ограничения на использование с другими индексами
и секционированием
• Таблица может быть либо кластеризованной либо кучей
• Колоночный индекс:
• Может быть только некластерным
• Только один на таблицу
• Для секционированной таблицы должен быть
выровненным
• Не может быть создан на индексированном
представлении
• Не может быть с условием
41
Создание колоночного индекса
• Создаём таблицу
• Вставляем данные
• Создаём некластерный колоночный индекс для всех или
определённых столбцов таблицы
CREATE NONCLUSTERED COLUMNSTORE INDEX ncci ON
myTable(OrderDate, ProductID, SaleAmount)
Object Explorer
42
Создание колоночного индекса через SSMS
43
Оптимизация запросов с колоночными индексами
• Оценка стоимости
• Оптимизатор использует колоночный индекс
• Оптимизатор использует пакетную обработку
44
Подсказки для работы с колоночными индексами
• Используем колоночный индекс
select distinct (SalesTerritoryKey)
from dbo.FactResellerSales with (index (ncci))
• Используем другой индекс
select distinct (SalesTerritoryKey)
from dbo.FactResellerSales with (index (ci))
• Игнорируем колоночный индекс
select distinct (SalesTerritoryKey)
from dbo.FactResellerSales
option(ignore_nonclustered_columnstore_index)
45
Работа с памятью
•
•
•
•
Управление памятью происходит автоматически
Колоночный индекс хранится на диске
Только необходимые столбцы поднимаются в память
Данные с диска считываются в память сегментами стобца
SELECT C2, SUM(C4)
FROM T
GROUP BY C2;
T.C1
T.C2
T.C1
T.C1
T.C3
T.C2
T.C2
T.C4
T.C3
T.C2
T.C1
T.C1
T.C4
T.C3
T.C3
T.C4
T.C2
T.C4
T.C3
T.C4
46
Новые элементы плана выполнения для колоночных
индексов и пакетной обработки
47
48
Новые системные представления для работы с
колоночными индексами
49
Колоночные индексы: функциональная совместимость
с остальной частью SQL-сервера
•
•
•
•
•
•
Backup and restore
Mirroring
Log shipping
SSMS
Administration, tools
Partitions
50
Ограничения: типы данных
• Неподдерживаемые типы данных
• decimal > 18 digits
• Binary
• BLOB
• (n)varchar(max)
• Uniqueidentifier
• Date/time types > 8 bytes
• CLR
51
Ограничения: производительность запросов
• Outer joins
• Unions
• Подходят для запросов:
• Inner joins
• Star joins
• Aggregation
52
Вставка новых данных в колоночный индекс
• Колоночный индекс делает таблицу read-only
• Переключение секций в секционированных таблицах
поддерживается
• Операторы INSERT, UPDATE, DELETE и MERGE не
работают
• Два рекомендованных метода загрузки данных:
• Disable, update, rebuild
• Partition switching
53
Вставка новых данных в колоночный индекс
Метод №1 – Отключение индекса
• Отключить (или удалить) индекс
ALTER INDEX my_index ON MyTable DISABLE
• Обновить таблицу
• Перестроить колоночный индекс
ALTER INDEX my_index ON MyTable REBUILD
54
Вставка новых данных в колоночный индекс
Метод №2 - Секционирование
• Загрузить данные в промежуточную таблицу
• Постройте на ней колоночный индекс
CREATE NONCLUSTERED COLUMNSTORE INDEX my_index
ON StagingT(OrderDate, ProductID, SaleAmount)
• Создать на основной таблице новую секцию (SPLIT)
• Переключить промежуточную таблицу в новую секцию
основной таблицы
ALTER TABLE StagingT SWITCH TO T PARTITION 5
55
Заключение
Q&A
Ваши вопросы
Ресурсы
• General SQL Server Information
–
www.microsoft.com/sql
–
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27721
–
http://www.microsoft.com/downloads/ru-ru/details.aspx?FamilyID=3df53bd9-cde1-466eb3d1-9884d46c897c
• SQL Server 2012 Developer Training Kit
• Microsoft® SQL Server® 2012 RC0
• RC0 Books Online
–
http://msdn.microsoft.com/en-us/library/ms130214%28v=sql.110%29.aspx
–
http://download.microsoft.com/download/8/C/1/8C1CE06B-DE2F-40D1-9C5C3EE521C25CE9/Columnstore%20Indexes%20for%20Fast%20DW%20QP%20SQL%20Serve
r%2011.pdf
• Columnstore Indexes for Fast DW QP
• Колоночные СУБД — принцип действия, преимущества и
область применения
–
http://habrahabr.ru/blogs/sql/95181/
–
http://www.EkbIT.Pro
–
http://www.t-sql.ru
• Наш сайт
• Мой блог
58
Download