Among the regular tasks of any DBA, there’s one thing that we all must find time for: research. In my case, I concentrate my investigation into new tools that streamline the tasks that I already do. With that idea in mind, I started taking a close look at the SQL 2005 Beta, wondering: could tools like the new Database Tuning Advisor (DTA) improve the choice of indexes for SQL Server 2000 databases? In order to answer this question, I used a real client database. I thought it wasn’t adequate to use a test database, so instead I chose one that I was optimizing at the moment. To begin with, I used SQL 2000 Profiler in order to capture a query from the real client application.
Analysis Using the SQL Server 2000 Index Tuning Wizard (ITW)
The query I was analyzing was:
SELECT DISTINCT t.date AS c0,
c.prefijoext AS c1,
c.numeroext AS c2,
c.checkbook AS c3
FROM Transac t (nolock)
join cmpasociados c (nolock)
on t.nrotrans = c.nrotrans
join tiposcmp you (nolock)
on c.codcmp = you.codcmp
join checkbooks so (nolock)
on c.checkbook = so.checkbook
and t.codemp = so.codemp
WHERE T.Nrotranselim is null
AND (CASE WHEN T.Codcmp in (‘ CÁ, ‘ CC’, ‘ CB’, ‘ CÉ, ‘ LR’, ‘ LÓ, ‘ LP’, ‘ CZ’, ‘ VÁ, ‘ VB’, ‘ VC’, ‘ YOU GO, ‘ VZ’) THEN T.Nrotransaut
WHEN T.Codcmp in (‘ IÉ, ‘ EÉ, ‘ RD’) THEN T.Nrotransctrl
ELSE T.Nrotrans END) is not null
AND (t.CodEmp is null
or t.codemp = 1)
AND c.checkbook = 25
AND t.codsuc = 1
ORDER BY C2 DESC
This query, copied into Query Analyzer, generates the following execution plan:
The statistics of the query execution showed the following values:
170259 row(s) affected)
Table ‘ TRANSAC’. Scan count 1, logical reads 31004, physical reads 1065, read-ahead reads 29512.
Table ‘ CMPASOCIADOS’. Scan count 1, logical reads 8482, physical reads 0, read-ahead reads 4393.
Table ‘ TIPOSCMP’. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 2.
Table ‘ TALONARIOS’. Scan count 1, logical reads 2, physical reads 2, read-ahead reads 0.
After observing the results, I executed the ITW, which generated the following index recommendations: CREATE NONCLUSTERED INDEX [ IXC2000_TRANSAC27 ] ON [ dbo ].[ TRANSAC ] ([ NROTRANS ] ASC, [ DATE ] ASC, [ CODCMP ] ASC, [ NROTRANSELIM ] ASC, [ CODSUC ] ASC, [ NROTRANSAUT ] ASC, [ CODEMP ] ASC, [ NROTRANSCTRL ] ASC) CREATE NONCLUSTERED INDEX [ IXC2000_CMPASOCIADOS28 ] ON [ dbo ].[ CMPASOCIADOS ] ([ NROTRANS ] ASC, [ CODCMP ] ASC, [ CHECKBOOK ] ASC, [ PREFIJOEXT ] ASC, [ NUMEROEXT ] ASC)
The expected percentage of improvement using these indexes was 52%.