This session talks all about SQL Server Query Parameterization. Covers various topics like Query Tuning, Adhoc Query, Execution Plan, Query Optimizer, Parameter Sniffing, Indexes etc. etc.
3. Adhoc Query
q
Any non-parameterized queries are called addhoc queries.
For example :
q
SELECT MsgID, Severity FROM SqlMessage WHERE MsgID = 100
q
In sql server if we execute a sql query it goes through two
steps just like any other programming languages:
q
Compilation
q
Execution
4. Properties Of Addhoc Queries
q
Case sensitive
q
Space sensitive
q
Parameter sensitive
q
Sql server treats two same sql queries of different parameters
as a two different sql statements. For example:
q
SELECT MsgID, Severity FROM SqlMessage WHERE MsgID = 1
q
SELECT MsgID, Severity FROM SqlMessage WHERE MsgID = 2
5. Effect Of Faulty C# Code
Sql server has took extra n * (Compilation time) ms to display
records
Extra time to insert records in cached plans.
Sql server has to frequently fire a job to delete the cached plan
since it will reach the max limit very soon.
It will not only decrease the performance of this sql query but all sql
queries of other applications since this faulty code will force to
delete cached query plans of other sql statements.
6. Predicates Order
q
Does order of predicates matters in WHERE clause?
q
WHERE vcLanguage = 'English' AND ntAge = 12
q
WHERE ntAge = 12 AND vcLanguage = 'English'
9. Query Optimizer
The query optimizer in SQL Server is cost-based. It includes:
q
Cost for using different resources (CPU and IO)
q
Total execution time
It determines the cost by using:
Cardinality: The total number of rows processed at each level of a
query plan with the help of histograms , predicates and constraint
Cost model of the algorithm: To perform various operations like
sorting, searching, comparisons etc.
10. Parameter Sniffing
Sql server generates execution paln according to the first
parameter
This execution plan may bad for other parameters.
Solution:
Create multiples stored procedures.
Use optimizer for query hints.
11. What Is An Index ?
q
Index is a way to organize data to make searching, sorting
and grouping faster.
q
we need indexing when :
q
WHERE, ON, HAVING clause (Searching)
q
ORDER BY clause (Sorting)
q
GROUP BY clause (Grouping) etc.
12. Table Scan
SELECT * FROM Student WHERE RollNo = 111
Time complexity of table scan is : O(n)
RollNo
Name
Country
Age
101
Greg
UK
23
102
Sachin
India
21
103
Akaram
Pakistan
22
107
Miyabi
China
18
108
Marry
Russia
27
109
Scott
USA
31
110
Benazir
Banglades
17
111
Miyabi
Japan
24
112
Rahul
India
27
113
Nicolus
France
19
13. Types Of Index
q
Table without any index is called Heap
q
There are two type of index:
q
Clustered index
q
Non-Clustered index
14. Clustered Index
When we create a clustered index on any table physical
organization of table is changed.
Now data of table is stored as a balanced tree(B tree).
CREATE UNIQUE [CLUSTERED] INDEX <Name>
ON <ObjectName>(
<ColumnName> [ASC | DESC ] [ ,...n ]
)
15.
16. Types Of Scanning
Table scan: It is very slow can and it is used only if table has
not any clustered index.
Index scan: It is also slow scan. It is used when table has
clustered index and either in WHERE clause non-key columns
are present or query has not been covered (will discuss later)
or both.
Index Seek: It is very fast. Our goal is to achieve this.
17. Clustered Index
If we create table with primary key, sql server automatically
creates clustered index on that table
A table can have only one clustered index .
Physical order of rows of table is same as logical order of key
columns of clustered index.
18. Terms Of Execution Plan
Predicate: It is condition in WHERE clause which is either nonkey column or column which has not been covered.
Object: It is name of source from where it getting the data. It
can be name of table, Clustered index or non-clustered index
Output list: It is name of the columns which is getting from
object.
Seek Predicate: It is condition in WHERE clause which is either
key column or fully covered.
19. Non-Clustered Index
It is logical organization of data of table. A non-clustered index can
be of two types.
q
Heap
q
Based on clustered index.
If table has clustered index then leaf node of non-clustered index
keeps the key columns of clustered index.
If the table has not any clustered index then leaf node of nonclustered index keeps RID which unique of each row of table.
22. Covering Of Queries
We can specify maximum 16 column names.
Sum of size of the columns cannot be more than 900 bytes.
All columns must belong to same table.
Data type of columns cannot be ntext, text,
varchar (max), nvarchar (max), varbinary (max), xml, or image
It cannot be non-deterministic computed column.
23. Statistics Analysis
The query optimizer uses statistics to create query plans that
improve query performance
A correct statistics will lead to high-quality query plan.
The query optimizer determines when statistics might be out-ofdate by counting the number of data modifications since the
last statistics update and comparing the number of
modifications to a threshold.
24. Auto Create Statistics
Default setting of auto create statistics is ON.
It creates when:
Clustered and non clustered Index is created
Select query is executed.
Auto create and updates applies strictly to singlecolumn statistics.
25. Why Query 2 Is Performing Better
q
If we perform following operations on field of any table in
query predicate:
q
Using any system function or user defined function
q
Scalar operation like addition, multiplication etc.
q
Type casting
q
In this situation sql server query optimizer is not able to
estimate correct cardinality using statistics.
26. To Improve Cardinality
If possible, simplify expressions with constants in them.
If possible, don't perform any operation on the any field of a table
in WHERE Clause, ON Clause, HAVING Clause
Don't use local variables in WHERE Clause, ON Clause, HAVING
Clause.
If there is any cross relationship among fields or there is a complex
expression in a field in a query predicates, it is better to create a
computed column and then create a non-clustered index on it.
27. To Improve Cardinality
If possible, don't update the value of parameters of a function or
stored procedure before using in sql statement
Use OPTIMIZE FOR clause when you want to optimize a sql query on
the basis of specific parameter value.
If you want to update the value parameter of a stored procedure or
a function create a similar procedure or function and execute it form
base procedure or function by passing the updated value as a
parameter.
Create user defined multi column statistics if query predicates have
more than one fields of a table.