To improve performance, SQL Server maintains a cache of the previously
read and/or modified ("dirty") pages. Periodically, these pages are
physically written to the disk, ensuring that the changes to any rows
are reflected in user databases.
SQL Server will flush pages from the cache to the disk under the
following conditions:
- When a checkpoint is issued.
   There are five conditions that can cause a checkpoint to be issued:
   a. The database owner or the system administrator (SA) can issue a
      CHECKPOINT command at any time.
   b. When a DUMP DATABASE or DUMP TRANSACTION command is issued, the
      first step of the DUMP process is to do a checkpoint in that
      database.
   c. A checkpoint is issued in each database after the recovery
      process has finished recovering that database. This feature can
      be disabled by using the sp_dboption system procedure with the
      "no chkpt on recovery" option set to true.
   d. A checkpoint will automatically be issued by the checkpoint
      checking process when it determines that enough transactions
      have occurred since the last checkpoint. Although the checkpoint
      checking process wakes up about once per minute to see how much
      activity has taken place, the frequency with which it actually
      does a checkpoint is determined by the number of transactions
      and the value that has been set for the recovery interval. Note
      that if the "trunc. log on chkpt." option has been set using
      sp_dboption, a checkpoint will occur every time the checkpoint
      checking process wakes up (about once per minute).
   e. A checkpoint is issued when the SA issues the SHUTDOWN command.
 - When a new page needs to be brought into the cache.
   When SQL Server determines that a page is needed that is not
   currently in the cache, it looks for a free buffer in the cache
   page chain. When it has finished going through the chain, the page
   from the oldest buffer is flushed to disk.
 - At the end of a fast bulk copy or SELECT INTO.
   When the fast BCP (non-logged version) is used, or when a table is
   created using SELECT INTO, the newly-inserted rows are not logged.
   Also, many or all of them may still be in the cache. To lessen the
   chance of losing data in the event that SQL Server is stopped
   without a checkpoint, all dirty pages are flushed to disk when the
   BCP or SELECT INTO finishes.
 - Log pages are flushed when a transaction ends.
   When a transaction ends, either with a COMMIT or ABORT, the log
   pages are flushed to disk.
 - When a page is split, the newly allocated page is immediately
   flushed to disk.
 - LOAD DATABASE writes all pages to disk.
   When a database is being loaded with the LOAD DATABASE command, all
   pages in the dump are written directly to disk. In addition, any
   pages in the database that are not in the dump are also initialized
   and flushed to disk. For example, if you are loading a dump from a
   4 MB database into a 10 MB database, the remaining 6 MB of pages
   will all be initialized and written to disk.
 - LAZY WRITER process flushes dirty pages.
   A new system process, Lazywriter, has been added to Microsoft SQL
   Server version 4.21. The Lazywriter process automatically starts
   flushing buffers when the number of available free buffers falls below
   a certain threshold, and it stops flushing buffers when this number
   goes ~5-6% above the threshold. This threshold value is specified as a
   percentage of the total number of buffers in the buffer cache. The
   default threshold is set to 3% of the buffers in the data cache. For
   more information refer to the Microsoft SQL Server Version 4.21 release
   notes (\sql\install\readme.txt).