SlideShare a Scribd company logo
MY SQL SKILLS
KILLED THE SERVER
Dave Ferguson
@dfgrumpy
dev.Objective() 2015
WHO AM I?
I am an Adobe Community Professional
I started building web applications a long time ago
Contributor to Learn CF in a week
I have a ColdFusion podcast called
CFHour w/ Scott Stroz (@boyzoid)
(please listen)
3x California State Taekwondo
Weapons Champion
WHAT WILL WE COVER?
Running Queries
When good SQL goes bad
Bulk processing
Large volume datasets
Indexes
Outside influences
Sql killedserver
(I KNOW SQL)
“WHY AM I HERE?”
Because you have probably written something like
this…
select * from myTable
“I can write SQL in my
sleep”
select * from myTable where id = 2
“I can write joins and
other complex SQL”
Select mt.* from myTable mt
join myOtherTable mot
on mt.id = mot.id
where mot.id = 2
“I might even create a table”
CREATE TABLE `myFakeTable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`someName` varchar(150) NOT NULL DEFAULT '',
`someDescription` text,
`type` varchar(50) DEFAULT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
But, how do you know if what you did
was the best / most efficient way to do
it?
Did the
internet tell
you it was
right?
Did you get
some advice
from a
someone?
“My app works fine. It has
thousands of queries and we
only see slowness every once in
a while. ”
Have you ever truly looked at
what your queries are doing?
Most developers don't bother.
They leave all that technical
database stuff up to the DBA.
But what if you are the
developer AND the DBA?
Query Plan
Uses Execution Contexts
Created for each degree of parallelism for
a query
Execution Context
Specific to the query being executed.
Created for each query
QUERY EXECUTION
Execution Context & Query Plan
Have you ever looked
at a query plan?
Do you know what a query plan is?
Query Plan, In the event you were
curious…
WHAT A QUERY PLAN WILL TELL
YOU
Path taken to get data
 Almost like a Java stack trace
Indexes usage
How the indexes are being used
Cost of each section of plan
Possible suggestions for performance
improvement
Whole bunch of other stuff
How long are plans / contexts kept?
 1 Hour
 1 Day
 ‘Til SQL server restarts
 Discards it immediately
 The day after forever
 Till the server runs out of cache space
What can cause plans to be flushed from
cache?
 Forced via code
 Memory pressure
 Alter statements
 Statistics update
 auto_update statistics on
HOW CAN WE KEEP THE
DATABASE FROM
THROWING AWAY THE
PLANS?
MORE IMPORTANTLY,
HOW CAN WE GET THE
DATABASE TO USE THE
CACHED PLANS?
• Force it
• Use params
• Use stored procedures
• Get more ram
• Use less queries
SIMPLE ANSWER
HOW DOES SQL
DETERMINE IF THERE
IS A QUERY PLAN?
Something
Like this…
THIS QUERY WILL
CREATE A EXECUTION
CONTEXT..
select id, name from myTable where id = 2
THAT…
WILL NOT BE USED BY
THIS QUERY.
select id, name from myTable where id = 5
WHY IS THAT?
Well, the queries are
not the same.
According to the SQL
optimizer,
select id, name from myTable where id = 2
select id, name from myTable where id = 5
this query…
and this query…
are not the same.
So, they each get their own execution plan.
PLANS CAN BECOME DATA HOGS
select id, name from myTable where id = 2
If the query above ran 5,000 times over the
course of an hour (with different ids), you could
have that many plans cached.
That could equal around 120mb of cache space!
TO RECAP…
EXECUTION CONTEXTS
ARE GOOD
TOO MANY ARE BAD
USING QUERY PARAMS…
The secret sauce to plan reuse
<cfquery name="testQuery">
select a.ARTID, a.ARTNAME from ART a
where a.ARTID = <cfqueryparam value="5”
cfsqltype="cf_sql_integer">
</cfquery>
Using a simple query… let’s add a param for the
id.
select a.ARTID, a.ARTNAME from ART a
where a.ARTID = ?
THE QUERY OPTIMIZER SEES THIS…
testQuery (Datasource=cfartgallery, Time=1ms, Records=1)
in /xxx/x.cfm
select a.ARTID, a.ARTNAME from ART a
where a.ARTID = ?
Query Parameter Value(s) -
Parameter #1(cf_sql_integer) = 5
THE DEBUG OUTPUT LOOKS LIKE
THIS…
testQuery (Datasource=cfartgallery, Time=8ms, Records=5) in
/xxx/x.cfm
select a.ARTID, a.ARTNAME from ART a
where a.ARTID in (?,?,?,?,?)
Query Parameter Value(s) -
Parameter #1(CF_SQL_CHAR) = 1
Parameter #2(CF_SQL_CHAR) = 2
Parameter #3(CF_SQL_CHAR) = 3
Parameter #4(CF_SQL_CHAR) = 4
Parameter #5(CF_SQL_CHAR) = 5
IT EVEN WORKS ON LISTS…
testQuery (Datasource=cfartgallery, Time=3ms, Records=1) in
/xxx/x.cfm
select a.ARTID, a.ARTNAME, (
select count(*) from ORDERITEMS oi where oi.ARTID = ?
) as ordercount
from ART a
where a.ARTID in (?)
Query Parameter Value(s) -
Parameter #1(cf_sql_integer) = 5
Parameter #2(cf_sql_integer) = 5
MORE ACCURATELY, THEY WORK ANYWHERE
YOU WOULD HAVE DYNAMIC INPUT...
When can plans cause more harm
then help?
► When your data structure changes
► When data volume grows quickly
► When you have data with a high
degree of cardinality.
How do I deal
with all this data?
What do I mean by large data
sets?
► Tables over 1 million rows
► Large databases
► Heavily denormalized data
Ways to manage large data
► Only return what you need (no “select *”)
► Try and page the data in some fashion
► Optimize indexes to speed up where
clauses
► Avoid using triggers on large volume
inserts
► Reduce any post query processing as
much as possible
Inserting / Updating large datasets
► Reduce calls to database by combining
queries
► Use bulk loading features of your
Database
► Use XML/JSON to load data into
Database
Combining Queries: Instead of doing
this…
Do this…
Gotcha’s in query combining
► Errors could cause whole batch to fail
► Overflowing allowed query string size
► Database locking can be problematic
► Difficult to get any usable result from
query
Upside query combining
► Reduces network calls to database
► Processed as a single batch in database
► Generally processed many times faster
than doing the insert one at a time
► I have used this to insert over 50k rows
into mysql in under one second.
Indexes
The secret art
of a faster select
Index Types
► Unique
► Primary key or row ID
► Covering
► A collection of columns indexed in an order that
matches where clauses
► Clustered
► The way the data is physically stored
► Table can only have one
► NonClustered
► Only contain indexed data with a pointer back to
source data
Seeking and Scanning
► Index SCAN (table scan)
► Touches all rows
► Useful only if the table contains small amount of
rows
► Index SEEK
► Only touches rows that qualify
► Useful for large datasets or highly selective
queries
► Even with an index, the optimizer may still opt to
perform a scan
To index or not to index…
► DO INDEX
► Large datasets where 10 – 15% of the data is
usually returned
► Columns used in where clauses with high
cardinality
► User name column where values are unique
► DON’T INDEX
► Small tables
► Columns with low cardinality
► Any column with only a couple values
Do I really need an index?
It Depends.
Really… it Depends!
Outside influences
Other things that can effect
performance
► Processor load
► Memory pressure
► Hard drive I/O
► Network
Processor
► Give SQL Server process CPU priority
► Watch for other processes on the server using
excessive CPU cycles
► Have enough cores to handle your database
activity
► Try to keep average processor load below
50% so the system can handle spikes
gracefully
Memory (RAM)
► Get a ton (RAM is cheap)
► Make sure you have enough RAM to keep
your server from doing excess paging
► Make sure your DB is using the RAM in the
server
► Allow the DB to use RAM for cache
► Watch for other processes using excessive
RAM
Drive I/O
► Drive I/O is usually the largest bottle neck on the
server
► Drives can only perform one operation at a time
► Make sure you don’t run out of space
► Purge log files
► Don’t store all DB and log files on the same physical
drives
► On windows don’t put your DB on the C: drive
► If possible, use SSD drives for tempdb or other highly
transactional DBs
► Log drives should be in write priority mode
► Data drives should be in read priority mode
Network
► Only matters if App server and DB server are on
separate machines (they should be)
► Minimize network hops between servers
► Watch for network traffic spikes that slow data
retrieval
► Only retrieving data needed will speed up retrieval
from DB server to app server
► Split network traffic on SQL server across multiple NIC
cards so that general network traffic doesn’t impact
DB traffic
Some Important
Database Statistics
Important stats
► Recompiles
► Recompile of a proc while running shouldn’t occur
► Caused by code in proc or memory issues
► Latch Waits
► Low level lock inside DB; Should be sub 10ms
► Lock Waits
► Data lock wait caused by thread waiting for
another lock to clear
► Full Scans
► Select queries not using indexes
Important stats continued..
► Cache Hit Ratio
► How often DB is hitting memory cache vs Disk
► Disk Read / Write times
► Access time or write times to drives
► SQL Processor time
► SQL server processor load
► SQL Memory
► Amount of system memory being used by SQL
Where SQL goes wrong
(Good examples of bad SQL)
Inline queries that well… shouldn’t be
Over joining data
Transactions – Do you see the issue?
Sql killedserver
THAT IS ALL
THANK YOU
Dave Ferguson
@dfgrumpy
dave@dkferguson.com
www.cfhour.com
dev.Objective() 2015Don’t forget to fill out the survey

More Related Content

PPTX
PHP from soup to nuts Course Deck
PDF
Information security programming in ruby
ODP
30 Minutes To CPAN
PPTX
Powershell Demo Presentation
PPT
Powershell Seminar @ ITWorx CuttingEdge Club
PDF
parenscript-tutorial
PDF
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
PDF
CFML Sessions For Dummies
PHP from soup to nuts Course Deck
Information security programming in ruby
30 Minutes To CPAN
Powershell Demo Presentation
Powershell Seminar @ ITWorx CuttingEdge Club
parenscript-tutorial
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
CFML Sessions For Dummies

What's hot (20)

PPTX
G rpc lection1
PDF
Kicking off with Zend Expressive and Doctrine ORM (ZendCon 2016)
PPSX
Sunil phani's take on windows powershell
PPTX
Professional Help for PowerShell Modules
ODP
Developing high-performance network servers in Lisp
PDF
Gradle in a Polyglot World
PDF
Php Dependency Management with Composer ZendCon 2016
PDF
PHP traits, treat or threat?
PDF
Submit PHP: Standards in PHP world. Михайло Морозов
PDF
Fluentd v0.12 master guide
PPTX
Utilizing the OpenNTF Domino API
ODP
PHP: The Beginning and the Zend
ODP
Mastering Namespaces in PHP
PPT
Migration from ASP to ASP.NET
PDF
Perl Dist::Surveyor 2011
PDF
PM : code faster
PDF
Final opensource record 2019
PDF
Nginx pres
PPTX
PHP 5.6 New and Deprecated Features
PDF
Basic commands for powershell : Configuring Windows PowerShell and working wi...
G rpc lection1
Kicking off with Zend Expressive and Doctrine ORM (ZendCon 2016)
Sunil phani's take on windows powershell
Professional Help for PowerShell Modules
Developing high-performance network servers in Lisp
Gradle in a Polyglot World
Php Dependency Management with Composer ZendCon 2016
PHP traits, treat or threat?
Submit PHP: Standards in PHP world. Михайло Морозов
Fluentd v0.12 master guide
Utilizing the OpenNTF Domino API
PHP: The Beginning and the Zend
Mastering Namespaces in PHP
Migration from ASP to ASP.NET
Perl Dist::Surveyor 2011
PM : code faster
Final opensource record 2019
Nginx pres
PHP 5.6 New and Deprecated Features
Basic commands for powershell : Configuring Windows PowerShell and working wi...
Ad

Viewers also liked (20)

PDF
Getting started with mobile application development
PDF
Hidden Gems in ColdFusion 11
PDF
Language enhancements in cold fusion 11
PDF
Relationships are hard
PDF
Refactor Large applications with Backbone
PDF
Setting up your multiengine environment Apache Railo ColdFusion
PDF
Dependency Injection Why is it awesome and Why should I care?
PDF
PDF
Emberjs building-ambitious-web-applications
PDF
API Management from the Trenches
PDF
The Future of CSS with Web Components
PDF
Multiply like rabbits with rabbit mq
PDF
How do I write Testable Javascript
PDF
Software craftsmanship
PDF
Front end-modernization
PDF
Realtime with-websockets-2015
PPTX
Accelerate your ColdFusion Applications using Caching
PDF
This is how we REST
PDF
Web hackingtools 2015
PPTX
Load Balancing, Failover and Scalability with ColdFusion
Getting started with mobile application development
Hidden Gems in ColdFusion 11
Language enhancements in cold fusion 11
Relationships are hard
Refactor Large applications with Backbone
Setting up your multiengine environment Apache Railo ColdFusion
Dependency Injection Why is it awesome and Why should I care?
Emberjs building-ambitious-web-applications
API Management from the Trenches
The Future of CSS with Web Components
Multiply like rabbits with rabbit mq
How do I write Testable Javascript
Software craftsmanship
Front end-modernization
Realtime with-websockets-2015
Accelerate your ColdFusion Applications using Caching
This is how we REST
Web hackingtools 2015
Load Balancing, Failover and Scalability with ColdFusion
Ad

Similar to Sql killedserver (20)

PPTX
My Database Skills Killed the Server
PPT
15 Ways to Kill Your Mysql Application Performance
PDF
Scaling MySQL Strategies for Developers
PPTX
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
PPT
Oracle Tracing
PDF
MySQL Performance Optimization
PPTX
It Depends - Database admin for developers - Rev 20151205
PPTX
It Depends
PPTX
Query parameterization
ODP
Mysql For Developers
PPTX
PPTX
SQL Track: In Memory OLTP in SQL Server
PPTX
SQL Server 2008 Development for Programmers
PPTX
How to Think Like the SQL Server Engine
PPTX
HPD SQL Training - Beginner - 20220916.pptx
PPTX
How Clean is your Database? Data Scrubbing for all Skill Sets
PPTX
Dynamic Publishing with Arbortext Data Merge
PPTX
Jdbc Java Programming
PPSX
ASP.Net Presentation Part2
PPT
Ms sql server architecture
My Database Skills Killed the Server
15 Ways to Kill Your Mysql Application Performance
Scaling MySQL Strategies for Developers
Migration to ClickHouse. Practical guide, by Alexander Zaitsev
Oracle Tracing
MySQL Performance Optimization
It Depends - Database admin for developers - Rev 20151205
It Depends
Query parameterization
Mysql For Developers
SQL Track: In Memory OLTP in SQL Server
SQL Server 2008 Development for Programmers
How to Think Like the SQL Server Engine
HPD SQL Training - Beginner - 20220916.pptx
How Clean is your Database? Data Scrubbing for all Skill Sets
Dynamic Publishing with Arbortext Data Merge
Jdbc Java Programming
ASP.Net Presentation Part2
Ms sql server architecture

More from ColdFusionConference (20)

PDF
Api manager preconference
PDF
PDF
Building better SQL Server Databases
PDF
API Economy, Realizing the Business Value of APIs
PDF
Don't just pdf, Smart PDF
PDF
Crafting ColdFusion Applications like an Architect
PDF
Security And Access Control For APIS using CF API Manager
PDF
Monetizing Business Models: ColdFusion and APIS
PDF
Become a Security Rockstar with ColdFusion 2016
PDF
ColdFusion in Transit action
PDF
Developer Insights for Application Upgrade to ColdFusion 2016
PDF
Where is cold fusion headed
PDF
ColdFusion Keynote: Building the Agile Web Since 1995
PDF
Instant ColdFusion with Vagrant
PPT
Restful services with ColdFusion
PDF
Super Fast Application development with Mura CMS
PDF
Build your own secure and real-time dashboard for mobile and web
PDF
Why Everyone else writes bad code
PDF
Securing applications
PDF
Testing automaton
Api manager preconference
Building better SQL Server Databases
API Economy, Realizing the Business Value of APIs
Don't just pdf, Smart PDF
Crafting ColdFusion Applications like an Architect
Security And Access Control For APIS using CF API Manager
Monetizing Business Models: ColdFusion and APIS
Become a Security Rockstar with ColdFusion 2016
ColdFusion in Transit action
Developer Insights for Application Upgrade to ColdFusion 2016
Where is cold fusion headed
ColdFusion Keynote: Building the Agile Web Since 1995
Instant ColdFusion with Vagrant
Restful services with ColdFusion
Super Fast Application development with Mura CMS
Build your own secure and real-time dashboard for mobile and web
Why Everyone else writes bad code
Securing applications
Testing automaton

Recently uploaded (20)

PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
Machine Learning_overview_presentation.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
A Presentation on Artificial Intelligence
PPTX
OMC Textile Division Presentation 2021.pptx
PPTX
Tartificialntelligence_presentation.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
Spectroscopy.pptx food analysis technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Machine Learning_overview_presentation.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Encapsulation_ Review paper, used for researhc scholars
Spectral efficient network and resource selection model in 5G networks
A Presentation on Artificial Intelligence
OMC Textile Division Presentation 2021.pptx
Tartificialntelligence_presentation.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
Building Integrated photovoltaic BIPV_UPV.pdf
NewMind AI Weekly Chronicles - August'25-Week II
Spectroscopy.pptx food analysis technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced methodologies resolving dimensionality complications for autism neur...
MIND Revenue Release Quarter 2 2025 Press Release
Unlocking AI with Model Context Protocol (MCP)
gpt5_lecture_notes_comprehensive_20250812015547.pdf
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11

Sql killedserver

  • 1. MY SQL SKILLS KILLED THE SERVER Dave Ferguson @dfgrumpy dev.Objective() 2015
  • 2. WHO AM I? I am an Adobe Community Professional I started building web applications a long time ago Contributor to Learn CF in a week I have a ColdFusion podcast called CFHour w/ Scott Stroz (@boyzoid) (please listen) 3x California State Taekwondo Weapons Champion
  • 3. WHAT WILL WE COVER? Running Queries When good SQL goes bad Bulk processing Large volume datasets Indexes Outside influences
  • 5. (I KNOW SQL) “WHY AM I HERE?”
  • 6. Because you have probably written something like this…
  • 7. select * from myTable
  • 8. “I can write SQL in my sleep” select * from myTable where id = 2
  • 9. “I can write joins and other complex SQL” Select mt.* from myTable mt join myOtherTable mot on mt.id = mot.id where mot.id = 2
  • 10. “I might even create a table” CREATE TABLE `myFakeTable` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `someName` varchar(150) NOT NULL DEFAULT '', `someDescription` text, `type` varchar(50) DEFAULT NULL, `status` int(11) NOT NULL, PRIMARY KEY (`id`) );
  • 11. But, how do you know if what you did was the best / most efficient way to do it?
  • 12. Did the internet tell you it was right?
  • 13. Did you get some advice from a someone?
  • 14. “My app works fine. It has thousands of queries and we only see slowness every once in a while. ”
  • 15. Have you ever truly looked at what your queries are doing?
  • 16. Most developers don't bother. They leave all that technical database stuff up to the DBA. But what if you are the developer AND the DBA?
  • 17. Query Plan Uses Execution Contexts Created for each degree of parallelism for a query Execution Context Specific to the query being executed. Created for each query QUERY EXECUTION
  • 18. Execution Context & Query Plan
  • 19. Have you ever looked at a query plan? Do you know what a query plan is?
  • 20. Query Plan, In the event you were curious…
  • 21. WHAT A QUERY PLAN WILL TELL YOU Path taken to get data  Almost like a Java stack trace Indexes usage How the indexes are being used Cost of each section of plan Possible suggestions for performance improvement Whole bunch of other stuff
  • 22. How long are plans / contexts kept?  1 Hour  1 Day  ‘Til SQL server restarts  Discards it immediately  The day after forever  Till the server runs out of cache space
  • 23. What can cause plans to be flushed from cache?  Forced via code  Memory pressure  Alter statements  Statistics update  auto_update statistics on
  • 24. HOW CAN WE KEEP THE DATABASE FROM THROWING AWAY THE PLANS?
  • 25. MORE IMPORTANTLY, HOW CAN WE GET THE DATABASE TO USE THE CACHED PLANS?
  • 26. • Force it • Use params • Use stored procedures • Get more ram • Use less queries SIMPLE ANSWER
  • 27. HOW DOES SQL DETERMINE IF THERE IS A QUERY PLAN?
  • 29. THIS QUERY WILL CREATE A EXECUTION CONTEXT.. select id, name from myTable where id = 2 THAT…
  • 30. WILL NOT BE USED BY THIS QUERY. select id, name from myTable where id = 5
  • 31. WHY IS THAT? Well, the queries are not the same.
  • 32. According to the SQL optimizer, select id, name from myTable where id = 2 select id, name from myTable where id = 5 this query… and this query… are not the same. So, they each get their own execution plan.
  • 33. PLANS CAN BECOME DATA HOGS select id, name from myTable where id = 2 If the query above ran 5,000 times over the course of an hour (with different ids), you could have that many plans cached. That could equal around 120mb of cache space!
  • 34. TO RECAP… EXECUTION CONTEXTS ARE GOOD TOO MANY ARE BAD
  • 35. USING QUERY PARAMS… The secret sauce to plan reuse
  • 36. <cfquery name="testQuery"> select a.ARTID, a.ARTNAME from ART a where a.ARTID = <cfqueryparam value="5” cfsqltype="cf_sql_integer"> </cfquery> Using a simple query… let’s add a param for the id.
  • 37. select a.ARTID, a.ARTNAME from ART a where a.ARTID = ? THE QUERY OPTIMIZER SEES THIS…
  • 38. testQuery (Datasource=cfartgallery, Time=1ms, Records=1) in /xxx/x.cfm select a.ARTID, a.ARTNAME from ART a where a.ARTID = ? Query Parameter Value(s) - Parameter #1(cf_sql_integer) = 5 THE DEBUG OUTPUT LOOKS LIKE THIS…
  • 39. testQuery (Datasource=cfartgallery, Time=8ms, Records=5) in /xxx/x.cfm select a.ARTID, a.ARTNAME from ART a where a.ARTID in (?,?,?,?,?) Query Parameter Value(s) - Parameter #1(CF_SQL_CHAR) = 1 Parameter #2(CF_SQL_CHAR) = 2 Parameter #3(CF_SQL_CHAR) = 3 Parameter #4(CF_SQL_CHAR) = 4 Parameter #5(CF_SQL_CHAR) = 5 IT EVEN WORKS ON LISTS…
  • 40. testQuery (Datasource=cfartgallery, Time=3ms, Records=1) in /xxx/x.cfm select a.ARTID, a.ARTNAME, ( select count(*) from ORDERITEMS oi where oi.ARTID = ? ) as ordercount from ART a where a.ARTID in (?) Query Parameter Value(s) - Parameter #1(cf_sql_integer) = 5 Parameter #2(cf_sql_integer) = 5 MORE ACCURATELY, THEY WORK ANYWHERE YOU WOULD HAVE DYNAMIC INPUT...
  • 41. When can plans cause more harm then help? ► When your data structure changes ► When data volume grows quickly ► When you have data with a high degree of cardinality.
  • 42. How do I deal with all this data?
  • 43. What do I mean by large data sets? ► Tables over 1 million rows ► Large databases ► Heavily denormalized data
  • 44. Ways to manage large data ► Only return what you need (no “select *”) ► Try and page the data in some fashion ► Optimize indexes to speed up where clauses ► Avoid using triggers on large volume inserts ► Reduce any post query processing as much as possible
  • 45. Inserting / Updating large datasets ► Reduce calls to database by combining queries ► Use bulk loading features of your Database ► Use XML/JSON to load data into Database
  • 46. Combining Queries: Instead of doing this…
  • 48. Gotcha’s in query combining ► Errors could cause whole batch to fail ► Overflowing allowed query string size ► Database locking can be problematic ► Difficult to get any usable result from query
  • 49. Upside query combining ► Reduces network calls to database ► Processed as a single batch in database ► Generally processed many times faster than doing the insert one at a time ► I have used this to insert over 50k rows into mysql in under one second.
  • 50. Indexes The secret art of a faster select
  • 51. Index Types ► Unique ► Primary key or row ID ► Covering ► A collection of columns indexed in an order that matches where clauses ► Clustered ► The way the data is physically stored ► Table can only have one ► NonClustered ► Only contain indexed data with a pointer back to source data
  • 52. Seeking and Scanning ► Index SCAN (table scan) ► Touches all rows ► Useful only if the table contains small amount of rows ► Index SEEK ► Only touches rows that qualify ► Useful for large datasets or highly selective queries ► Even with an index, the optimizer may still opt to perform a scan
  • 53. To index or not to index… ► DO INDEX ► Large datasets where 10 – 15% of the data is usually returned ► Columns used in where clauses with high cardinality ► User name column where values are unique ► DON’T INDEX ► Small tables ► Columns with low cardinality ► Any column with only a couple values
  • 54. Do I really need an index?
  • 58. Other things that can effect performance ► Processor load ► Memory pressure ► Hard drive I/O ► Network
  • 59. Processor ► Give SQL Server process CPU priority ► Watch for other processes on the server using excessive CPU cycles ► Have enough cores to handle your database activity ► Try to keep average processor load below 50% so the system can handle spikes gracefully
  • 60. Memory (RAM) ► Get a ton (RAM is cheap) ► Make sure you have enough RAM to keep your server from doing excess paging ► Make sure your DB is using the RAM in the server ► Allow the DB to use RAM for cache ► Watch for other processes using excessive RAM
  • 61. Drive I/O ► Drive I/O is usually the largest bottle neck on the server ► Drives can only perform one operation at a time ► Make sure you don’t run out of space ► Purge log files ► Don’t store all DB and log files on the same physical drives ► On windows don’t put your DB on the C: drive ► If possible, use SSD drives for tempdb or other highly transactional DBs ► Log drives should be in write priority mode ► Data drives should be in read priority mode
  • 62. Network ► Only matters if App server and DB server are on separate machines (they should be) ► Minimize network hops between servers ► Watch for network traffic spikes that slow data retrieval ► Only retrieving data needed will speed up retrieval from DB server to app server ► Split network traffic on SQL server across multiple NIC cards so that general network traffic doesn’t impact DB traffic
  • 64. Important stats ► Recompiles ► Recompile of a proc while running shouldn’t occur ► Caused by code in proc or memory issues ► Latch Waits ► Low level lock inside DB; Should be sub 10ms ► Lock Waits ► Data lock wait caused by thread waiting for another lock to clear ► Full Scans ► Select queries not using indexes
  • 65. Important stats continued.. ► Cache Hit Ratio ► How often DB is hitting memory cache vs Disk ► Disk Read / Write times ► Access time or write times to drives ► SQL Processor time ► SQL server processor load ► SQL Memory ► Amount of system memory being used by SQL
  • 66. Where SQL goes wrong (Good examples of bad SQL)
  • 67. Inline queries that well… shouldn’t be
  • 69. Transactions – Do you see the issue?
  • 71. THAT IS ALL THANK YOU Dave Ferguson @dfgrumpy [email protected] www.cfhour.com dev.Objective() 2015Don’t forget to fill out the survey

Editor's Notes

  • #35: There is only so much cache room to go around