четверг, 2 сентября 2010 г. - www.msmirnov.ru

Небольшой сравнительный домашний тест SSD и HDD для SQL Server.

Итак, в мои руки попало SSD-устройство Intel X25-V, чью производительность я и решил проверить через призму работы с базами данных.
Версия устройства, конечно, не серверная, но, как говорится, что имеем то и тестим.

Итак, я создал две новые базы SQL Server 2008 - одну на HDD (Seagate ST380815 - старая модель, но так даже лучше - видна динамика), другую на SSD и выполнял на них идентичные запросы.

Перед каждым тестом я сбрасывал буферы SQL Server.

Изначально я создал по одной таблице в каждой базе:

create table TestTable (ID int identity (1, 1), dt datetime, TextData varchar (255))

Сначала проверил последовательную вставку 1 000 000 записей:

declare @i int, @d int
declare @dt datetime

set @i = 1
 while @i <= 1000000
  begin
    set @d = convert (int, (RAND () * 365))
    set @dt = dateadd (day, @d, '2010-01-01')

    insert into TestTable (dt, TextData)
    values (@dt, convert (varchar (255), NEWID ()))

    set @i = @i + 1
  end

Результат: HDD - 4:45,  SSD - 3:03


Затем я выполнил массовую вставку 1000000 записей:

select * into TestTable2
from TestTable
 
Результат: HDD - 0:08, SSD - 0:03
 
 
Далее - создание кластерного индекса.
 
create clustered index cIndex on TestTable (dt)
 
Результат: HDD - 0:07, SSD - 0:04



Случайное чтение 100 000 записей индексированной таблицы:


declare @i int, @d int
declare @dt datetime
declare @TextData varchar (255)

set @i = 1

while @i <= 100000
  begin
    set @d = convert (int, (RAND () * 365))

    set @dt = dateadd (day, @d, '2010-01-01')

    select @TextData = TextData from TestTable where dt = @dt

    set @i = @i + 1
  end


Результат: HDD - 1:57, SSD - 1:38  


Случайное чтение 1 000 записей неиндексированной таблицы:


declare @i int, @d int
declare @dt datetime
declare @TextData varchar (255)

set @i = 1

while @i <= 1000
  begin
    set @d = convert (int, (RAND () * 365))

    set @dt = dateadd (day, @d, '2010-01-01')

    select @TextData = TextData from TestTable2 where dt = @dt

    set @i = @i + 1
  end


Результат: HDD - 1:38, SSD - 1:39  
Как видим, здесь оценить разницу не удалось, поскольку вся таблица целиком была скеширована при первом обращении и в дальнейшем происходила работа уже с кешем, а не с физическим носителем.

Последовательное чтение записей индексированной таблицы:

select *
from TestTable
where dt between '2010-05-01' and '2010-06-30'

Результат: HDD - 206 мс, SSD - 36 мс


Последовательное чтение записей неиндексированной таблицы:

select *
from TestTable2
where dt between '2010-05-01' and '2010-06-30'

Результат: HDD - 70 мс, SSD - 11 мс

Еще раз приведу итоги своего тестирования в сводной таблице

ОперацияHDDSSD
Последовательная вставка 1 000 000 записей4:453:03
Массовая вставка 1 000 000 записей0:080:03
Создание кластерного индекса0:070:04
Случайное чтение 100 000 записей индексированной таблицы1:571:38
Случайное чтение 1 000 записей неиндексированной таблицы1:381:39
Последовательное 100 000 чтение записей индексированной таблицы206 мс36 мс
Последовательное 100 000 чтение записей неиндексированной таблицы70 мс11 мс

Мой вывод - на всех операциях SSD быстрее, особенно на массовых.
Мой сайт - www.msmirnov.ru