Does your SQL statement have a WHERE clause?

Is SELECT DISTINCT being used properly?

Are you using UNION instead of UNION ALL?

Are your stored procedures prefixed with 'sp_'?

Are all stored procedures referred to as dbo.sprocname?

Are you using temporary tables when you don't need to?

SELECT COLUMN1, COLUMN2, COUNTOFCOL3

FROM A_TABLE A

INNER JOIN (SELECT COUNT(COLUMN3) AS COUNTOFCOL3, COLUMN2

FROM B_TABLE B

INNER JOIN C_TABLE C ON B.ID = C.ID) ON A.ID = B.ID

Are you using Cursors when you don't need to?

Derived tables

Sub-queries

CASE statements

Multiple queries

Temporary tables

Are your Transactions being kept as short as possible?

Is SET NO COUNT ON being used?

Are you using IN or NOT IN when you should be using EXISTS or NOT EXISTS?



SELECT A_TABLE.COLUMN1

FROM A_TABLE

WHERE A_TABLE.COLUMN2 NOT IN (SELECT A_TABLE2.COLUMN2

FROM A_TABLE2)

SELECT A_TABLE.COLUMN1

FROM A_TABLE

WHERE NOT EXISTS (SELECT A_TABLE2.COLUMN2

FROM A_TABLE2

WHERE A_TABLE.COLUMN2 = A_TABLE2.COLUMN2)

Do you have a function that acts directly on a column used in a WHERE clause?

SELECT A_TABLE.LASTNAME

FROM A_TABLE

WHERE SUBSTRING (FIRSTNAME,1,1) = 'm'

SELECT A_TABLE.LASTNAME

FROM A_TABLE

WHERE FIRSTNAME LIKE = 'm%'

Where you have a choice of using the IN or BETWEEN clauses



SELECT A_TABLE.NAME

FROM A_TABLE

WHERE A_TABLE.NUMBER IN (100, 101, 102, 103)

SELECT A_TABLE.NAME

FROM A_TABLE

WHERE A_TABLE.NUMBER BETWEEN 100 AND 103

Are you doing excessive string concatenation in your stored procedure?

Have you checked the order of WHERE clauses when using AND?

Locate the least likely true AND expression first. This way, if the AND expression is false, the clause will end immediately, saving time.

If both parts of an AND expression are equally likely being false, put the least complex AND expression first. This way, if it is false, less work will have to be done to evaluate the expression.

Have you checked that you are using the most efficient operators?

=

>, >=,

LIKE

<>





A colleague of mine has been looking at SQL Server performance, and come up with a great set of tips (mostly gleaned from this website ):I know this sounds obvious, but don't retrieve more data than you need. However, less obvious is that even if your SELECT statement retrieves the same quantity of data without a WHERE clause, it may run faster with one.Again, pretty obvious, but using SELECT DISTINCT where no duplicate records are being returned is an unnecessary performance hit. If you are getting duplicate records, first double check your table joins as this is often the cause and only use the DISTINCT clause if you really need it.A UNION statement effectively does a SELECT DISTINCT on the results set. If you know that all the records returned are unique from your union, use UNION ALL instead, it is much quicker.Any stored procedures prefixed with 'sp_' are first searched for in the Master database rather than the one it is created in. This will cause a delay in the stored procedure being executed.When calling a stored procedure you should include the owner name in the call, i.e. use EXEC dbo.spMyStoredProc instead of EXEC spMyStoredProc.Prefixing the stored procedure with the owner when executing it will stop SQL Server from placing a COMPILE lock on the procedure while it determines if all objects referenced in the code have the same owners as the objects in the current cached procedure plan.Although there is sometimes a benefit of using temporary tables, generally they are best eliminated from your stored procedure. Don't assume that retrieving data multiple times is always less efficient than getting the data once and storing it in temporary table as often it isn't. Consider using a sub-query or derived table instead of a temporary table (see examples below). If you are using a temporary table in lots of JOINS in you stored procedure and it contains loads of data, it might be beneficial to add an index to your temporary table as this may also improve performance.An example of a derived table instead of a temporary tableCursors of any kind slow down SQL Server's performance. While in some cases they are unavoidable, often there are ways to remove them from your code.Consider using any of these options instead of using a cursor as they are all faster:If you are use SQL transactions, try to keep them as short as possible. This will help db performance by reducing the number of locks. Remove anything that doesn't specifically need to be within the transaction like setting variables, select statements etc.By default, every time a stored procedure is executed, a message is sent from the server to the client indicating the number of rows that were affected by the stored procedure. You can reduce network traffic between the server and the client if you don't need this feature by adding SET NO COUNT ON at the beginning of your stored procedure.If you are using IN or NOT IN in a WHERE clause that contains a sub-query you should re-write it to use either EXISTS, NOT EXISTS or perform a LEFT OUTER JOIN. This is because particularly the NOT IN statement offers really poor performance. The example below probably better explains what I mean:e.g. This SQL statement:Could be re-written like this:If you apply a function to a column used in the WHERE clause of your SQL statement, it is unlikely that the SQL statement will be able to make use of any indexes applied to that column.e.g.Could be re-written:Use the BETWEEN clause as it is much more efficiente.g. This SQL statement:Should be re-written like this:Where possible, avoid doing loads of string concatenation as it is not a fast process in SQL Server.If you have a WHERE clause that includes expressions connected by two or more AND operators, SQL Server will evaluate them from left to right in the order they are written (assuming that no parenthesis have been used to change the order of execution). You may want to consider one of the following when using AND:Often you don't have much of a choice of which operator you use in your SQL statement. However, sometimes there is an alternative way to re-write your SQL statement to use a more efficient operator. Below is a list of operators in their order of performance (with the most efficient first).