Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

.NET Fest 2017. Денис Резник. Исполнение Запроса в SQL Server. Ожидание - Реальность

394 views

Published on

Наверняка тема вам уже знакома в той или иной мере. Согласитесь, так бывает, что запуская запрос мы ожидаем чего-то определённого, а получаем нечто иное. Меняем опцию чтобы запрос выполнялся быстрее, а он начинает тормозить. Ожидаем что запрос выполнится (в принципе), а он висит вечно, или даже не начинает выполняться. Ожидаем что запрос будет искать данные по индексу, а он сваливается в Full Scan.
В этом докладе мы рассмотрим ряд таких непонятных, на первый взгляд, ситуаций и заглянем под капот SQL Server чтобы разобраться как это работает и почему ожидания не совпадают с реальностью.

Published in: Education
  • Be the first to comment

  • Be the first to like this

.NET Fest 2017. Денис Резник. Исполнение Запроса в SQL Server. Ожидание - Реальность

  1. 1. Киев 2017 Только реальные кейсы. Только актуальные тренды. SQL Server Execution Expectation - Reality Денис Резник
  2. 2. Киев 2017 About me • Denis Reznik • Kyiv, Ukraine • Data Architect at Intapp, Inc. • Microsoft Data Platform MVP • Co-Founder Ukrainian Data Community • PASS Regional Mentor, Central, and Eastern Europe • Author of “SQL Server MVP Deep Dives 2” Chapter 19 2 |
  3. 3. Киев 2017 Agenda • Expectation - Reality 1 • Expectation - Reality 2 • Expectation - Reality 3 • Expectation - Reality 4
  4. 4. Parameter Sniffing Expectation - Reality 1
  5. 5. Киев 2017 EXEC ReportCheckSecurityRequest @UserId = 1 Query Processor SQL Server Cache Procedure cache Plan created and cached for the @UserId = 1 Procedure cache EXEC ReportCheckSecurityRequest @UserId = 22 Query executes using the query plan created for @UserId = 1 Parameter Sniffing - Stored Procedure
  6. 6. Киев 2017 SELECT * FROM Clients WHERE Id = @Id Query Processor SQL Server Cache Procedure cache Plan created and cached for the @Id = 1 Procedure cache Query executes using the query plan created for @Id = 1 SELECT * FROM Clients WHERE Id = @Id sp_executesql N'SELECT * FROM Clients WHERE Id = @Id', N'@Id int', 1 sp_executesql N'SELECT * FROM Clients WHERE Id = @Id', N'@Id int', 22 Parameter Sniffing – Parametrized Query
  7. 7. Киев 2017 SELECT * FROM Clients WHERE Id = 1 Query Processor SQL Server Cache Procedure cache New query plan created and cached. Query executed using newly created plan. Procedure cache SELECT * FROM Clients WHERE Id = 22 New query plan again created and cached. Query executed using newly created plan. SELECT * FROM Clients WHERE Id = 1 Query executed using the query plan, created for the first query. Procedure cache Dynamic SQL – Multiple Plans
  8. 8. Index Seek … … 1 .. 1M 1 .. 2K 2K+1 .. 4K 1M-2K .. 1M 1 .. 300 301 .. 800 801 .. 1,5K 1,5K+1 .. 2K SELECT * FROM Users WHERE Id = 523
  9. 9. Index Scan … … 1 .. 1M 1 .. 2K 2K+1 .. 4K 1M-2K .. 1M 1 .. 300 301 .. 800 801 .. 1,5K 1,5K+1 .. 2K SELECT * FROM Users
  10. 10. DEMO Parameter Sniffing
  11. 11. Cardinality Estimation Expectation - Reality 2
  12. 12. Киев 2017 500 1000 10 1200 800 1 800 2000 2800 4500 5400 SELECT * FROM Users WHERE Id BETWEEN 2100 AND 2500Statistics SELECT * FROM Users WHERE Id BETWEEN 10 AND 5300
  13. 13. Киев 2017 500 1000 10 1200 800 1 800 2000 2800 4500 5400 Statistics SELECT * FROM Users u INNER JOIN Posts p ON u.Id = p.OwnerUserId WHERE u.DisplayName LIKE 'Jeff%' 10600 20000 10 1200 800 A G L S T ZZZZ Users Posts
  14. 14. DEMO Cardinality Estimation
  15. 15. Deadlocks Expectation - Reality 3
  16. 16. Киев 2017 Lock Types - Shared S S X
  17. 17. Киев 2017 Lock Types - Exclusive X X S
  18. 18. Киев 2017 Lock Types - Update U U s SX UX UX
  19. 19. Киев 2017 ID City 1 Kyiv 2 Kharkiv 3 Dnipropetrovsk BEGIN TRAN UPDATE Users SET CityId = 2 WHERE Id = 4 UPDATE City SET Name = 'Dnipro' WHERE Id = 3 ID User City_Id 1 John Smith 2 2 Dale Cooper 2 3 Oliver Thompson 2 4 John Dow 3X BEGIN TRAN UPDATE City SET Name = 'Dnipro' WHERE Id = 3 UPDATE Users SET CityId = 2 WHERE Id = 4 X DEADLOCK! Classic Deadlock
  20. 20. DEMO Deadlocks
  21. 21. Query Optimization Expectation - Reality 4
  22. 22. Киев 2017 Query Processing Parser Procedure Cache Algebraizer Optimizer Executor
  23. 23. Киев 2017 Optimizer Phase 2 (Last Phase) Full Set of Optimization Rules Returns Full Query Plan • All planned checks were done • Good Enough Plan was Found • Timeout • Not Enough Memory Optimization
  24. 24. DEMO Query Optimization
  25. 25. Киев 2017 Summary • Parameter Sniffing • Slow in Application. Fast in SSMS. • Cardinality Estimation • SQL Server Version Upgrade • Deadlocks • Non-Detectable Deadlocks • Query Optimization • Query Optimization Timeout
  26. 26. Киев 2017 Thank You! Denis Reznik Twitter: @denisreznik Email: denisreznik@gmail.com Blog: http://reznik.uneta.com.ua Facebook: https://www.facebook.com/denis.reznik.5 LinkedIn: http://ua.linkedin.com/pub/denis-reznik/3/502/234

×