SlideShare a Scribd company logo
SQL Server Infernals
A Beginner’s Guide to SQL Server Worst Practices
Gianluca Sartori
@spaghettidba
Gianluca Sartori
Independent SQL Server consultant
SQL Server MVP, MCTS, MCITP, MCT
Works with SQL Server since version 7
DBA @ Scuderia Ferrari
Blog: spaghettidba.com
Twitter: @spaghettidba
Agenda
 Best practices or Worst practices?
 What can go wrong?
 Design
 Development
 Installation
 Administration
Disclaimer:
 Not everything is black or white
 «It depends» is the most likely answer
There are edge cases when some of these worst practices are the
only possible solution, or not such a bad idea…
Best Practices vs. Worst Practices
 Why Best Practices are not enough
 Too many
 No time
 Lack of experience
 Not always clear what happens if we don’t follow them
 Why Worst Practices help
 They show the mistakes to avoid
 We can learn from someone else’s mistakes
Worst Practices Areas
Design Development Installation Administration
Schema design
Naming
Data Types
Environment HW validation
OS configuration
SQL installation
Recovery
Security
Capacity
Performance
Monitoring
Code
Test
SQL Server Infernals
 Worst Practices are sins that will put
you in the SQL Server hell!!
 I will guide you through the circles, as
Virgil did with Dante
CIRCLE 1:
Undernormalizers
Schema Design
 Not normalizing the schema
 1NF:
A primary key, atomic attributes only
 2NF:
Every attribute depends on the whole key
 3NF:
Every attribute depends only on the key
«The key, the whole key, nothing but the key,
so help me Codd»
Clues of denormalization
 Repeating data  redundancies
 Inconsistent data between tables anomalies
 Data separated by «,»
 Ex: john@gmail.com, john@business.com
 Structured data in «notes» columns
 Columns with a numeric suffix
 Ex: Zone1, Zone2, Zone3 …
CIRCLE 2:
Generalizers
Lookup Tables
Orders
PK order_id int
order_date datetime
FK2 customer_id int
FK1 status_id char(2)
FK3 priority_id tinyint
Order_Status
PK status_id char(2)
status_description nvarchar(50)
Customers
PK customer_id int
name varchar(100)
address varchar(50)
ZIP char(5)
city nvarchar(50)
FK2 state_id char(2)
FK1 country_id char(3)
Countries
PK country_id char(3)
description nvarchar(50)
States
PK state_id char(2)
description nvarchar(50)
Order_Priorities
PK priority_id tinyint
priority_description nvarchar(50)
One lookup table for each attribute
OTLT: One True Lookup Table
Orders
PK order_id int
order_date datetime
FK1 customer_id int
status_id char(2)
priority_id tinyint
Customers
PK customer_id int
name nvarchar(100)
address nvarchar(50)
ZIP char(5)
city nvarchar(50)
state_id char(2)
country_id char(3)
LookupTable
PK table_name sysname
PK lookup_code nvarchar(500)
lookup_description nvarchar(4000)
CREATE TABLE LookupTable (
table_name sysname,
lookup_code nvarchar(500),
lookup_description nvarchar(4000)
)
One lookup table for all attributes
OTLT: One True Lookup Table
 No Foreign Keys
 Generic data types  nvarchar(SomeHighNumber)
Implicit Conversions, Incorrect Data, Huge memory grants…
 CHECK constraints may help to a point…
 Locking
CHECK(
CASE
WHEN lookup_code = 'states' AND lookup_code LIKE '[A-Z][A-Z]' THEN 1
WHEN lookup_code = 'priorities' AND lookup_code LIKE '[0-9]' THEN 1
WHEN lookup_code = 'countries' AND lookup_code LIKE '[0-9][0-9][0-9]' THEN 1
WHEN lookup_code = 'status' AND lookup_code LIKE '[A-Z][A-Z]' THEN 1
ELSE 0
END = 1
)
EAV: Entity, Attribute, Value
Customers
PK customer_id int
name nvarchar(100)
address nvarchar(50)
ZIP char(5)
city nvarchar(50)
state_id char(2)
country_id char(3)
AttributeNames
PK attribute_id int
PK,FK1 entity_id int
attribute_name nvarchar(128)
AttributeValues
PK,FK1 attribute_id int
PK,FK1 entity_id int
PK,FK2,FK3 id int
value nvarchar(4000)
Entities
PK entity_id int
entity_name nvarchar(128)
Orders
PK order_id int
order_date datetime
customer_id int
status_id char(2)
priority_id tinyint
EAV: Entity, Attribute, Value
Disadvantages:
 Generic data types  Ex: varchar(4000)
 No Foreign Keys
 No CHECK constraints
 Multiple accesses to the same table
 One access per attribute
Advantages
 Dynamic schema: no need to alter the database
 Replication, distributed environments
EAV: Entity, Attribute, Value
 Reporting is insanely hard.
 Writing to the EAV schema is a mess
 Workaround:
 Reads: PIVOT / Crosstab
 Writes: View + INSTEAD OF triggers
 Alternatives:
 SPARSE columns
 XML/JSON
 Key-value store databases
 Document-oriented databases
DEMO:
EAV Design
CIRCLE 3:
Shaky Typers
Data type Worst Practices
 Numeric data types for non-numeric data
 Storing data as their human-readable representation
 Using deprecated data types
 Using larger data types “just in case”
 Using variable length data types for fixed size data
 Storing durations in date/datetime columns
 Getting Unicode wrong
 Using different data types for the same data in different tables
CIRCLE 4:
Anarchic Designers
Chaos Belongs to Hell
 No Primary Key o surrogate keys only
«identity» is not the only possible key!
 No Foreign Keys
They’re «awkward»
 No CHECK constraint
The application will guarantee consistency…
 Wrong data types
 Data type is the 1° constraint on the data
 Use of NULL where not appropriate
 Use of «dummy» data (ex: ‘.’ , 0)
CIRCLE 5:
Inconsistent Baptists
Damnation by Namification
 Hungarian Notation (AKA «tibbing»)
 Insanely short names
 Insanely long names
 Mixing languages
 Using the «sp_» prefix
 Using reserved words or illegal characters
 Using system generated constraint names
 No naming convention or multiple naming conventions
Hungary is a nice str_country
CIRCLE 6:
Environment Pollutors
Pollutors will be prosecuted
 Developing in production
 Using the test environment for development
 Using a shared database for development
 No source control
 Developing with sysadmin privileges
 Developing on a different version/edition from production
(less problematic after 2016 SP1)
CIRCLE 7:
Overly Optimistic Testers
Pessimists are Optimists with Experience
 Not testing all the code
Use meaningful data volumes
 Testing in production
Can alter production data
Interferes with production users
 Testing in development environment
Useful at most for unit tests
CIRCLE 8:
Indolent developers
Development Worst Practices
 No transactions
 No error handling
@@ERROR is a thing of the past!
 Wrong isolation levels
NOLOCK = no consistency!
 SELECT *
 Dynamic SQL with concatenated params
 Code vulnerable to SQL injection
 No abstraction layer
Views, Functions, Stored Procedures
It’s all about laziness
CIRCLE 9:
Stingy buyers
HW Worst Practices
 Using inadequate or unbalanced HW
 Reusing decommissioned servers for new installations
 Slower CPUs (license costs the same on fast CPUs)
 Less RAM supported
 Planning storage with capacity in mind
 Choosing the wrong RAID level
CIRCLE 10:
Next next finish installers
Installation Worst Practices
 Installing accepting all the defaults
 Data files on the system drive
 MAXDOP = 0
 Max Server Memory = +∞
 Installing unused components
 Installing multiple services on the same machine
 Giving up easy wins on I/O
 Partition misalignment
 Using the default allocation unit (4Kb)
CIRCLE 11:
Careless caretakers
What does a database need?
Backup and Recovery Worst Practices
 No backup
 With FULL recovery it’s a timebomb
 Ignoring RPO and RTO (it’s not your decision!)
 No test restores
 No consistency checks
 DBCC REPAIR_ALLOW_DATA_LOSS as default response to corruption
Our responsibility is to perform restores,
not backups!
Security Worst Practices
 Too many sysadmins
 Everyone authenticating as ‘sa’
 Using SQL Authentication
 Weak passwords
 123
 P4$$w0rd
 Same as username
 No auditing on sensitive data
Capacity Management Worst Practices
 Not checking disk space
 No space left = database halted!
 FULL recovery and no log backups?
 Relying 100% on autogrowth
 Autoshrink
 Autoclose
 Not presizing tempdb
Different file size = latching (and striping) penalty
Maintenance Worst Practices
 Not maintaining indexes and statistics
 Obsessing over maintaining indexes and statistics
 Using catch-all maintenance plans
CIRCLE 12:
Performance Killers
Performance Tuning
Easier to implementMore effective
Query Optimization Worst Practices
RBAR: Row By Agonizing Row
 Cursors
 WHILE loops
 App-side cursors
 Scalar and multi-statement functions
Query Optimization Worst Practices
Views on views on views…
Might look like a brilliant idea at first (code re-use FTW!)
 You can end up losing control
 Unneeded multiple accesses to the same tables
 Unnecessary JOINs
DEMO:
Nested views
Query Optimization Worst Practices
 One query to rule them all
The optimizer is good, not perfect
«divide et impera» delivers better performance
 DISTINCT in all queries
… because “who wants stinkin’ duplicates?”
 Query HINTs all over the place
Especially index hints
Indexing Worst Practices
 Accepting all suggestions from Tuning Advisor
 Duplicate indexes
 An index for each column
 Indexes are not for free!
 Suboptimal Clustered Index
 Unique
 Small
 Unchanging
 Ever increasing or decreasing
NEWSEQUENTIALID()
NEWID()
Server Tuning Worst Practices
 «Throwing HW» at the problem
 A 2x faster machine might make RBAR code 2x faster
 Using set-based code might make it 500x faster
 Using «advanced» options without testing
 NT Fibers (lightweight pooling)
 Priority Boost
Resources
Detailed blog posts on spaghettidba.com
One post for each circle:
https://spaghettidba.com/category/sql-server/sql-server-infernals/
Resources
Free Tool:
Best Practices Analyzer
 Highlights configuration parameters that don’t comply with
best practices
 Highlights potential problems
 Offers recommendations
http://www.microsoft.com/en-us/download/details.aspx?id=15289
SQL Server Infernals
A Beginner’s Guide to SQL Server Worst Practices
https://groupby.org/go/session5
Contact:
spaghettidba@sqlconsulting.it
More infernal stuff:
https://spaghettidba.com/category/sql-server/sql-server-infernals/

More Related Content

What's hot (20)

PDF
Toad tipstricksexpertinsight
Raj esh
 
PPTX
Slick - The Structured Way
Yennick Trevels
 
PPTX
SQL Server 2016 Temporal Tables
Davide Mauri
 
PPTX
Troubleshooting K1000
Dell World
 
PDF
Indexes: The neglected performance all rounder
Markus Winand
 
PPTX
Inventory Tips & Tricks
Dell World
 
PPTX
Is there a SQL for NoSQL?
Arthur Keen
 
PDF
Hack your db before the hackers do
fangjiafu
 
PPTX
Natural Born Killers, Performance issues to avoid
Richard Douglas
 
PPTX
SSIS Monitoring Deep Dive
Davide Mauri
 
PPTX
Wait Watchers ; Gain SQL Performance Increases Fast!
Richard Douglas
 
PPTX
Campus days 2013 - Instrumentation
Anders Lybecker
 
PPTX
Ten query tuning techniques every SQL Server programmer should know
Kevin Kline
 
PDF
Using Angular JS in APEX
Enkitec
 
PPT
Plantilla oracle
Uriel Barrales Garrido
 
PDF
50 Shades of Fail KScope16
Christian Berg
 
PDF
Thick Application Penetration Testing: Crash Course
Scott Sutherland
 
PPTX
Understanding indices
Richard Douglas
 
PPTX
A lap around microsofts business intelligence platform
Ike Ellis
 
PPTX
Reduce latency and boost sql server io performance
Kevin Kline
 
Toad tipstricksexpertinsight
Raj esh
 
Slick - The Structured Way
Yennick Trevels
 
SQL Server 2016 Temporal Tables
Davide Mauri
 
Troubleshooting K1000
Dell World
 
Indexes: The neglected performance all rounder
Markus Winand
 
Inventory Tips & Tricks
Dell World
 
Is there a SQL for NoSQL?
Arthur Keen
 
Hack your db before the hackers do
fangjiafu
 
Natural Born Killers, Performance issues to avoid
Richard Douglas
 
SSIS Monitoring Deep Dive
Davide Mauri
 
Wait Watchers ; Gain SQL Performance Increases Fast!
Richard Douglas
 
Campus days 2013 - Instrumentation
Anders Lybecker
 
Ten query tuning techniques every SQL Server programmer should know
Kevin Kline
 
Using Angular JS in APEX
Enkitec
 
Plantilla oracle
Uriel Barrales Garrido
 
50 Shades of Fail KScope16
Christian Berg
 
Thick Application Penetration Testing: Crash Course
Scott Sutherland
 
Understanding indices
Richard Douglas
 
A lap around microsofts business intelligence platform
Ike Ellis
 
Reduce latency and boost sql server io performance
Kevin Kline
 

Viewers also liked (8)

PDF
Ευτυχώς ηττηθήκαμε σύντροφοι - Τάκης Λαζαρίδης
AgnostosX
 
PPT
SQL 2005 Memory Module
Fabrício Catae
 
PPTX
DevOps 101 for data professionals
Alex Yates
 
PPSX
Memory management in sql server
Prashant Kumar
 
PPT
Rim Based Relational Database Design Tutorial September 2008
Abdul-Malik Shakir
 
PPTX
Sql Server 2014 In Memory
Ravi Okade
 
KEY
Augmenting RDBMS with MongoDB for ecommerce
Steven Francia
 
PPTX
Microsoft SQL Server internals & architecture
Kevin Kline
 
Ευτυχώς ηττηθήκαμε σύντροφοι - Τάκης Λαζαρίδης
AgnostosX
 
SQL 2005 Memory Module
Fabrício Catae
 
DevOps 101 for data professionals
Alex Yates
 
Memory management in sql server
Prashant Kumar
 
Rim Based Relational Database Design Tutorial September 2008
Abdul-Malik Shakir
 
Sql Server 2014 In Memory
Ravi Okade
 
Augmenting RDBMS with MongoDB for ecommerce
Steven Francia
 
Microsoft SQL Server internals & architecture
Kevin Kline
 
Ad

Similar to Sql server infernals (20)

PPTX
SQL Server 2012 Best Practices
Microsoft TechNet - Belgium and Luxembourg
 
PPTX
Sql good practices
Deepak Mehtani
 
PDF
Backpack Tools4 Sql Dev
Gonçalo Chaves
 
PPT
Performance Tuning And Optimization Microsoft SQL Database
Tung Nguyen Thanh
 
PPTX
Enough Blame for System Performance Issues
Mahesh Vallampati
 
PPTX
Building scalable application with sql server
Chris Adkin
 
PPTX
Top 10 DBA Mistakes on Microsoft SQL Server
Kevin Kline
 
PDF
Query Tuning for Database Pros & Developers
Code Mastery
 
PPTX
Optimizing Application Performance - 2022.pptx
JasonTuran2
 
PPTX
My Database Skills Killed the Server
ColdFusionConference
 
PDF
SQL Server Optimization Checklist
Grant Fritchey
 
PDF
Speed up sql
Kaing Menglieng
 
PDF
Designing for performance: Database Related Worst Practices
Trivadis
 
PPTX
Real World Performance - OLTP
Connor McDonald
 
PPTX
My Query is slow, now what?
Gianluca Sartori
 
PPTX
Query Optimization in SQL Server
Rajesh Gunasundaram
 
PPT
Kb 40 kevin_klineukug_reading20070717[1]
shuwutong
 
PDF
PostgreSQL worst practices, version FOSDEM PGDay 2017 by Ilya Kosmodemiansky
PostgreSQL-Consulting
 
PDF
Designing for Performance: Database Related Worst Practices
Christian Antognini
 
PPTX
The 5S Approach to Performance Tuning by Chuck Ezell
Datavail
 
SQL Server 2012 Best Practices
Microsoft TechNet - Belgium and Luxembourg
 
Sql good practices
Deepak Mehtani
 
Backpack Tools4 Sql Dev
Gonçalo Chaves
 
Performance Tuning And Optimization Microsoft SQL Database
Tung Nguyen Thanh
 
Enough Blame for System Performance Issues
Mahesh Vallampati
 
Building scalable application with sql server
Chris Adkin
 
Top 10 DBA Mistakes on Microsoft SQL Server
Kevin Kline
 
Query Tuning for Database Pros & Developers
Code Mastery
 
Optimizing Application Performance - 2022.pptx
JasonTuran2
 
My Database Skills Killed the Server
ColdFusionConference
 
SQL Server Optimization Checklist
Grant Fritchey
 
Speed up sql
Kaing Menglieng
 
Designing for performance: Database Related Worst Practices
Trivadis
 
Real World Performance - OLTP
Connor McDonald
 
My Query is slow, now what?
Gianluca Sartori
 
Query Optimization in SQL Server
Rajesh Gunasundaram
 
Kb 40 kevin_klineukug_reading20070717[1]
shuwutong
 
PostgreSQL worst practices, version FOSDEM PGDay 2017 by Ilya Kosmodemiansky
PostgreSQL-Consulting
 
Designing for Performance: Database Related Worst Practices
Christian Antognini
 
The 5S Approach to Performance Tuning by Chuck Ezell
Datavail
 
Ad

More from Gianluca Sartori (8)

PPTX
Benchmarking like a pro
Gianluca Sartori
 
PPTX
SQL Server 2016 New Security Features
Gianluca Sartori
 
PPTX
Responding to extended events in near real time
Gianluca Sartori
 
PPTX
Sql server security in an insecure world
Gianluca Sartori
 
PPTX
TSQL Advanced Query Techniques
Gianluca Sartori
 
PPTX
SQL Server Benchmarking, Baselining and Workload Analysis
Gianluca Sartori
 
PPTX
A performance tuning methodology
Gianluca Sartori
 
PPTX
SQL Server Worst Practices
Gianluca Sartori
 
Benchmarking like a pro
Gianluca Sartori
 
SQL Server 2016 New Security Features
Gianluca Sartori
 
Responding to extended events in near real time
Gianluca Sartori
 
Sql server security in an insecure world
Gianluca Sartori
 
TSQL Advanced Query Techniques
Gianluca Sartori
 
SQL Server Benchmarking, Baselining and Workload Analysis
Gianluca Sartori
 
A performance tuning methodology
Gianluca Sartori
 
SQL Server Worst Practices
Gianluca Sartori
 

Recently uploaded (20)

PPTX
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
PDF
TrustArc Webinar - Navigating APAC Data Privacy Laws: Compliance & Challenges
TrustArc
 
PDF
Bridging CAD, IBM TRIRIGA & GIS with FME: The Portland Public Schools Case
Safe Software
 
PDF
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
Fwdays
 
PDF
Unlocking FME Flow’s Potential: Architecture Design for Modern Enterprises
Safe Software
 
PDF
LLM Search Readiness Audit - Dentsu x SEO Square - June 2025.pdf
Nick Samuel
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PPTX
Smart Factory Monitoring IIoT in Machine and Production Operations.pptx
Rejig Digital
 
PDF
Next level data operations using Power Automate magic
Andries den Haan
 
PDF
Darley - FIRST Copenhagen Lightning Talk (2025-06-26) Epochalypse 2038 - Time...
treyka
 
PPTX
Reimaginando la Ciberdefensa: De Copilots a Redes de Agentes
Cristian Garcia G.
 
PPSX
Usergroup - OutSystems Architecture.ppsx
Kurt Vandevelde
 
PDF
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
PDF
Understanding AI Optimization AIO, LLMO, and GEO
CoDigital
 
PPTX
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
PDF
5 Things to Consider When Deploying AI in Your Enterprise
Safe Software
 
PPTX
The birth and death of Stars - earth and life science
rizellemarieastrolo
 
PDF
How to Comply With Saudi Arabia’s National Cybersecurity Regulations.pdf
Bluechip Advanced Technologies
 
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
TrustArc Webinar - Navigating APAC Data Privacy Laws: Compliance & Challenges
TrustArc
 
Bridging CAD, IBM TRIRIGA & GIS with FME: The Portland Public Schools Case
Safe Software
 
''Taming Explosive Growth: Building Resilience in a Hyper-Scaled Financial Pl...
Fwdays
 
Unlocking FME Flow’s Potential: Architecture Design for Modern Enterprises
Safe Software
 
LLM Search Readiness Audit - Dentsu x SEO Square - June 2025.pdf
Nick Samuel
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Smart Factory Monitoring IIoT in Machine and Production Operations.pptx
Rejig Digital
 
Next level data operations using Power Automate magic
Andries den Haan
 
Darley - FIRST Copenhagen Lightning Talk (2025-06-26) Epochalypse 2038 - Time...
treyka
 
Reimaginando la Ciberdefensa: De Copilots a Redes de Agentes
Cristian Garcia G.
 
Usergroup - OutSystems Architecture.ppsx
Kurt Vandevelde
 
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
Understanding AI Optimization AIO, LLMO, and GEO
CoDigital
 
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
5 Things to Consider When Deploying AI in Your Enterprise
Safe Software
 
The birth and death of Stars - earth and life science
rizellemarieastrolo
 
How to Comply With Saudi Arabia’s National Cybersecurity Regulations.pdf
Bluechip Advanced Technologies
 

Sql server infernals

  • 1. SQL Server Infernals A Beginner’s Guide to SQL Server Worst Practices Gianluca Sartori @spaghettidba
  • 2. Gianluca Sartori Independent SQL Server consultant SQL Server MVP, MCTS, MCITP, MCT Works with SQL Server since version 7 DBA @ Scuderia Ferrari Blog: spaghettidba.com Twitter: @spaghettidba
  • 3. Agenda  Best practices or Worst practices?  What can go wrong?  Design  Development  Installation  Administration
  • 4. Disclaimer:  Not everything is black or white  «It depends» is the most likely answer There are edge cases when some of these worst practices are the only possible solution, or not such a bad idea…
  • 5. Best Practices vs. Worst Practices  Why Best Practices are not enough  Too many  No time  Lack of experience  Not always clear what happens if we don’t follow them  Why Worst Practices help  They show the mistakes to avoid  We can learn from someone else’s mistakes
  • 6. Worst Practices Areas Design Development Installation Administration Schema design Naming Data Types Environment HW validation OS configuration SQL installation Recovery Security Capacity Performance Monitoring Code Test
  • 7. SQL Server Infernals  Worst Practices are sins that will put you in the SQL Server hell!!  I will guide you through the circles, as Virgil did with Dante
  • 9. Schema Design  Not normalizing the schema  1NF: A primary key, atomic attributes only  2NF: Every attribute depends on the whole key  3NF: Every attribute depends only on the key «The key, the whole key, nothing but the key, so help me Codd»
  • 10. Clues of denormalization  Repeating data  redundancies  Inconsistent data between tables anomalies  Data separated by «,»  Ex: [email protected], [email protected]  Structured data in «notes» columns  Columns with a numeric suffix  Ex: Zone1, Zone2, Zone3 …
  • 12. Lookup Tables Orders PK order_id int order_date datetime FK2 customer_id int FK1 status_id char(2) FK3 priority_id tinyint Order_Status PK status_id char(2) status_description nvarchar(50) Customers PK customer_id int name varchar(100) address varchar(50) ZIP char(5) city nvarchar(50) FK2 state_id char(2) FK1 country_id char(3) Countries PK country_id char(3) description nvarchar(50) States PK state_id char(2) description nvarchar(50) Order_Priorities PK priority_id tinyint priority_description nvarchar(50) One lookup table for each attribute
  • 13. OTLT: One True Lookup Table Orders PK order_id int order_date datetime FK1 customer_id int status_id char(2) priority_id tinyint Customers PK customer_id int name nvarchar(100) address nvarchar(50) ZIP char(5) city nvarchar(50) state_id char(2) country_id char(3) LookupTable PK table_name sysname PK lookup_code nvarchar(500) lookup_description nvarchar(4000) CREATE TABLE LookupTable ( table_name sysname, lookup_code nvarchar(500), lookup_description nvarchar(4000) ) One lookup table for all attributes
  • 14. OTLT: One True Lookup Table  No Foreign Keys  Generic data types  nvarchar(SomeHighNumber) Implicit Conversions, Incorrect Data, Huge memory grants…  CHECK constraints may help to a point…  Locking CHECK( CASE WHEN lookup_code = 'states' AND lookup_code LIKE '[A-Z][A-Z]' THEN 1 WHEN lookup_code = 'priorities' AND lookup_code LIKE '[0-9]' THEN 1 WHEN lookup_code = 'countries' AND lookup_code LIKE '[0-9][0-9][0-9]' THEN 1 WHEN lookup_code = 'status' AND lookup_code LIKE '[A-Z][A-Z]' THEN 1 ELSE 0 END = 1 )
  • 15. EAV: Entity, Attribute, Value Customers PK customer_id int name nvarchar(100) address nvarchar(50) ZIP char(5) city nvarchar(50) state_id char(2) country_id char(3) AttributeNames PK attribute_id int PK,FK1 entity_id int attribute_name nvarchar(128) AttributeValues PK,FK1 attribute_id int PK,FK1 entity_id int PK,FK2,FK3 id int value nvarchar(4000) Entities PK entity_id int entity_name nvarchar(128) Orders PK order_id int order_date datetime customer_id int status_id char(2) priority_id tinyint
  • 16. EAV: Entity, Attribute, Value Disadvantages:  Generic data types  Ex: varchar(4000)  No Foreign Keys  No CHECK constraints  Multiple accesses to the same table  One access per attribute Advantages  Dynamic schema: no need to alter the database  Replication, distributed environments
  • 17. EAV: Entity, Attribute, Value  Reporting is insanely hard.  Writing to the EAV schema is a mess  Workaround:  Reads: PIVOT / Crosstab  Writes: View + INSTEAD OF triggers  Alternatives:  SPARSE columns  XML/JSON  Key-value store databases  Document-oriented databases
  • 20. Data type Worst Practices  Numeric data types for non-numeric data  Storing data as their human-readable representation  Using deprecated data types  Using larger data types “just in case”  Using variable length data types for fixed size data  Storing durations in date/datetime columns  Getting Unicode wrong  Using different data types for the same data in different tables
  • 22. Chaos Belongs to Hell  No Primary Key o surrogate keys only «identity» is not the only possible key!  No Foreign Keys They’re «awkward»  No CHECK constraint The application will guarantee consistency…  Wrong data types  Data type is the 1° constraint on the data  Use of NULL where not appropriate  Use of «dummy» data (ex: ‘.’ , 0)
  • 24. Damnation by Namification  Hungarian Notation (AKA «tibbing»)  Insanely short names  Insanely long names  Mixing languages  Using the «sp_» prefix  Using reserved words or illegal characters  Using system generated constraint names  No naming convention or multiple naming conventions Hungary is a nice str_country
  • 26. Pollutors will be prosecuted  Developing in production  Using the test environment for development  Using a shared database for development  No source control  Developing with sysadmin privileges  Developing on a different version/edition from production (less problematic after 2016 SP1)
  • 28. Pessimists are Optimists with Experience  Not testing all the code Use meaningful data volumes  Testing in production Can alter production data Interferes with production users  Testing in development environment Useful at most for unit tests
  • 30. Development Worst Practices  No transactions  No error handling @@ERROR is a thing of the past!  Wrong isolation levels NOLOCK = no consistency!  SELECT *  Dynamic SQL with concatenated params  Code vulnerable to SQL injection  No abstraction layer Views, Functions, Stored Procedures It’s all about laziness
  • 32. HW Worst Practices  Using inadequate or unbalanced HW  Reusing decommissioned servers for new installations  Slower CPUs (license costs the same on fast CPUs)  Less RAM supported  Planning storage with capacity in mind  Choosing the wrong RAID level
  • 33. CIRCLE 10: Next next finish installers
  • 34. Installation Worst Practices  Installing accepting all the defaults  Data files on the system drive  MAXDOP = 0  Max Server Memory = +∞  Installing unused components  Installing multiple services on the same machine  Giving up easy wins on I/O  Partition misalignment  Using the default allocation unit (4Kb)
  • 36. What does a database need?
  • 37. Backup and Recovery Worst Practices  No backup  With FULL recovery it’s a timebomb  Ignoring RPO and RTO (it’s not your decision!)  No test restores  No consistency checks  DBCC REPAIR_ALLOW_DATA_LOSS as default response to corruption Our responsibility is to perform restores, not backups!
  • 38. Security Worst Practices  Too many sysadmins  Everyone authenticating as ‘sa’  Using SQL Authentication  Weak passwords  123  P4$$w0rd  Same as username  No auditing on sensitive data
  • 39. Capacity Management Worst Practices  Not checking disk space  No space left = database halted!  FULL recovery and no log backups?  Relying 100% on autogrowth  Autoshrink  Autoclose  Not presizing tempdb Different file size = latching (and striping) penalty
  • 40. Maintenance Worst Practices  Not maintaining indexes and statistics  Obsessing over maintaining indexes and statistics  Using catch-all maintenance plans
  • 42. Performance Tuning Easier to implementMore effective
  • 43. Query Optimization Worst Practices RBAR: Row By Agonizing Row  Cursors  WHILE loops  App-side cursors  Scalar and multi-statement functions
  • 44. Query Optimization Worst Practices Views on views on views… Might look like a brilliant idea at first (code re-use FTW!)  You can end up losing control  Unneeded multiple accesses to the same tables  Unnecessary JOINs
  • 46. Query Optimization Worst Practices  One query to rule them all The optimizer is good, not perfect «divide et impera» delivers better performance  DISTINCT in all queries … because “who wants stinkin’ duplicates?”  Query HINTs all over the place Especially index hints
  • 47. Indexing Worst Practices  Accepting all suggestions from Tuning Advisor  Duplicate indexes  An index for each column  Indexes are not for free!  Suboptimal Clustered Index  Unique  Small  Unchanging  Ever increasing or decreasing NEWSEQUENTIALID() NEWID()
  • 48. Server Tuning Worst Practices  «Throwing HW» at the problem  A 2x faster machine might make RBAR code 2x faster  Using set-based code might make it 500x faster  Using «advanced» options without testing  NT Fibers (lightweight pooling)  Priority Boost
  • 49. Resources Detailed blog posts on spaghettidba.com One post for each circle: https://spaghettidba.com/category/sql-server/sql-server-infernals/
  • 50. Resources Free Tool: Best Practices Analyzer  Highlights configuration parameters that don’t comply with best practices  Highlights potential problems  Offers recommendations http://www.microsoft.com/en-us/download/details.aspx?id=15289
  • 51. SQL Server Infernals A Beginner’s Guide to SQL Server Worst Practices https://groupby.org/go/session5 Contact: [email protected] More infernal stuff: https://spaghettidba.com/category/sql-server/sql-server-infernals/

Editor's Notes

  • #5: Lo scopo non è criticare, ma far capire errori che io per primo ho fatto nella mia carriera
  • #25: Agganciare la worst practice trascurabile sp_ con Worst Practice tremenda OTLT!!