SlideShare a Scribd company logo
1 of 31
Использование
Microsoft SQL Management Studio
при оптимизации запросов.
• Microsoft Windows Server 2003
• Microsoft SQL Server 2008
• Microsoft SQL Server Management Studio
База данных
Количество записей
• Customers – 10 тыс.
• OrderItems – 500 тыс.
• Products – 200 тыс.
• Orders – 100 тыс.
Ожидаемый план выполнения
Реальный план выполнения
Статистика выполнения запроса
SELECT * FROM [Products] as p
SQL Server Execution Times:
CPU time = 204 ms, elapsed time = 12409 ms.
SELECT p.[ID], p.[Name]
FROM [Products] as p
SQL Server Execution Times:
CPU time = 141 ms, elapsed time = 3547 ms.
SELECT p.[ID], p.[Name] FROM [Products] as p
SELECT p.[ID], p.[Name] FROM [Products] as p
SELECT p.[ID], p.[Name] FROM [Products] as p
SELECT p.[Name], p.[Price]
FROM [Products] AS p
WHERE p.[Price] BETWEEN 10 and 100
SQL Server Execution Times:
CPU time = 62 ms, elapsed time = 21 ms.
(1794 row(s) affected)
Missing index
/*
Missing Index Details from SQLQuery2.sql
The Query Processor estimates that implementing the following index could
improve the query cost by 93.0671%.
*/
/*
USE [demo]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Products] ([Price])
INCLUDE ([Name])
GO
*/
Создаем индекс
USE [demo]
GO
CREATE NONCLUSTERED INDEX [idx_price_name]
ON [dbo].[Products] ([Price])
INCLUDE ([Name])
GO
SELECT p.[Name], p.[Price]
FROM [Products] AS p
WHERE p.[Price] BETWEEN 10 and 100
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 13 ms.
(1794 row(s) affected)
SELECT DISTINCT
с.[ID], c.[FirstName], c.[LastName]
FROM [OrderItems] AS oi
LEFT JOIN [Orders] AS o
ON o.[ID] = oi.[OrderId]
LEFT JOIN [Customers] AS c
ON o.[CustomerId] = c.[ID]
WHERE oi.[ProductID] = 123
Ожидаемый план
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 45 ms.
Создаем индекс
USE [demo]
GO
CREATE NONCLUSTERED INDEX [idx_ProductId]
ON [dbo].[OrderItems] ([ProductId])
INCLUDE ([OrderId])
GO
Ожидаемый план
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
SELECT DISTINCT с.[ID], c.[FirstName], c.[LastName]
FROM [OrderItems] AS oi
LEFT JOIN [Orders] AS o ON o.[ID] = oi.[OrderId]
LEFT JOIN [Customers] AS c ON o.[CustomerId] = c.[ID]
WHERE oi.[ProductID] = 123
Без индекса по ProductId:
C индексом:
SQL Server Execution Times:
CPU time = 47 ms, elapsed time = 45 ms.
(3 row(s) affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 2 ms.
(3 row(s) affected)
SELECT DISTINCT
c.[ID], c.[FirstName], c.[LastName]
FROM [Customers] as c
JOIN Orders as o on o.[CustomerId] = c.[ID]
WHERE o.[Date] >= '12.01.2000'
AND o.[Date]< '01.01.2001'
Ожидаемый план
/*
Missing Index Details from SQLQuery5.sql
The Query Processor estimates that implementing the following
index could improve the query cost by 67.9358%.
*/
/*
USE [demo]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index,
sysname,>]
ON [dbo].[Orders] ([Date])
INCLUDE ([CustomerId])
GO
*/
USE [demo]
GO
CREATE NONCLUSTERED INDEX [idx_Date]
ON [dbo].[Orders] ([Date])
INCLUDE ([CustomerId])
GO
С индексом:
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 13 ms.
(843 row(s) affected)
Без индекса:
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 81 ms.
(843 row(s) affected)
SELECT DISTINCT p.[ID], p.[Name]
FROM [Products] AS p
JOIN [OrderItems] AS oi ON oi.[ProductId]=p.[ID]
JOIN [Orders] as o on o.[ID] = oi.[OrderId]
WHERE o.[Date] >= '12.01.2000'
AND o.[Date]< '01.01.2001'
AND p.Price BETWEEN 50 and 100
План выполнения
SQL Server Execution Times:
CPU time = 16 ms, elapsed time = 14 ms.
(30 row(s) affected)
SELECT DISTINCT p.[ID], p.[Name]
FROM [Products] AS p
JOIN [OrderItems] AS oi ON oi.[ProductId]=p.[ID]
JOIN [Orders] as o on o.[ID] = oi.[OrderId]
WHERE o.[Date] >= '12.01.2000'
AND o.[Date]< '01.01.2001'
План выполнения
SQL Server Execution Times:
CPU time = 329 ms, elapsed time = 243 ms.
(4305 row(s) affected)
Ссылки
http://msdn.microsoft.com/ru-ru/library/ms191227(v=SQL.100).aspx
(Анализ запроса)
http://msdn.microsoft.com/en-us/library/ms191426(v=SQL.100).aspx
(Advanced Query Tuning Concepts)
http://msdn.microsoft.com/ru-ru/library/ms178071(v=SQL.100).aspx
(Графическое отображение планов выполнения)
http://msdn.microsoft.com/en-us/library/ms178071(v=SQL.100).aspx
(Displaying Graphical Execution Plans)
http://www.red-gate.com/products/sql_data_generator/index.htm
(SQL Data Generator)
http://blog.sqlauthority.com

More Related Content

Similar to Mssql opt

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksMYXPLAIN
 
Migration from mysql to elasticsearch
Migration from mysql to elasticsearchMigration from mysql to elasticsearch
Migration from mysql to elasticsearchRyosuke Nakamura
 
Predix 따라하기 2
Predix 따라하기 2Predix 따라하기 2
Predix 따라하기 2HeeJung Park
 
SQL Server 2000 Research Series - Transact SQL
SQL Server 2000 Research Series - Transact SQLSQL Server 2000 Research Series - Transact SQL
SQL Server 2000 Research Series - Transact SQLJerry Yang
 
MSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMarc Obaldo
 
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...Jürgen Ambrosi
 
Writing efficient sql
Writing efficient sqlWriting efficient sql
Writing efficient sqlj9soto
 
Database Development Replication Security Maintenance Report
Database Development Replication Security Maintenance ReportDatabase Development Replication Security Maintenance Report
Database Development Replication Security Maintenance Reportnyin27
 
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsZohar Elkayam
 
How to teach an elephant to rock'n'roll
How to teach an elephant to rock'n'rollHow to teach an elephant to rock'n'roll
How to teach an elephant to rock'n'rollPGConf APAC
 
SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?Andrej Pashchenko
 
EvolveExecutionPlans.pdf
EvolveExecutionPlans.pdfEvolveExecutionPlans.pdf
EvolveExecutionPlans.pdfPraveenPolu1
 
Finding SQL execution outliers
Finding SQL execution outliersFinding SQL execution outliers
Finding SQL execution outliersMaxym Kharchenko
 
Enhancements that will make your sql database roar sp1 edition sql bits 2017
Enhancements that will make your sql database roar sp1 edition sql bits 2017Enhancements that will make your sql database roar sp1 edition sql bits 2017
Enhancements that will make your sql database roar sp1 edition sql bits 2017Bob Ward
 
Incremental View Maintenance with Coral, DBT, and Iceberg
Incremental View Maintenance with Coral, DBT, and IcebergIncremental View Maintenance with Coral, DBT, and Iceberg
Incremental View Maintenance with Coral, DBT, and IcebergWalaa Eldin Moustafa
 

Similar to Mssql opt (20)

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New Tricks
 
Migration from mysql to elasticsearch
Migration from mysql to elasticsearchMigration from mysql to elasticsearch
Migration from mysql to elasticsearch
 
query_tuning.pdf
query_tuning.pdfquery_tuning.pdf
query_tuning.pdf
 
Predix 따라하기 2
Predix 따라하기 2Predix 따라하기 2
Predix 따라하기 2
 
Stored procedure
Stored procedureStored procedure
Stored procedure
 
SQL Server 2000 Research Series - Transact SQL
SQL Server 2000 Research Series - Transact SQLSQL Server 2000 Research Series - Transact SQL
SQL Server 2000 Research Series - Transact SQL
 
MSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance AppsMSFT Dumaguete 061616 - Building High Performance Apps
MSFT Dumaguete 061616 - Building High Performance Apps
 
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...
2° Ciclo Microsoft CRUI 3° Sessione: l'evoluzione delle piattaforme tecnologi...
 
Stored procedures
Stored proceduresStored procedures
Stored procedures
 
Oracle SQL Tuning
Oracle SQL TuningOracle SQL Tuning
Oracle SQL Tuning
 
Writing efficient sql
Writing efficient sqlWriting efficient sql
Writing efficient sql
 
Database Development Replication Security Maintenance Report
Database Development Replication Security Maintenance ReportDatabase Development Replication Security Maintenance Report
Database Development Replication Security Maintenance Report
 
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
 
How to teach an elephant to rock'n'roll
How to teach an elephant to rock'n'rollHow to teach an elephant to rock'n'roll
How to teach an elephant to rock'n'roll
 
SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?
 
Master tuning
Master   tuningMaster   tuning
Master tuning
 
EvolveExecutionPlans.pdf
EvolveExecutionPlans.pdfEvolveExecutionPlans.pdf
EvolveExecutionPlans.pdf
 
Finding SQL execution outliers
Finding SQL execution outliersFinding SQL execution outliers
Finding SQL execution outliers
 
Enhancements that will make your sql database roar sp1 edition sql bits 2017
Enhancements that will make your sql database roar sp1 edition sql bits 2017Enhancements that will make your sql database roar sp1 edition sql bits 2017
Enhancements that will make your sql database roar sp1 edition sql bits 2017
 
Incremental View Maintenance with Coral, DBT, and Iceberg
Incremental View Maintenance with Coral, DBT, and IcebergIncremental View Maintenance with Coral, DBT, and Iceberg
Incremental View Maintenance with Coral, DBT, and Iceberg
 

More from MageCloud

How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...MageCloud
 
First Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsFirst Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsMageCloud
 
Optimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceOptimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceMageCloud
 
Cloud Based Business Application Development
Cloud Based Business Application DevelopmentCloud Based Business Application Development
Cloud Based Business Application DevelopmentMageCloud
 
Three keys to successful banner ads
Three keys to successful banner adsThree keys to successful banner ads
Three keys to successful banner adsMageCloud
 
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesTwo Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesMageCloud
 
Yii development
Yii developmentYii development
Yii developmentMageCloud
 
Security testing
Security testingSecurity testing
Security testingMageCloud
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircleMageCloud
 
Management of projects
Management of projectsManagement of projects
Management of projectsMageCloud
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerceMageCloud
 
Dotnet development
Dotnet developmentDotnet development
Dotnet developmentMageCloud
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_teamMageCloud
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationMageCloud
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimizationMageCloud
 
Automated testing
Automated testingAutomated testing
Automated testingMageCloud
 

More from MageCloud (20)

How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...How to find the Right Mobile and Cloud Application Development Company for Yo...
How to find the Right Mobile and Cloud Application Development Company for Yo...
 
First Steps to Mobile Sites and Apps
First Steps to Mobile Sites and AppsFirst Steps to Mobile Sites and Apps
First Steps to Mobile Sites and Apps
 
Optimizing Magento for Peak Performance
Optimizing Magento for Peak PerformanceOptimizing Magento for Peak Performance
Optimizing Magento for Peak Performance
 
Cloud Based Business Application Development
Cloud Based Business Application DevelopmentCloud Based Business Application Development
Cloud Based Business Application Development
 
Three keys to successful banner ads
Three keys to successful banner adsThree keys to successful banner ads
Three keys to successful banner ads
 
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best PracticesTwo Facets of Great e-Commerce: PPC and Landing Page Best Practices
Two Facets of Great e-Commerce: PPC and Landing Page Best Practices
 
Yii development
Yii developmentYii development
Yii development
 
Testing
TestingTesting
Testing
 
Security testing
Security testingSecurity testing
Security testing
 
Project lifecircle
Project lifecircleProject lifecircle
Project lifecircle
 
Management of projects
Management of projectsManagement of projects
Management of projects
 
Magento ecommerce
Magento ecommerceMagento ecommerce
Magento ecommerce
 
Graphics
GraphicsGraphics
Graphics
 
Dotnet development
Dotnet developmentDotnet development
Dotnet development
 
Corporate structure project_team
Corporate structure project_teamCorporate structure project_team
Corporate structure project_team
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
Clientside optimization
Clientside optimizationClientside optimization
Clientside optimization
 
Automated testing
Automated testingAutomated testing
Automated testing
 
Amazon
AmazonAmazon
Amazon
 
Agile
AgileAgile
Agile
 

Mssql opt

Editor's Notes

  1. Ядро SQL Server Database Engine может показывать, каким образом оно переходит к таблицам и использует индексы для доступа к данным или их обработки для запроса или другой инструкции DM, например для обновления. Это называется выводом плана выполнения. Для проведения анализа медленно выполняемого запроса полезно изучить план выполнения запроса, чтобы определить причину проблемы.
  2. База наполнялась фиктивными данными с помощью программы SQL Data Generator от компании Red Gate (http://www.red-gate.com/products/sql_data_generator/index.htm)
  3. Обратить внимание на использование статистики для базы данных Статистика используется оптимизатором запросов для построения наиболее эффективного плана выполнения запроса В нашем случае статистика будет отключена.
  4. Ожидаемый план выполнения показывается сразу же. Реальный план выполнения – только после завершения выполнения запроса.
  5. Замечания: - Стараться избегать подобных запросов, т.е. Выбирать те данные которые действительно необходимы в каждом конкретном случае.
  6. Каждый узел древовидной структуры представлен в виде значка, указывающего логический и физический оператор, используемый для выполнения этой части запроса или инструкции. Каждый узел связан со своим родительским узлом. Дочерние узлы одного родительского узла отображаются в одном столбце. Однако все узлы в одном столбце не обязательно имеют общий родительский узел. Правила со стрелками на конце соединяют каждый узел с его родителем. Операторы показаны в виде символов, связанных с определенным родительским узлом. Ширина стрелки пропорциональна количеству строк. Если имеются данные о фактическом количестве строк, используются эти данные. В противном случае используется ориентировочное количество строк. Если запрос содержит несколько инструкций, показывается несколько планов выполнения запроса.
  7. Для графического представления плана выполнения запроса студия использует SHOWPLAN_XML Оператор Clustered Index Scan сканирует кластеризованный индекс, заданный в столбце Аргумент плана выполнения запроса. При наличии необязательного предиката WHERE:(), возвращаются только строки, удовлетворяющие предикату. Если столбец Argument содержит предложение ORDERED, обработчик запросов требует, чтобы выходные данные строк были возвращены в порядке, в соответствии с которым они были отсортированы в кластеризованном индексе. Если предложение ORDERED отсутствует, подсистема хранилища выполняет поиск в индексе оптимальным способом, без обязательной сортировки выходных данных. Clustered Index Scan является логическим и физическим оператором.
  8. Студия предлагает создать индекс Нажимаем правую клавишу мыши и выбираем «Missing Index Details…»
  9. Полный текст предложения о создании индекса
  10. Создаем рекомендованный индекс с именем idx_price_name С дополнительным полем Name
  11. Index Seek – наиболее благоприятный вариант при выборке данных Оператор Clustered Index Seek использует поисковые возможности индексов для получения строк из кластеризованного индекса. Столбец Аргумент содержит имя используемого кластеризованного индекса и предикат SEEK:() SEEK:(). Подсистема хранилища использует индекс для обработки только тех строк, которые удовлетворяют данному предикату SEEK:(). SEEK:(). Он также может содержать предикат WHERE:(), который подсистема хранилища применяет для всех строк, которые удовлетворяют предикату SEEK:(), но предикат WHERE:() необязателен и не использует индексы для завершения процесса. OBJECT:([demo].[dbo].[Products].[idx_price_name] AS [p]), SEEK:([p].[Price] >= CONVERT_IMPLICIT(decimal(18,2),[@1],0) AND [p].[Price] <= CONVERT_IMPLICIT(decimal(18,2),[@2],0)) ORDERED FORWARD
  12. Подробная информация по плану выполнения запроса
  13. Немного «усложненный» запрос. Суть его в следующем: «Выбираем всех потребителей, которые приобрели конкретный продукт.»
  14. Выполним запрос, для того чтобы постореть на временные затраты У каждой операции есть свой вес(%) Оператор Hash Match строит хэш-таблицу при помощи вычисления хэш-значения для каждой строки из своих входных данных. Предикат HASH:() со списком столбцов, использованных для создания хэш-значения, отображается в столбце Argument. Затем для каждой тестовой строки (если возможно) он вычисляет хэш-значение (с использованием той же хэш-функции) и осуществляет поиск совпадений по хэш-таблице. Если наличествует остаточный предикат (определенный посредством RESIDUAL:() в столбце Argument), строки должны удовлетворять также и этому предикату, чтобы рассматриваться в качестве совпадающих.  Оператор Merge Join выполняет внутреннее соединение, левое внешнее соединение, левое полусоединение, левое антиполусоединение, правое внешнее соединение, правое полусоединение, правое антиполусоединение, а также логические операции соединения. Студия рекомендует создать индекс.
  15. Создаем рекомендованный индекс с именем idx_ProductId OrderId помещаем в дополнительное поле
  16. Проверяем ожидаемый план выполнения запроса после создания рекомендованного индекса Мы видим, что план выполнения радикально изменился Сканирование индекса заменилось на поиск по индексу (стоимость/вес операции стал 11%) Соеденения с помощью хеширования заменено на соединение с помощью Вложенных циклов Оператор Nested Loops выполняет логические операции внутреннего соединения, левого внешнего соединения, левого полусоединения и антилевого полусоединения. Соединения вложенных циклов выполняют поиск во внутренней таблице для каждой строки внешней таблицы, обычно используя индекс. Опираясь на предполагаемые затраты, сервер Microsoft SQL Server решает вопрос о необходимости сортировки внешней таблицы, чтобы улучшить район поиска по индексу во внутренней таблице. В большинстве случаев Nested Loops предпочтительнее, чем Hash Match Помотрим, каковы временные затраты на выполнение запроса
  17. Еще один схожий запрос – Ищем клиентов, которые купили что-нибудь в декабре 2000 г.
  18. Мы снова видим рекомендации по созданию индекса
  19. Создаем рекомендуемый индекс И опять выполняем запрос
  20. IndexScan с весом в 68% заменился на IndexSeek с долей 6% Сравним выполнение запроса с индексом и без него
  21. Совсем коротко о том, как меняется план выполнения в зависимости от условия Сначала выполним поск товаров купленных в декабре 2000г в ценовом диапазоне от 50 до 100 денежных единиц
  22. Убираем ценовое ограничение
  23. Мы видим, что план запроса изменился радикально. Над операторами, выполняющимися параллельно, отображается значок параллельного процесса. И нет никаких рекомендаций по индексам. Также следует обратить внимание на толщину стрелок, соединяющих пиктограммы процессов Время выполнения увеличилось также радикально.
  24. Pinalkumar Dave is a Microsoft SQL Server MVP and a Mentor for Solid Quality India. He has written over 1300 articles on the subject on his blog athttp://blog.sqlauthority.com.  В заключение надо сказать, что индексами надо пользоваться весьма умеренно. Индексы замедляют вставку записей, их периодически необходимо дефрагментировать, проверять целосность... Бывают случаи (довольно редко), когда приходится в запросе указывать какой именно индекс надо использовать при построении плана запроса.