|Performance Tuning Tips, cont.
2. Distribute I/O!
Our server was configured to separate the SQL Server data files from the log files, which is generally a good
idea, for reasons of both performance and recoverability. All the data files were on one RAID 5 array, and all
of the log files were on another. But we were running out of space on the data drive, so I expanded the
databases, adding files on the array used for the logs. This resulted in another half hour of time saved in the
copy phase. This time I was the one that was surprised. The copy statements were written using the
insert myTable select * from openquery(OracleServer, ‘select … from myOracleTable’)
An examination of the query plans for the copy statements revealed the reason, namely that data to be
inserted from such a statement is first put into tempdb as an intermediate step. Thus, the insert statement
was making the data drive (which tempdb was on) do much more work (write to tempdb, read from tempdb,
write to permanent table) than the log drive, which just wrote to the transaction log. Putting some of the data
on the log drive distributed the I/O more evenly. Eventually I took this further, putting tempdb entirely on its
own array (RAID 1, in this case) and later on making use of two additional disk arrays as well.
This idea can be extended to the level of individual tables, and even indexes, by using filegroups (read about
filegroups in Books Online). It is debatable whether or not manually specifying the placement of tables and
indexes on specific drives is worthwhile, compared to simply giving the server lots of drives to work with and
letting it decide on placement. It probably depends on the situation, and how well one actually understands
the data access and usage patterns in the particular system involved. I chose to manually place several of
the largest tables and indexes on specific drives, and was rewarded by significant speedups.
Either way, distributing disk I/O across as many drives as possible adds a transparent form of parallelism,
and helps tremendously to reduce I/O bottlenecks. One should keep this principle in mind when ordering
hardware as well; additional disk drives not only add capacity, they can also add speed. In one instance,
putting the two big tables read by a (45 minute) query on separate drives, and the third table it wrote to on yet
another drive reduced its run time by 12 minutes. Later on, a further 12 minutes on this particular query was
gained by another method:
|<Previous Home Next>