May 17, 2026, 11:40 PM
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user