Architecting Scalable, Flexible and Secure Database Systems

Download Report

Transcript Architecting Scalable, Flexible and Secure Database Systems

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