Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра ПЗ
ЗВІТ
до лабораторної роботи №3
з дисципліни «Бази даних (частина ІІ)»
на тему: «Оптимізація запитів в SQL Server 2008»
Мета: Навчитись підвищувати продуктивність запитів в SQL Server 2008, використовуючи оптимізатор запитів.
Завдання
1.Створити базу даних з наступною архітектурою таблиць:
- Classes (class, type, country, numGuns, bore, displacement)- Ships (name, class, launched)- Battles (name, date)- Outcomes (ship, battle, result)
2.Всі новостворені об’єкти бази даних помістити у наперед створену схему бази даних.
3.Внести відповідні дані у таблиці.
4.Знайти назви кораблів з гарматами калібру 16 дюймів (врахувати кораблі з таблиці Outcomes).
5.Проглянути план виконання запиту.
6.Використовуючи SQL Query Analyzer і SQL Profiler, здійснити оптимізацію запиту.
7.Привести отриманий план запиту.
Хід роботи
1.Створення бази даних і чотирьох таблиць: Classes, Ships, Battles, Outcomes; встановлення зв’язків між ними:
2.Поміщення всіх таблиць у наперед створену схему бази даних Ships, яка задана схемою за замовчуванням для користувача бази даних:
3.Внесення у таблиці відповідних даних:
Таблиця Classes:
Таблиця Ships:
Таблиця Battles:
Таблиця Outcomes:
4.Запит, який повертає назви кораблів з гарматами калібру 16 дюймів з урахуванням кораблів з таблиці Outcomes:
SELECT name FROM Ships.Ships
WHERE class IN (SELECT class FROM Ships.Classes
WHERE bore = 16)
UNION
SELECT ship FROM Ships.Outcomes
WHERE ship IN (SELECT class FROM Ships.Classes
WHERE bore = 16)
Назви кораблів з гарматами калібру 16 дюймів:
5.План виконання запиту:
Додаткові дані про останню вартісну операцію (Union):
6.Створення унікального некластерного індексу, що покриває звернення до таблиці Ships:
CREATE UNIQUE NONCLUSTERED INDEX ShipIndex
ON Ships.Ships(name)
INCLUDE (class)
Створення на базі таблиці Classes віртуальної таблиці з назвами класів з гарматами калібру 16 дюймів та індексу до неї:
CREATE VIEW Ships.ClassBore16
WITH SCHEMABINDING AS
SELECT class AS ShipClass FROM Ships.Classes
WHERE bore = 16
GO
CREATE UNIQUE CLUSTERED INDEX ClassViewIndex
ON Ships.ClassBore16(ShipClass)
GO
Оптимізований запит з використанням створених індексів, вибором з таблиці Outcomes тільки різних значень і заміною найбільш вартісної операції Union операцією Concatenation:
SELECT name AS ShipName FROM Ships.Ships WITH (INDEX = ShipIndex)
WHERE class IN (SELECT ShipClass FROM Ships.ClassBore16 WITH (NOEXPAND))
UNION ALL
SELECT DISTINCT ship AS ShipName FROM Ships.Outcomes
WHERE ship IN (SELECT ShipClass FROM Ships.ClassBore16 WITH (NOEXPAND))
7.План виконання запиту:
Додаткові дані про останню вартісну операцію (Concatenation):
Порівняння виконання початкового і оптимізованого запитів за допомогою трасування в SQL Profiler, а також порівняння 100-кратного виконання цих запитів:
Висновок: На цій лабораторній роботі я навчився підвищувати продуктивність запитів в SQL Server 2008, використовуючи оптимізатор запитів; створив власну базу даних, вніс у неї відповідні дані та здійснив оптимізацію запиту до неї за допомогою SQL Query Analyzer і SQL Profiler.