top of page
Search
  • First Digital

Sql performance tuning fundementals

What is Sql performance tuning? Sql performance tuning is a recurring and difficult operation that initially might seem to have very little to no benefit. But if you look as on stored procedure tat only save 1 second multiplied over hundreds of executions 1 second could count together to save other processes minuets down the line.


To start there are 4 major considerations that makes the biggest impact:

1. Number of subsequent selects

2. Table size

3. Joins

4. Aggregations


Number of subsequent selects: One of the first things everyone should consider when creating a script is to reduce the number of select run against a table. It might sound as a trivial statement, but it might surprise any one on how many times a table is accessed for one line over a large script. To avoid this from happening move all variable declarations to one area and set multiple variables with one select.


DECLARE @Name VARCHAR(300)

DECLARE @DaysToManufacture INT

DECLARE @ProductSubcategoryID INT

DECLARE @ProductModelID INT


SELECT

@Name = Name

,@DaysToManufacture = DaysToManufacture

,@ProductSubcategoryID = ProductSubcategoryID

,@ProductModelID = ProductModelID


FROM [AdventureWorks2019].[Production].[Product]

WHERE ProductID = 779


Table size

Large tables is a vague term as what dictates whether a table gest classified as a large can depend on the table structure more than the row count as a table with multiple triggers, foreigner key references and indexes can cause a table with millions of rows to be quicker. But to mitigate table size from impacting the script is to reduce the subset of data to work with by making use of better defined where clause, adding an limit clause to the select and to if the sub set will need to be accessed more than once consider temporarily storing the data in a variable table or temp table that can be dropped when it is no longer needed.


DECLARE @ProductRange TABLE (

Name VARCHAR(300)

,DaysToManufacture INT

,ProductSubcategoryID INT

,ProductModelID INT

)

INSERT INTO @ProductRange

(

Name

,DaysToManufacture

,ProductSubcategoryID

,ProductModelID

)

SELECT

Name

,DaysToManufacture

,ProductSubcategoryID

,ProductModelID

,SellStartDate

FROM [AdventureWorks2019].[Production].[Product]


SELECT * FROM @ProductRange


Joins

Joining tables should be limited to only the necessary tables as the cost on the criterial use between the table. This means that all the rows in the smaller table are evaluated for matching rows. So, to avoid this cost it is worth adding a sub select with the necessary aggregations to prefilter the set to be joined to only the set that will pass the main select aggregations.


SELECT

ProductCategory.Name AS [Category]

,Product.DaysToManufacture

,Product.ProductModelID

,Product.SellStartDate

FROM

(

SELECT

Name

,DaysToManufacture

,ProductSubcategoryID

,ProductModelID

,SellStartDate

FROM [AdventureWorks2019].[Production].[Product] AS Product WHERE SellStartDate BETWEEN '2008-01-01'

AND '2008-05-30'

)

Product

INNER JOIN [AdventureWorks2019].[Production].[ProductCategory]

AS ProductCategory

ON ProductCategory.ProductCategoryID = Product.ProductSubcategoryID

WHERE ProductCategory.[ModifiedDate] BETWEEN '2008-01-01' AND '2008-05-30'


Aggregations

The were clause is not only to filter the select to the subset you want to see, it has the biggest impact on the execution time as it is the first thing that is executed on the table when looking at the Query execution Plan. So, it is worth the time to define all the relevant clauses as it affects the aggregate functions and the involved time to calculate them.


SELECT TOP (1000) [ProductID]

,[Name]

,[ProductNumber]

,[MakeFlag]

,[FinishedGoodsFlag]

,[Color]

,[SafetyStockLevel]

,[ReorderPoint]

,[StandardCost]

,[ListPrice]

,[Size]

,[SizeUnitMeasureCode]

,[WeightUnitMeasureCode]

,[Weight]

,[DaysToManufacture]

,[ProductLine]

,[Class]

,[Style]

,[ProductSubcategoryID]

,[ProductModelID]

,[SellStartDate]

,[SellEndDate]

,[DiscontinuedDate]

,[rowguid]

,[ModifiedDate]

FROM [AdventureWorks2019].[Production].[Product]

WHERE [ModifiedDate] BETWEEN '2008-01-01' AND '2008-05-30'


These are a couple of steps with a large impact on the execution time. Sql performance tuning is a rabid hole digging for millisecond that will drive you insane some days and very happy on others. Happy digging.


Published By: Jonathan Healing


19 views0 comments
bottom of page