110 lines
2.9 KiB
Markdown
110 lines
2.9 KiB
Markdown
Optymalizator zapytań
|
|
|
|
1. informacja o optymalzatorze
|
|
select * from sys.dm_exec_query_optimizer_info
|
|
|
|
!! Pamiętajmy o czyszczeniu cache przed uruchomieniem zapytań żeby mieć pewność że zapytanie zostanie zoptymalizowane.
|
|
|
|
2. Zebranie informacji o optymalizacji
|
|
|
|
-- optymalizacja tych zapytań teraz,
|
|
-- aby nie zaburzały zebranych danych
|
|
GO
|
|
SELECT *
|
|
INTO after_query_optimizer_info
|
|
FROM sys.dm_exec_query_optimizer_info
|
|
GO
|
|
SELECT *
|
|
INTO before_query_optimizer_info
|
|
FROM sys.dm_exec_query_optimizer_info
|
|
GO
|
|
DROP TABLE before_query_optimizer_info
|
|
DROP TABLE after_query_optimizer_info
|
|
GO
|
|
-- rozpoczęcie właściwego wykonywania
|
|
GO
|
|
SELECT *
|
|
INTO before_query_optimizer_info
|
|
FROM sys.dm_exec_query_optimizer_info
|
|
GO
|
|
-- tutaj wstaw swoje zapytanie
|
|
SELECT *
|
|
FROM Person.Address
|
|
-- zachowaj poniższe, aby wymusić nową optymalizację
|
|
OPTION (RECOMPILE)
|
|
GO
|
|
SELECT *
|
|
INTO after_query_optimizer_info
|
|
FROM sys.dm_exec_query_optimizer_info
|
|
GO
|
|
SELECT a.counter,
|
|
(a.occurrence - b.occurrence) AS occurrence,
|
|
(a.occurrence * a.value - b.occurrence *
|
|
b.value) AS value
|
|
FROM before_query_optimizer_info b
|
|
JOIN after_query_optimizer_info a
|
|
ON b.counter = a.counter
|
|
WHERE b.occurrence <> a.occurrence
|
|
DROP TABLE before_query_optimizer_info
|
|
DROP TABLE after_query_optimizer_info
|
|
|
|
3. Liczba transformacji zapytania
|
|
|
|
-- optymalizacja tych zapytań teraz,
|
|
-- aby nie zaburzały zebranych danych
|
|
GO
|
|
SELECT *
|
|
INTO before_query_transformation_stats
|
|
FROM sys.dm_exec_query_transformation_stats
|
|
GO
|
|
SELECT *
|
|
INTO after_query_transformation_stats
|
|
FROM sys.dm_exec_query_transformation_stats
|
|
GO
|
|
DROP TABLE after_query_transformation_stats
|
|
DROP TABLE before_query_transformation_stats
|
|
-- rozpoczęcie właściwego wykonywania
|
|
GO
|
|
SELECT *
|
|
INTO before_query_transformation_stats
|
|
FROM sys.dm_exec_query_transformation_stats
|
|
GO
|
|
-- tutaj wstaw swoje zapytanie
|
|
SELECT * FROM Sales.SalesOrderDetail
|
|
WHERE SalesOrderID = 43659
|
|
-- zachowaj poniższe, aby wymusić nową optymalizację
|
|
OPTION (RECOMPILE)
|
|
GO
|
|
SELECT *
|
|
INTO after_query_transformation_stats
|
|
FROM sys.dm_exec_query_transformation_stats
|
|
GO
|
|
SELECT a.name, (a.promised - b.promised) as promised
|
|
FROM before_query_transformation_stats b
|
|
JOIN after_query_transformation_stats a
|
|
ON b.name = a.name
|
|
WHERE b.succeeded <> a.succeeded
|
|
DROP TABLE before_query_transformation_stats
|
|
DROP TABLE after_query_transformation_stats
|
|
|
|
4. Statystyki
|
|
|
|
- Możesz wykorzystać nieudokumentowane flagi 9292 i 9204 do wyświetlenia
|
|
informacji o statystykach załadowanych podczas procesu optymalizacji. Uruchom
|
|
zapytanie:
|
|
|
|
|
|
OPTION (RECOMPILE, QUERYTRACEON 9292, QUERYTRACEON 9204)
|
|
|
|
|
|
- Flagi 9292 można użyć do wyświetlenia obiektów statystyk uważanych za interesujące.
|
|
Uruchom poniższe zapytanie:
|
|
|
|
OPTION (RECOMPILE, QUERYTRACEON 9292)
|
|
|
|
- Flagi 9204 można użyć do wyświetlenia obiektów statystyk, które zostały wykorzystane
|
|
podczas szacowania kardynalności
|
|
|
|
OPTION (RECOMPILE, QUERYTRACEON 9204)
|
|
|