2. INDEX
Adhoc Query
Predicates Order
Execution Plan
Query Optimizer
Parameter Sniffing
Indexes
Statistics
Database Engine Tuning Advisor
3. Adhoc Query
Any non-Parameterized queries are called addhoc
queries. For example :
SELECT MsgID, Severity FROM SqlMessage WHERE MsgID = 100
In sql server if we execute a sql query it goes
through two steps just like any other
programming languages:
Compilation
Execution
4. Properties Of Addhoc
Queries
Case sensitive
Space sensitive
Parameter sensitive
Sql server treats two same sql queries of different
parameters as a two different sql statements. For
example:
SELECT MsgID, Severity FROM SqlMessage WHERE MsgID = 1
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 application since this
faulty code will force to delete cached query plans of
other sql statements.
6. Predicates Order
Does order of predicates in WHERE clause
matters?
WHERE vcLanguage = 'English' AND ntAge = 12
WHERE ntAge = 12 AND vcLanguage = 'English'
9. Query Optimizer
The query optimizer in SQL Server is cost-based. It includes:
Cost for using different resources (CPU and IO)
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 ?
Index is a way to organize data to make
searching, sorting and grouping fasters
we need indexing when :
WHERE, ON, HAVING clause (Searching)
ORDER BY clause (Sorting)
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
Table without any index is called Heap
There are two type of index:
Clustered index
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 non-key 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.
Heap
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
non-clustered 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-of-date 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
single-column statistics.
25. Why Query 2 Is Performing
Better
If we perform following operations on field of
any table in query predicate:
Using any system function or user defined
function
Scalar operation like addition, multiplication
etc.
Type casting
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.