FILESTREAM Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Enabling FILESTREAM Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Creating FILESTREAM Filegroups . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
FILESTREAM-Enabling Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Accessing FILESTREAM Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
■CHAPTER 18 Error Handling and Dynamic SQL . . . . . . . . . . . . . . . . . . . . . . . . . 553
Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Legacy Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Try...Catch Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
The RAISERROR Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Debugging Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
PRINT Sta
tement Debugging
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Trace Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
SSMS Integrated Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Visual Studio T-SQL Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Dynamic SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
The EXECUTE Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
SQL Injection and Dynamic SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Troubleshooting Dynamic SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
The sp_executesql Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Dynamic SQL and Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Client-Side Parameterization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Summar
y
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
■CHAPTER 19 Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
SQL Ser
ver Storage
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
573
Files and Filegroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Space Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Data Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
590
Heaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Clustered Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
591
Nonclustered Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Filtered Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Optimizing Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Reading Query Plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
■CONTENTSxiv
10016FM.qxp 7/23/08 7:58 AM Page xiv