Quick & Easy SQL Tips
Upcoming SlideShare
Loading in...5

Like this? Share it with your network


Quick & Easy SQL Tips

Uploaded on

SQL Tips for the YouTube generation. 20 unrelated and independant tips, one right after another to speed up your database application without a ton of work.

SQL Tips for the YouTube generation. 20 unrelated and independant tips, one right after another to speed up your database application without a ton of work.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads


Total Views
On Slideshare
From Embeds
Number of Embeds



Embeds 313

http://ellisteam.blogspot.com 259
http://blog.the-monastery.com 32
http://2947009204355665069_db0837598b2d3e15e253004c95602cd88f49a6cb.blogspot.com 7
http://blog.ikeellis.com 3
http://ellisteam.blogspot.co.uk 3
http://the-monastery-blog.blogspot.com 3
http://www.linkedin.com 2
http://ellisteam.blogspot.nl 1
http://ellisteam.blogspot.co.nz 1
http://twitter.com 1
http://www.blogger.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

    No notes for slide
  • DBCC OPENTRANselect s.plan_handle , t.text , sum(s.execution_count) as totalExecutionCount , sum(s.total_elapsed_time) as totalElapsedTime , sum(s.total_worker_time) as totalWorkerTime , sum(s.total_logical_reads) as totalLogicalReads , sum(s.total_logical_writes) as totalLogicalWrites from sys.dm_exec_query_stats s cross apply sys.dm_exec_sql_text(s.plan_handle) t group by s.plan_handle, t.text order by sum(s.execution_count) desc
  • Case Statements, bad code, etc.
  • Watch the actual execution plan for these statements:drop table dbo.t1drop table dbo.t2--create two test tablescreate table dbo.t1(c1 int, c2 int check(c2 between 10 and 20));insert into dbo.t1values (11,12);create table dbo.t2(c1 int, c2 int);goinsert into dbo.t2values(101, 102);go select t1.c1 , t2.c2 , t2.c2 from dbo.t1 join dbo.t2 on t1.c1 = t2.c2 and t1.c2 = 20;select t1.c1 , t1.c2 , t2.c2 from dbo.t1 join dbo.t2 on t1.c1 = t2.c2 and t1.c2 = 30;
  • A common table expression (CTE) can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement. A CTE is similar to a derived table in that it is not stored as an object and lasts only for the duration of the query. Unlike a derived table, a CTE can be self-referencing and can be referenced multiple times in the same query.A CTE is made up of an expression name representing the CTE, an optional column list, and a query defining the CTE. After a CTE is defined, it can be referenced like a table or view can in a SELECT, INSERT, UPDATE, or DELETE statement. A CTE can also be used in a CREATE VIEW statement as part of its defining SELECT statement. A CTE can be used to: Create a recursive query.Substitute for a view when the general use of a view is not required; that is, you do not have to store the definition in metadata.Enable grouping by a column that is derived from a scalar subselect, or a function that is either not deterministic or has external access.Reference the resulting table multiple times in the same statement.ReferencesUsing Common Table Expressions: http://go.microsoft.com/fwlink/?LinkID=127330


  • 1. Quick & Easy SQL Tips
    Ike Ellis
    Twitter: @ike_ellis
  • 2. Assumptions @ You
    You are a new DBA
    You don’t want to rewrite your entire application with a new schema, new DAL, or new queries
    You want to learn just enough so that your SQL apps are fast and maintainable
  • 3. Tip #1 – Performance Problem: Check the low-hanging fruit
    Long-running jobs
    Long-running transactions
    Check for long-running queries/both in amount and in duration
  • 4. Tip #2: Prettify!
  • 5. Tip #3 – Performance Problem : Identify hardware performance bottlenecks.
    Network I/O
    *Most common bottleneck. It’s the Disk I/O, Stupid. (But it could be memory that’s causing it.)
  • 6. Tip #4: The right way to find hardware problems
    Merging PerfMon and Tracing
    Get the Batch and Completed Events Only
    Never trace from the computer you are monitoring
    Always trace to a file and then load in a table after.
  • 7. Tip #5: Files, Files Everywhere
    All need their own physical drive for space management and performance
    Master Data File (MDF)
    Log Files (LDF)
    TempDB Files
    O/S/SQL Files
    BAK Files
  • 8. Tip #6: The Log File
    Fills sequentially, so no need for striping, mirror is fine.
    Don’t let it get filled up: Simple Mode or Backup.
  • 9. Tip #7 - Good memory management
    Check for other applications running on the SQL Server
    Move anti-virus (or at least make sure it wasn't scanning the SQL ports or the SQL files)
    Move Exchange and F&P services (cluster)
    Turn off unneeded services
    SQL is I/O bound, so I would turn off any network/disk intensive services (DHCP, DNS, etc)
  • 10. Tip #8 - Quick Indexing Tricks.
    check for clustered indexes
    SELECT t.[Name] FROM sys.Indexes i
    JOIN sys.Tables t
    ON t.Object_ID = i.Object_id
    WHERE i.type_desc = 'HEAP'
    ORDER BY t.[Name]
    check for nonclustered indexes on foreign key columns (ID Columns)
    select * from sys.columns c
    where c.name like '%id%'
    and c.object_id not in
    select object_id from sys.index_columns
    check for non-clustered covering indexes
    reads outnumber inserts/updates 5 to 10 to 1
  • 11. Tip #9 - Run the Index Tuning Wizard (DB Tuning Advisor)
    Run it a really long time, it is more accurate the longer it runs
    Don’t drop existing objects
    It’s OK to over-index
  • 12. Tip #10 – I don’t really know the symptoms, but SQL Doctor will find the cure.
    Red Gate
    DB Artison
  • 13. Tip #11– Baseline the right way
    Idera Diagnostics Manager & RedGate
  • 14. Tip #12 – Enforce Business Rules in the DB
    Foreign Keys
    Unique Constraints
    Check Constraints
  • 15. Tip #13 - Eliminate Cursors
    Cursors focus on how, not why or what
    Cursors are expensive
    Cursors take up memory, which is usually a problem already
    Cursors can often be written using a set-based method
  • 16. Easy Tip #14 - Avoid Deadlocking, Blocking
    Index Tune
    Keep transactions short
    Don’t lock when you don’t have to
    Hit the tables in the same order (create a table order document)
    Minimize the use of triggers
  • 17. Tip #15: CTE’s
    A named temporary result set based on a SELECT query
    Common Table Expression
    • Result set can be used in SELECT, INSERT, UPDATE, or DELETE
    • 18. Advantages of common table expressions:
    • 19. Queries with derived tables become more readable
    • 20. Provide traversal of recursive hierarchies
    WITH TopSales (SalesPersonID, NumSales) AS
    ( SELECT SalesPersonID, Count(*)
    FROM Sales.SalesOrderHeader GROUP BY SalesPersonId )
    SELECT * FROM TopSales
    ORDER BY NumSales DESC
  • 21. Tip #16: apply operator
    right parameter can be a table, but meant for tvf
    cross apply does inner join
    no output for row when udf produces no output
    udf can get its parameters from left input
    outer apply does left outer join
    all rows from left input returned
    may have nulls for columns returned by udf
  • 22. Tip #17: temptables vs. table variables
    • table variables
    • 23. private to batch
    • 24. avoids transaction affects
    • 25. designed for smaller number of rows where scans are cheaper than seeks
    • 26. limited indexing
    • 27. static nature reduces recompiles
    • 28. prefer to use with small number of rows
    • 29. temporary tables
    • 30. persists for session
    • 31. can be shared over sessions and scopes
    • 32. can participate in transactions
    • 33. can be indexed
    • 34. can trigger frequent recompiles
    • 35. get statistics
    • 36. prefer to use when you have more rows
    • 37. buffering data locally
  • Tip #18: where exists vs. where in
    prior to sql server 2000, exists was preferred over in
    now they generate the same query plan
    select salesPersonID
    from sales.salesPerson s
    where exists(
    select managerID
    from humanresources.employee e
    where e.managerID = s.salesPersonID)
    select salesPersonID
    from sales.salesPerson
    where salesPersonID in
    (select managerID
    from humanresources.employee)
  • 38. where not exists vs. where not in
    the possible presence of a null generates different plans for not exists and not in
    select salesPersonID
    from sales.salesPersons
    where not exists(
    select managerID from
    humanresources.employee e
    where e.managerID =
    select salesPersonID
    from sales.salesPerson
    where salesPersonID not in
    (select managerID from
  • 39. Tip #19: Statistics Update
    From the query plan, estimated number of rows and the actual number of rows need to equal each other. If they don’t, you might have a statistics issue.
    Run sp_updatestats to rectify it.
  • 40. Tip #20: Big Rows from Query Plan
    When troubleshooting, thick rows means lots of data, thin rows mean not much data. You’re probably better off following the thick rows.
  • 41. Tip #21: Missing Index Details
    Just copy that, name the index something unique, and then run it.
    Remember, it doesn’t look for overlapping indexes, so check that before you run.
  • 42. Conclusion
    Have a great code camp!
    Ike Ellis
    Twitter: @ike_ellis