580 likes | 999 Views
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 Ключевые особенности Демо
E N D
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 • Ключевые особенности • Демо • Ограничения использования • Заключение • Вопросы?
SQL Server 2012 Codename “Denali”
SQL Server 2012 CTP - Community Technical Preview RC - Release Candidate RTM - Release To Manufacturing
Кодовые названия • 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 место в мире) • ???
Что дальше? • Аконкагуа – 2 место • Это самая высокая горная вершина Южноамериканских Анд. Высота Аконкагуа – 6962 м. Также это гора является самым высоким потухшим вулканом на нашей планете. Туман, который вы видите внизу на фотографии, на самом деле является гигантским снежным вихрем. • Эверест – 1 место • Это самая высокая гора в мире. Жители Тибета называют ее Джомолунгма, а непальцы – Сагарматха. Ученые пока окончательно не определили истинную высоту пика и по разным данным высота Эвереста составляет от 8844 до 8852 м.
Что такое индекс? Индекс (англ. 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%BD%D1%8B%D1%85)
Кластерный индекс (Clustered Indexes) • Может быть только 1 кластерный индекс на таблицу • Является частью таблицы • Может содержать в себе максимум 16 столбцов • 15 столбцов, если в таблице имеется один или несколько индексов XML • Для ограничения PRIMARY KEY создается уникальный кластеризованныйиндекс по умолчанию • Хранится в той же файловой группе, где и сама таблица • Кластерный индекс должен быть как можно меньше насколько возможно • Необязательный, но рекомендуемый.
Некластерный индекс (Non-clustered Indexes) • Количество некластеризованныхиндексов у таблицы 999, начиная с SQL Server 2008 • 255 в SQL Server2005 и ниже • Может содержать в себе максимум 16 столбцов • Может содержать в себе большее количество неключевых столбцов • Некластерные индексы всегда содержат столбцы кластерного индекса (когда у таблицы есть кластерный индекс) • Если таблица является «кучей», то каждый некластерный индекс содержит в себеидентификатором строкив таблице (RID) • Может быть создан в любой файловой группе данной БД • Может быть с условием (фильтром), чтобы иметь меньший размер.
Некластерный индекс (Non-clustered Indexes)
Полнотекстовый индекс (Full Text Indexes) • Не используется при обычных запроса T-SQL • Для использования служат предикаты: • CONTAINS • CONTAINSTABLE • FREETEXT • FREETEXTTABLE • Может использоваться, чтобы осуществлять поиск по файлам (doc, docx, xls, pdf), сохраненным в БД • Для таблицы или индексированного представления допускается только один полнотекстовый индекс • Полнотекстовый индекс может содержать не более 1024 столбцов • Может индексировать XML-документы, но только индексирует значения, не теги • Natural Language Search.
XML индекс (XML Indexes) Позволяет индексировать определенные узлы XML-документа 249 XML индексов на одну таблицу Требует Кластерного индекса на таблице У каждого ХМLстолбца может быть единственный основной (Primary) индекс XML и множество вторичных индексов XML XML индексы могут быть созданы на единственном XML столбце Нет on-line перестроения Не доступны для переменных XML. Только используются на таблицах.
Пространственный индекс (SPATIALIndexes) Пространственный индекс можно создать только на столбце типа geometry или geography Пространственные индексы можно определить только для таблицы, у которой имеется первичный ключ Можно создать до 249 пространственных индексов для каждого пространственного столбца в таблице Для построения индексов нельзя воспользоваться доступным параллелизмом процессов Пока для таблицы определен пространственный индекс, изменить метаданные первичного ключа невозможно Пространственные индексы не могут быть определены для индексированных представлений
Строчное хранение иколоночное хранение Под построчным хранением данных обычно понимается физическое хранение всей строки таблицы в виде одной записи, в которой поля идут последовательно одно за другим, а за последним полем записи в общем случае идет первое следующей записи. Приблизительно так: [A1, B1, C1], [A2, B2, C2], [A3, B3, C3]… где A, B и С — это поля (столбцы), а 1,2 и 3 — номер записи (строки). Колоночное хранение - с точки зрения SQL-клиента данные представлены как обычно в виде таблиц, но физически эти таблицы являются совокупностью колонок, каждая из которых по сути представляет собой таблицу из одного поля. При этом физически на диске значения одного поля хранятся последовательно друг за другом — приблизительно так: [A1, A2, A3], [B1, B2, B3], [C1, C2, C3] и т.д.
Плюсы и минусы Таким образом, колоночное хранение являются подходящими для интенсивных чтений
Почему колоночное хранение выгоднее Select c.name and c.address From CUSTOMES as c Where c.region=Mumbai; Большинство запросов не обрабатывает все атрибуты определенной таблицы Пример запроса: В запросе используются только три (name, address, region) столбца таблицы CUSTOMES. При этом у таблицы может быть на много больше колонок При колоночном хранении данных, при чтении операции IO являются более эффективными, т.к. они считывают, только те атрибуты, которые указаны в запросе
Когда стоит использовать • Может работать значительно быстрее чем строчное хранение данных для ряда приложений • В выборку попадают только столбцы, указанные в запросе • Более эффективная работа с кэшем • Лучшая степень сжатия (данные в столбцах, как правило однотипные) • При этом ряд задач может работать медленнее • OLTP с большим количеством операций INSERT и т.д.
Сравнение с классическими реляционными СУБД • Реляционные СУБД: • соблюдается целостность данных (foreignkeys, транзакционность) • четко структурированные данные • запросы по всей структуре БД, используя стандартизованный язык • результат запроса это небольшой (относительно БД) кусок данных • быстрое извлечение нужной структуры (в том числе быстрая реализация запроса) • Колоночные БД: • хранят большие объемы данных, упрощённый шардинг, репликация и пр. • данные гораздо менее структурированы • данные обрабатываются большим блоком (параллельно, massiveparallelprocessing), или вообще сразу вся база • оптимальным будет индивидуальный подход к обработке, тесная интеграция с данными • худшая (ручная) поддержка целостности данных
Список колоночных СУБД • Commercial • 1010data's Tenbase database • Alterian's Engine • Aster Data Systems • CalpontInfiniDB 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 • CalpontInfiniDB 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
Колоночные индексы (Columnstore) SQL Server 2012
«Аполлон» (Apollo) «Аполлон-11» (англ. Apollo 11) — пилотируемый космический корабль серии «Аполлон», в ходе полёта которого люди впервые в истории совершили посадку на поверхность другого небесного тела — Луны.
«Аполлон» (Apollo) • Apollo – кодовое имя нового оптимизатора запросов, ориентированного на нужные поля результирующей выборки. В действительности, это одна из самых мощных особенностей SQL ServerDenali. Компания Microsoft считает, что производительность запросов с новым механизмом оптимизации в ряде случаев может быть увеличена в 10 раз. • Такой прирост производительности обеспечивается сущностью «ColumnstoreIndexes». Суть инновации заключается в том, что списки полей хранятся не только в таблицах данных, но еще и в специальных страницах. • Считывание из базы данных производится только по тем полям, которые реально нужны для составления результата запроса (часто это менее 15% всех полей в таблице) • Данные легче сжимаются, благодаря их избыточности в пределах одного поля • Увеличивается эффективность использования буфера. Во-первых, уменьшен объем извлекаемых данных, а во-вторых, производится анализ частоты обращения к полям – и редко запрашиваемые поля выгружаются из памяти.
Колоночные индексы 11001010010100101001110101100101001 • Цель: Уменьшить TCO (Totalcostofownership) существенным ускорением запросов хранилища данных (data warehouse) • Две новые технологии в SQL Server 2012 • Колоночные индексы • Векторное выполнение запроса (пакетная обработка) • 10-100 - кратноеускорение • Уменьшаются аппаратные потребности • Уменьшается время агрегации • Меньшее время отклика для конечного пользователя • Более полезные данные за короткое время • 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
Когда мне нужны колоночные индексы
Увеличение производительности • Зависит от данных, запросов и т.д. • Обусловлено тем, на сколько эффективный план запроса, сколько используется столбцов из колоночного индекса и используется ли пакетная обработка (до 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
Рабочая нагрузка хранилища данных (DataStorage) • Основные запросы – это чтение • Загружаются большие объёмы данных • Все данные монотонно увеличиваются ( process_datetime, id-identity ) • Обновление происходит крайне редко • Данные хранятся в течении времени (например 5 лет с помесячной разбивкой) • Доступ к данным в режиме sliding window
Sliding window ( «скользящее окно» ) 2011 2010 2010 2010 2009 2009 2009 2008 2008 2008 2007 2007
Схемы хранилища данных и запросы • Схема «звезда» • Большая таблица фактов создаём колоночные индексы • Небольшие таблицы измерений • Звездообразные объединения (Star joins) • Большинство запросов – это агрегация данных
Схема «звезда» FactSales FactSales(CustomerKeyint , ProductKeyint , EmployeeKeyint , StoreKeyint , OrderDateKeyint , SalesAmount money ) DimCustomer(CustomerKeyint , FirstNamenvarchar(50) , LastNamenvarchar(50) , Birthdate date , EmailAddressnvarchar(50) ) DimProduct … DimDate DimEmployee DimCustomer DimStore
Запросы типа «звезда» SELECT TOP 10 p.ModelName, p.EnglishDescription, SUM(f.SalesAmount) as SalesAmount FROM FactResellerSalesPartf, 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.ModelNameLIKE '%Frame%' AND e.SalesTerritoryKey = 1 GROUP BY p.ModelName, p.EnglishDescription ORDER BY SUM(f.SalesAmount) desc;
«Типичные» запросы хранилища данных • Запросы к большому объёму данных • Создание отчётов • Медленная обработка данных (минуты, а то и часы) • DBA/DBD прилагают значительные усилия для исправления ситуации • Создание новых (возможно временных) индексов • Оптимизация запросов • Создание сводных таблиц • Создание индексированных представлений • OLAP - кубы
Columnstore Index Demo SQL Server 2012
Структура колоночных индексов Row store: … C1 C4 C5 C6 C3 C2 Pages Column store: Uses VertiPaq compression Патентованная технология Microsoft VertiPaq
Уменьшаем IO за счет колоночных индексов • Чтение с диска только необходимых столбцов • Столбцы сжаты • Меньшее число операций IO • Улучшенная работа с буфером SELECT region, sum (sales) … C2 C3 C6 C4 C5 C1
Технология выполнения сложного запроса • Пакетное выполнение некоторых операций • Группы пакетных обработок в плане запроса • Пакетная обработка строк • Эффективное представление данных • Очень эффективные алгоритмы • Улучшенный параллелизм
Сегменты столбца • Сегмент столбца содержит значения одного столбца для 1М строк • Сегмент столбца в сжатом виде • Каждый сегмент столбца сохранен в отдельном LOB • Сегмент столбца – единица хранения и обращения к данным с диска C1 C4 C5 C6 C3 C2 Set of about 1M rows Column Segment
Ограничения на использование с другими индексами и секционированием • Таблица может быть либо кластеризованной либо кучей • Колоночный индекс: • Может быть только некластерным • Только один на таблицу • Для секционированной таблицы должен быть выровненным • Не может быть создан на индексированном представлении • Не может быть с условием
Создание колоночного индекса • Создаём таблицу • Вставляем данные • Создаём некластерный колоночный индекс для всех или определённых столбцов таблицы CREATE NONCLUSTERED COLUMNSTORE INDEX ncci ON myTable(OrderDate, ProductID, SaleAmount) Object Explorer
Создание колоночного индексачерез SSMS
Оптимизация запросов с колоночными индексами • Оценка стоимости • Оптимизатор использует колоночный индекс • Оптимизатор использует пакетную обработку
Подсказки для работы с колоночными индексами • Используем колоночный индекс • Используем другой индекс • Игнорируем колоночный индекс 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)
Работа с памятью • Управление памятью происходит автоматически • Колоночный индекс хранится на диске • Только необходимые столбцы поднимаются в память • Данные с диска считываются в память сегментами стобца T.C1 T.C1 T.C1 T.C1 T.C1 T.C2 T.C2 T.C2 T.C4 T.C4 T.C2 T.C4 T.C3 T.C3 T.C2 T.C3 T.C3 T.C4 T.C4 T.C3 SELECT C2, SUM(C4) FROM T GROUP BY C2;
Новые элементы плана выполнения для колоночных индексов и пакетной обработки
Новые системные представления для работы с колоночными индексами
Колоночные индексы: функциональная совместимость с остальной частью SQL-сервера • Backup and restore • Mirroring • Log shipping • SSMS • Administration, tools • Partitions