Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
SQL Server 2005 : Новые технологии повышения производительности Кирилл Панов Системный инженер Microsoft Содержание Версионность Индексы и уход за ними Секционирование Пример падения производительности сервера Баз Данных Методы решения В SQL Server 2005 использовать версионность Не использовать длинные транзакции Могут быть ситуации, когда транзакцию невозможно сделать короткой Уменьшить уровень изоляции до Read Uncommitted Возможно грязное чтение Snapshot Isolation Как это сделано Уровни изоляции, основанные на моментальных снимках, используют версионность данных на уровне строк Операции Update/Delete генерируют версии строк Непротиворечивость чтения достигается прохождением по версиям строки в обратном хронологическом порядке Каждой транзакции назначается транзакционный последовательный номер (XSN) Каждая новая или измененная строка помечается этим номером Предыдущая версия помещается в хранилище версий Каждая строка указывает на связный список предыдущих версий этой строки Версии строки содержатся в базе данных tempdb Два новых уровня изоляции в Microsoft SQL Server 2005 Read-Committed Snapshot Isolation Новое поведение read committed (неблокирующее) Изоляция на уровне инструкций Получение последних зафиксированных данных на момент начала выполнения инструкции Snapshot Isolation Новый уровень изоляции транзакций Изоляция на уровне транзакций Получение последних зафиксированных данных на момент начала выполнения транзакции Snapshot Isolation Транзакционная согласованность БД на момент начала транзакции Требуется установка на уровне БД ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON Требуется установка на уровне сессии SET TRANSACTION ISOLATION LEVEL SNAPSHOT Чтение не блокирует данные Уменьшается количество тупиковых блокировок Но ценой конфликтов при одновременной записи несколькими транзакциями Состояние Snapshot Isolation включено по умолчанию для master и msdb Read-Committed Snapshot Требуется включение на уровне БД ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON Процессы чтения видят зафиксированные значения на момент выполнения инструкции Процессы записи не блокируют процессы чтения Процессы чтения не блокируют процессы записи Значительное уменьшение операций блокирования ресурсов и появления тупиковых блокировок без изменения кода приложений Включение версионности Пример ALTER DATABASE AdventureWorks SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE AdventureWorks SET READ_COMMITTED_SNAPSHOT ON SELECT snapshot_isolation_state_desc FROM sys.databases WHERE name= 'AdventureWorks ' -> snapshot_isolation_state_desc ON SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name= 'AdventureWorks ' -> is_read_committed_snapshot_on 1 Snapshot Isolation Пример Транзакция 1 BEGIN TRAN UPDATE tst SET y =-1 WHERE x =1 Транзакция 2 (Snapshot Isolation) SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN SELECT y FROM tst WHERE x = 1 COMMIT TRAN -- 1 SELECT y FROM tst WHERE x = 1 -- 1 COMMIT TRAN SELECT y FROM tst WHERE x= 1 -- -1 Время Транзакция 3 (RCSI) BEGIN TRAN SELECT y FROM tst WHERE x = 1 -- 1 SELECT y FROM tst WHERE x = 1 -- -1 COMMIT TRAN SELECT y FROM tst WHERE c1 = 1 -- -1 Snapshot Isolation Обязательное выявление конфликтов Возникает только для Snapshot Isolation Возникает, когда данные, изменяющиеся внутри snapshot-транзакции, также изменяются другой транзакцией Обнаружение происходит автоматически Вызывает автоматический откат snapshotтранзакции Обнаружение конфликтов предотвращает проблему “потерянных обновлений” Обнаружение конфликта обновления Транзакция 1 BEGIN TRAN UPDATE tst SET y = -2 WHERE x =2 COMMIT TRAN Транзакция 2 (Snapshot Isolation) SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRAN BEGIN TRAN SELECT y FROM tst WHERE x = 2 SELECT y FROM tst WHERE x = 2 -- 2 UPDATE tst SET y = 4 WHERE x = 2 эта инструкция не пройдет из-за обнаружения конфликта и автоматически произойдет откат транзакции Время Транзакция 3 (RCSI) -- 2 UPDATE tst SET y = 3 WHERE x = 2 COMMIT TRAN SELECT y FROM tst WHERE x = 2 -- 3 Выбор Read-Committed Snapshot Isolation Процессы чтения видят зафиксированные значения на момент выполнения инструкции Snapshot Isolation Процессы чтения видят зафиксированные значения на момент выполнения транзакции Предотвращается проблема “потерянных обновлений” Требуется изменение кода Написание исключений для выявление конфликтов Установка на уровне сессии SET TRANSACTION ISOLATION LEVEL SNAPSHOT Нагрузка гораздо больше по сравнению c RCSI Версии хранятся в tempdb Обеспечьте свободное пространство и производительность дискового массива Содержание Версионность Индексы и уход за ними Секционирование Дефрагментация индексов SQL Server 2000 DBCC DBREINDEX CREATE with DROP_EXISTING DBCC INDEXDEFRAG (дефрагментация) SQL Server 2005 Все, что выше ALTER INDEX…REBUILD заменяет DBCC DBREINDEX Два режима: ONLINE – доступ к индексу во время перестройки OFFLINE – доступ к индексу блокируется (как в SQL 2000) ALTER INDEX … REORGANIZE заменяет DBCC INDEXDEFRAG Перестройка индексов в режиме ONLINE Индексы могут быть перестроены: Индекс в состоянии ENABLE Индекс не содержит LOB полей: image varbinary(max) xml text ntext varchar(max) nvarchar(max) Индекс не на временной таблице Как это работает Сначала генерируется моментальный снимок индекса Запросы используют только исходный индекс Новый индекс перестраивается Обновления применяются к ОБОИМ индексам После перестройки имеет место очень короткая пауза для перенаправления доступа на новый индекс Исходный индекс удаляется в “lazy” режиме в зависимости от нагрузки сервера ONLINE операции Конкуренция происходит только в течение двух очень коротких моментов: в начале и в конце операции При изменении данных производительность будет падать, так как изменяются два индекса В один момент времени может выполняться только одна операция над таблицей Определение фрагментации SQL Server 2000: DBCC SHOWCONTIG Трудно использовать при программном анализе SQL Server 2005: sys.dm_db_index_physical_stats(params) Функция, возвращающая таблицу ОЧЕНЬ ПРОСТО написать анализ Можно использовать SELECT INTO для сохранения результирующего набора Автоматическая перестройка индексов Используя цикл или курсор, пробегаем по таблицам Определяем уровень фрагментации для каждого индекса Перестраиваем только те индексы, у которых уровень фрагментации выше желаемого Создаем процедуру Создаем задание! Содержание Версионность Индексы и уход за ними Секционирование Секционирование таблиц и индексов Разбиение таблиц и индексов на несколько хранимых объектов по значению колонки таблицы Обращение происходит к единому объекту Хранится несколько объектов Поддерживается до 1000 секций на объект Секционирование и хранение Order History Order ID Customer ID Order Date Amount … Пример: Таблица ORDER HISTORY с некластерным индексом на CUSTOMER ID Без секционирования: Filegroup DATA Order History Table Filegroup IDX Customer ID Index Секционирование и хранение Orders Order Order ID History Customer Order IDID Разбиение по ORDER DATE: Filegroup DATA_2002 Filegroup DATA_2003 Filegroup DATA_2004 Order Date Customer ID Amount Order Date … Amount … Order History Table Order History Table Order History Table Filegroup IDX_2002 Filegroup IDX_2003 Filegroup IDX_2004 Customer ID Index Order Date < ‘2003-01-01’ Customer ID Index Order Date >= ‘2003-01-01’ and Order Date < ‘2004-01-01’ Customer ID Index Order Date >= ‘2004-01-01’ Преимущества секционированных таблиц Управление Резервное копирование и восстановление Возможность реорганизации, оптимизации и перестройки индекса по секции Возможность хранения данных на различных системах хранения Производительность запросов с большими таблицами Более эффективные соединения Меньшее сканирование индексного дерева или сканирование таблицы, когда происходит обращение к одной (или немногим) секциям Более быстрое создание плана выполнения по сравнению с Partition Views Сравнение c Partition Views Секционированная таблица – единый объект в плане выполнения запроса Единый объект статистики Меньший план, более быстрая компиляция чем PV Insert / Bulk Insert / BCP Запросы могут обращаться к секциям параллельно Секция – это единица параллелизма Но… Невозможно разбиение между несколькими БД или экземплярами В этом случае нужно использовать PV или DPVs Создание секций Объекты: Partition Function Partition Scheme Операции: Split Partition Merge Partition Switch Partition Функция секционирования Задает преобразование интервала значений в целое число – номер секции N границ задают N+1 секцию Секция# 1 Граница Граница Граница Граница 1 2 3 4 2 3 4 5 Функция секционирования RANGE LEFT и RIGHT RANGE LEFT по умолчанию RANGE LEFT ( ] RANGE RIGHT [ ) RANGE RIHGT 2003-01-01 RANGE LEFT 2003-02-01 2003-03-01 2003-04-01 Функция секционирования CREATE PARTITION FUNCTION annual_range (DATETIME) as RANGE RIGHT for values ( -- Секция 1 -- 2001 и раньше '2002-01-01',-- Секция 2 -- 2002 '2003-01-01',-- Секция 3 -- 2003 '2004-01-01',-- Секция 4 -- 2004 '2005-01-01' -- Секция 5 -- 2005 и позднее ) Пример использования секций на поле типа Datetime Граница Граница 1 2 2002-01-01 Секция # 1 2001 и раньше Значение < 2002-01-01 Граница 3 2003-01-01 2004-01-01 2 2002 2002-01-01 <= < 2003-01-01 Граница 3 4 2005-01-01 4 5 2003 2004 2005 2003-01-01 2004-01-01 2005-01-01 и позднее <= < <= < <= 2004-01-01 2005-01-01 Схема секционирования Задает местоположение файловой группы для каждой секцией Рекомендация: разнести все файловые группы на различные физические устройства Схема секционирования CREATE PARTITION SCHEME annual_scheme_1 as PARTITION annual_range to (annual_min, -- filegroup для <2002 annual_2002, -- filegroup для 2002 annual_2003, -- filegroup для 2003 annual_2004, -- filegroup для 2004 annual_2005) -- filegroup для>= 2005 Range Right Datetime Секционная функция Граница Граница Граница Граница 1 2 3 4 2002-01-01 Секция # 1 2001 и раньше 2003-01-01 2004-01-01 2 3 2002 2003 2005-01-01 4 2004 5 2005 и позже Схема секционирования Filegroup Annual_Min Filegroup Annual_2002 Filegroup Annual_2003 Filegroup Annual_2004 Filegroup Annual_2005 Секционирование таблиц и индексов Одна колонка должна быть выбрана как ключ секционирования Секционированные таблицы и индексы создаются на схемах секционирования, а не на файловых группах Различные таблицы и индексы могут использовать общие функции секционирования и схемы Partition Function 1 Partition Scheme ко многим Table or Index ко многим Создание таблиц и индексов CREATE TABLE Order_History ( Order_ID bigint, Order_Date datetime, Customer_ID bigint … ) ON Annual_Scheme_1(Order_Date) CREATE INDEX Order_Cust_Idx ON Order_History(Order_ID) ON Annual_Scheme_1(Order_Date) Операции над секциями Достигается с помощью операций над секциями: Split Перед командой SPLIT , обязательно укажите ‘Next Used’ в схеме секционирования при помощи команды: ALTER PARTITION SCHEME NEXT USED … Указывает, какая файловая группа будет содержать данные новой секции Merge Switch Переместить данные таблицы в пустую секцию другой таблицы Секцию переместить в пустую таблицу Секцию переместить в пустую секцию другой таблицы Пример: Split Граница Граница 1 2 2002-01-01 Секция # 1 2001 и ранее Граница 4 Граница 5 2005-01-01 2006-01-01 Граница 3 2003-01-01 2004-01-01 2 3 4 2002 2003 2004 5 6 2005 2005 и позднее ALTER PARTITION FUNCTION annual_range() SPLIT RANGE (‘2006-01-01’) 2006 и позднее Данные за 2006 и позднее перенесутся Пример: Merge Range Right Граница Граница Граница Граница Граница Граница Граница 1 12 23 34 54 2002-01-01 1 2003-01-01 2004-01-01 1 2 2001 и ранее 2002 2002 и ранее Данные за 2002 перенесутся 2 3 2003 2005-01-01 3 4 2004 2006-01-01 4 5 2005 56 2006 и позднее ALTER PARTITION FUNCTION annual_range() MERGE RANGE (‘2002-01-01’) Пример: переместить данные таблицы в пустую секцию другой таблицы Table A: 2002-01-01 2003-01-01 2004-01-01 2005-01-01 2006-01-01 [пустая] Секция 1 # 2001 и 2 2002 ранее 3 2003 4 5 6 2004 2005 2006 и позднее ALTER TABLE B SWITCH TO A PARTITION 2 Filegroup DATA_2002 Table B: [Станет пустой] Рекомендации Разбивайте и сливайте только пустые секции для наилучшей производительности Разнести, по возможности, все данные на различные физические устройства Итоги В SQL Server 2005 помимо блокировок появляется механизм версионности SQL Server 2005 расширяет возможности по управлению индексами SQL Server 2005 предлагает механизм секционирования для повышения эффективности работы с большими таблицами Используйте новые возможности SQL Server 2005 для повышения производительности ваших решений Новые возможности SQL Server 2005 .NET Framework Database Maintenance Replication Common Language Runtime Integration Backup and Restore Enhancements Auto-tuning Replication Agents User-defined Aggregates Checksum Integrity Checks Oracle Publication User-defined Data Types Dedicated Administrator Connection Improved Blob Change Tracking User-defined Functions Dynamic AWE OLAP and Data Mining SQL Server In-Proc Data Provider Fast Recovery Analysis Management Objects Extended Triggers Highly-available Upgrade Windows Integrated Backup and Restore Data Types Web Services/XML for Analysis Online Index Operations File Stream Storage Attribute DTS and DM Integration Online Restore Managed SQL Types Eight new DM algorithms Parallel DBCC New XML Datatype Auto Packaging and Deployment Parallel Index Operations SQL Server Engine Data Transformation Services Management Tools New Message Service Broker New Architecture (DTR + DTP) MDX Query Editor HTTP Support (Native HTTP) Complex Control Flows MDX Intellisense Database Tuning Advisor Control Flow Debugging T-SQL Intellisense Enhanced Read ahead & scan For Each Enumerations Version Control Support Extended Indexes Property Mappings XML/A Multiple Active Result Sets Full Data Flow Designer SQLCMD Command Line Tool Persisted Computed Columns Full DTS Control Flow Designer Performance Tuning Queuing Support Graphical Presentation of Pkg Execution Profiler Enhancements Immediate Mode and Project Mode Snapshot Isolation Level Profiling Analysis Services Package (Advanced) Deployment Tools Scale Up Partitioning Exportable Showplan Custom Tasks and Transformations VIA support Exportable Deadlock Traces Reporting Services NUMA support Full-text Search Multiple Output Formats Database Failure and Redundancy Indexing of XML Datatype Parameters (Static, Dynamic, Hierarchical) Fail-over Clustering (up to 8 node) Поддержка русского языка Bulk Delivery of Personalized Content Enhanced Multi-instance Support MDAC Support Multiple Data Sources Database Mirroring Side by Side installation Sharepoint Support Database Viewpoints Microsoft Installer base setup Visual Design Tool XML Support for Active Directory Deployment Charting, Sorting, Filtering, Drill-Through XQUERY Support (Server & Mid Tier) SQL Client .NET Data Provider Scheduling, Caching XML Data Manipulation Language Server Cursor Support Complete Scripting Engine FOR XML Enhancements Asynch Scale Out architecture XML Schema (XSD) Support Security XML Report Definition MSXML 6.0 (Native) All Permissions Grantable XQuery Designer Fine Grain Administration Rights Separation of Users and Schema Дополнительная информация Официальная страница SQL Server 2005 http://www.microsoft.com/sql/2005 SQL Server 2005 на MSDN http://msdn.microsoft.com/SQL/2005/default.aspx Российское сообщество по SQL Server http://www.sql.ru Бесплатные E-Learning курсы по SQL Server 2005 (до 1 ноября 2006) http://www.microsoft.com/learning/sql