Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у...

25
Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM? Денис Резник Intapp, Inc.

Transcript of Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у...

Page 1: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?Денис РезникIntapp, Inc.

Page 2: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Agenda • .Net ORM History which I remember• Simple Queries• Column List• Lazy Load• Data Types• Data Modification• Complex Query• Parameter Sniffing

Page 3: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

ORM History which I remember • ADO.NET• Data Sets (not too bad)• LLBL Gen, NHibernate (better than data sets)• LINQ to SQL (Awesome!)• Entity Framework should be even more awesome• Entity Framework is more powerful than L2S• Entity Framework Code First• Entity Framework is no so good, so what?

Page 4: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Simple Query

Page 5: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Simple Query

Page 6: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Column List

Page 7: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Column List

Page 8: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Lazy Load

Page 9: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

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 UsersWHERE Id = 523

Page 10: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

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

Page 11: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Index Range Scan

1 .. 1M

1 .. 2K 2K+1 .. 4K 1M-2K .. 1M

1 .. 300 301 .. 800 801 .. 1,5K 1,5K+1 .. 2K

SELECT * FROM UsersWHERE Id BETWEEN 700 AND 1700

Page 12: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Lazy Load

Page 13: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Data Types

Page 14: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Data Types

Page 15: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Data Modification

Page 16: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Data Modification

Page 17: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Complex Query

Page 18: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Complex Query

Page 19: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Parameter Sniffing

Page 20: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Parameter Sniffing - Stored Procedure

EXEC ReportCheckSecurityRequest @UserId = 1

Query Processor

SQL Server Cache

Procedure cachePlan created and cached for the @UserId = 1

Procedure cache

EXEC ReportCheckSecurityRequest @UserId = 22

Query executes using the query plan created for @UserId = 1

Page 21: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Parameter Sniffing – Parametrized Query

SELECT * FROM Clients WHERE Id = @Id

Query Processor

SQL Server Cache

Procedure cachePlan created and cached for the @Id = 1

Procedure cacheQuery executes using the query plan created for @Id = 1

SELECT * FROM Clients WHERE Id = @Idsp_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

Page 22: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Dynamic SQL – Multiple Plans

SELECT * FROM Clients WHERE Id = 1

Query Processor

SQL Server Cache

Procedure cacheNew 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

Page 23: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

DEMO: Parameter Sniffing

Page 24: Денис Резник "Зачем мне знать SQL и Базы Данных, ведь у меня есть ORM?"

Summary • ORM is really a nice thing• But it still requires strong SQL background• Database internals knowledge is a skill that very

nice to have even in the ORM world• Few Advices

• Sometimes check the generated SQL and its query plan• For complex queries consider raw SQL anyway• Consider using Dapper• Invest your time to learn database internals