:
- Транзакція 1 - Крок 1
expert_dbTRANSACTIONOrders SET Mass= 1 000 WHERE ID= 1 008
Створимо в редакторі запитів друге вікно і помістимо в нього наступний код:
- Транзакція 2 - Крок 2
expert_dbTRANSACTIONTransport SET MaxDistance= тисяча WHERE ID= 1 Orders SET Distance= 100 WHERE ID= 1 008 TRANSACTION
Друга транзакція очікує зняття блокування на рядок 1 018 в таблиці Orders.
Повернемося в перше вікно, додамо наступний код і запустимо запит.
- Транзакція 1 - Крок 3
Transport SET InRepair= 1 WHERE ID= 1 TRANSACTION
Транзакція 2 ще не завершена, оскільки очікує зняття блокування, тому все ще блокує рядок 1 в таблиці Transport. Транзакція 1 звертається до цієї рядку, продовжуючи блокувати дані. Таким чином 2 транзакції заблокували виконання один одного. Через короткий проміжок часу SQL Server виявить взаємоблокування і автоматично усуне її (малюнок 9).
Рисунок 9 - Створення взаимоблокировки
7. Масштабування розподілених баз даних
7.1 Створення функції поділу
Для зручності звернення до великим обсягам даних, розділимо таблицю Orders на 3 великі частини: замовлення до 2006 року, з 2006 по 2011 роки і після 2011 року. Для цього звернемося до функції поділу. Під функцією поділу розуміється механізм визначення меж розділів. Наступний код розбиває таблицю по стовпцю дати на 3 частини, використовуючи ліву межу, це означає, що діапазон дат входить в розділ до кордону, не включаючи саму кордон:
expert_dbPARTITION FUNCTION fnyears (Date) RANGE LEFT FOR VALUES
( 31/12/2005 , 31/12/2010 );
. 2 Створення схеми поділу
Щоб використовувати створену функцію поділу, застосуємо в таблиці схему поділу. Схема поділу дозволяє розмістити дані в одній або декількох файлових групах. Так як за замовчуванням в базі існує одна файлова група, додамо ще 3 для таблиці Orders. Наступний код додає 3 файлові групи з одним файлом даних у кожній:
expert_db; DATABASE expert_dbFILEGROUP test1fg; DATABASE expert_dbFILEGROUP test2fg; DATABASE expert_dbFILEGROUP test3fg; DATABASE expert_dbFILE
(= test1dat1,= C: Program Files Microsoft SQL Server MSSQL11.MSSQLSERVER MSSQL DATAt1dat1.ndf ,=5MB,=100MB,=5MB
) FILEGROUP test1fg; DATABASE expert_dbFILE
(= test2dat2,= C: Program Files Microsoft SQL Server MSSQL11.MSSQLSERVER MSSQL DATA t2dat2.ndf ,=5MB,=100MB,=5MB
) FILEGROUP test2fg; DATABASE expert_dbFILE
(= test3dat3,= C: Program Files Microsoft SQL Server MSSQL11.MSSQLSERVER MSSQL DATA t3dat3.ndf ,=5MB,=100MB,=5MB
)
TO FILEGROUP test3fg;
GO
Тепер можна створити схему поділу. Наступний код створює схему поділу, поміщаючи дані в файлові групи:
PARTITION SCHEME psYears AS PARTITION fnyears TO (test1fg, test2fg, test3fg);
7.3 Створення розділених індексів
Для швидкого звернення до даних, створимо кластерізованний індекс в таблиці Orders. При створенні первинного ключа на ранніх етапах проектування поле ID вже містила кластерізованний індекс, поетом зробимо його некластерізованний, оскільки кластерізованний індекс може бути тільки один. Для цього в проекті таблиці натиснути ПКМ на первинному ключі, вибрати Індекси та ключі raquo ;, в поле Створив?? ь як кластерізованний вибрати значення немає (малюнок 10).
Рисунок 10 - Зміна індексу
Тепер можна створити кластерізованний індекс. Наступний код виконує цю дію:
clustered INDEX Order_ID ON Orders (ID, Date) ON psYearsAll (Date);
8. Оптимізація розподілених запитів
8.1 План виконання запитів
План виконання запитів дозволяє оцінити витрати на виконання конкретного запиту. Це не тільки інформація у вигляді піктограм, але ще й великі таблиці з даними про запит по клацанню миші. На малюнку 11 представлено план виконання запиту. Для виклику плану виконання запиту в редакторі запитів після введення необхідного коду натиснути на кнопку Показати передбачуваний план виконання в панелі інструментів, або в меню Запит .
Малюнок 11 - П...