Database
 sql >> база данни >  >> RDS >> Database

Незабавна инициализация на файл:Въздействие по време на настройката

Наскоро Ерин Стелато (@erinstellato) публикува блог за въздействието върху производителността, което може да има незабавната инициализация на файл (IFI) при създаване или възстановяване на бази данни. Тя обяснява, че настройката на SQL Server 2016 вече ви предлага възможността да предоставяте съответните права на услугата SQL Server по време на инсталацията (ние също говорихме за това в раздела CTP 3.0 на най-новите версии на SQL Server 2016):

Сега можете да активирате незабавна инициализация на файл по време на настройка на SQL Server

Ключът е нова опция (която също можете да посочите в конфигурационен файл):

SQLSVCINSTANTFILEINIT="Вярно|Невярно"

Хубаво е, че наистина можете да намалите времето, необходимо за създаване или възстановяване на бази данни по-късно, без да се налага да се сещате да влизате в gpedit, да задавате правилно правата и да рестартирате услугата. Но много по-голямо предимство за мен е възможността да конфигурирам по-големи tempdb файлове по време на настройката, като се възползвате от ранното предимство на IFI.

Сега има някои ограничения по време на настройката; например, броят на tempdb файловете е ограничен до 8 (или броя на ядрата, което от двете е по-малко), а размерът на всеки файл може да достигне максимум 1024 MB. Тези ограничения се прилагат в потребителския интерфейс и си помислих, че може да успея да ги заобиколя, като посоча по-големи размери в конфигурационен файл за инсталация без надзор, но и това не проработи. (В регистрационните файлове пишеше:„Стойността 8192 за размера на TempDB файла надвишава 1024 MB и може да окаже влияние върху времето за инсталиране. Можете да го зададете на по-малък размер и да го промените след инсталацията.“) Лично аз смятам, че в този ден и възраст, със скоростта и размера на хранилището, което можем да получим, ограничението от 1 GB за размера на файла с данни е изкуствено ниско. Затова подадох предложение за свързване:

  • Свързване #2457759 :tempdb файловете с данни не трябва да са ограничени до 1024 MB

След това беше посочено, че Brent Ozar (@BrentO) е подал подобен елемент по-рано в цикъла на CTP, когато ограничението всъщност е наложено като 256 MB вместо 1 GB:

  • Свързване #1841076 :началният размер за настройка на TempDB е твърде нисък

Нямам чудовищни ​​машини, които да поддържат 64 x 1 GB файлове и това също не би било реалистичен тест, така че реших да тествам въздействието на IFI върху 8 tempdb файла с данни от 1 GB всеки. Аз съм нещо от старото училище, така че създадох четири различни .ini файла и подчертах редовете, които бих променил за всеки тест (исках да направя базова минимална инсталация с файловете с данни 4 x 8 MB, използвайки IFI и не и след това го сравнете с 8 x 1024 MB файлове). Тъй като щях да изпълнявам тези цикли няколко пъти, беше важно да използвам различни имена на екземпляри в зависимост от това дали IFI е активиран или не, защото след като предоставите правото на акаунт за услуга, то не се отнема чрез просто премахване на екземпляра (и можех да настроя тези акаунти независимо, но исках да направя тези тестове лесни за възпроизвеждане).

;SQL Server 2016 RC0 конфигурационен файл
[ОПЦИИ]
ACTION="Инсталиране"
ENU="True"
QUIET="Вярно"
QUIETSIMPLE="False"
UpdateEnabled="False"
ERRORREPORTING="False"
USEMICROSOFTUPDATE="False"
FEATURES=SQLENGINE
HELP="False"
INDICATEPROGRESS=" False"
INSTALLSHAREDDIR="C:\Program Files\Microsoft SQL Server"
INSTALLSHAREDWOWDIR="C:\Program Files (x86)\Microsoft SQL Server"
INSTANCENAME="ABTESTIFI_ON"
INSTANCEID="ABTESTIFI_ON"
SQLTELSVCSTARTUPTYPE="Деактивирано"
INSTANCEDIR="C:\Program Files\Microsoft SQL Server"
AGTSVCACCOUNT="NT Authority\System"
AGTSVCSTARTUPTYPE ="Ръчно"
SQLSVCSTARTUPTYPE="Ръководство"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="NT Service\MSSQL$ABTESTIFI_ON"
;Вярно за IFI =OFF, F :
SQLSVCINSTANTFILEINIT="False"
SQLSYSADMINACCOUNTS="NT Authority\System"
SQLTEMPDBFILECOUNT="8"
;1024 за общо 8 GB, 8 за общо 64 MB:
SQLTEMPD BFILESIZE="1024"
SQLTEMPDBFILEGROWTH="64"
SQLTEMPDBLOGFILESIZE="8"
SQLTEMPDBLOGFILEGROWTH="64"
BROWSERSVCSTARTUPTYPE="Ръчно"

И ето партидния файл, който използвах (поставен в същата папка като конфигурационните файлове), който инсталира и след това деинсталира инстанцията, използвайки всяка комбинация три пъти, и записва времената за настройка в текстов файл – игнорира деинсталирането и почистването.

echo Начален тест...
@echo изключен 2>nul
setlocal enabledelayedexpansion
set outputfile=time.txt
echo.> %outputfile%
rem Премахнете Eight и/или Sixteen, ако имате само 4 ядра!
ЗА %%e IN (Baseline Four Eight Sixteen) НАПРАВЕТЕ (
ЗА %%x IN (IFI_ON IFI_OFF) DO (
FOR /L %%A IN (1,1,3) DO (
echo INSERT #x VALUES('%%e', '%%x', '!TIME!) ',>> %outputfile%
D:\setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ConfigurationFile=%%e_%%x.ini
echo '!TIME!' ^)>> %outputfile%
D:\setup.exe /Q /ACTION=ДЕИНСТАЛИРАНЕ /ИМЕ НА ИНСТАНЦИЯ=ABTEST%%x /FEATURES=SQL
rem del /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST %%x\*.*"
rem rd /Q /S "C:\Program Files\Microsoft SQL Server\MSSQL13.ABTEST%%x\"
)
)
)
@echo on
echo …тестът завършен.

Няколко бележки:

  • Може да се наложи да промените двата реда от D:\setup.exe до пътя до директорията за настройка.
  • Може да се наложи да рестартирате системата си, преди да стартирате това.
  • Ще искате да стартирате пакетния файл от команден ред с повишени стойности, така че UAC да не ви прекъсва при всяка итерация.

Проведох тестове на три различни системи:

  • Виртуална машина с Windows 10 с 4 ядра и SSD съхранение
    Базов тест от 4 x 8MB и след това 4 x 1024 MB
  • Виртуална машина с Windows 10 с 8 ядра и PCIe съхранение
    Базов тест от 4 x 8 MB, 4 x 1 024 MB, 8 x 1 024 MB
  • Виртуална машина за Windows 2012 R2 с 16 ядра и двуканален RAID 10 масив от 8 10K SAS устройства
    Базов тест от 4 x 8MB, 4 x 1024 MB, 8 x 1024 MB и 16 x 1024 MB

Изходните файлове генерират куп изрази за вмъкване, които мога да поставя тук:

CREATE TABLE #x
(
  [server] varchar(32),
  [test]   varchar(32),
  [start]  time(2),
  [end]    time(2)
);
 
-- inserts pasted here
 
SELECT [server],[test],AVG(DATEDIFF(SECOND,[start],[end])*1.0)
FROM #x
GROUP BY [server],[test];

Ето времената за десет теста всеки, осреднени и закръглени (щракнете, за да увеличите):

Предвидимо, IFI става важен с по-големи файлове на по-бавни устройства

Настройката отнема малко повече от минута (колко е хубаво да стартирате настройката без инструменти за управление). Единственото отклонение наистина беше, когато размерите на файловете започнаха да се увеличават на механичните устройства и с деактивирана незабавна инициализация на файлове. Не мога да се преструвам, че съм шокиран от това.

Заключение

Ако сте на SSD или PCIe, незабавната инициализация на файл не може да влоши нещата, но няма ясна полза по време на настройката, стига архаичните ограничения за размера на файла за tempdb файлове с данни да останат непокътнати. С настоящите правила не изглежда възможно да се тества това въздействие отвъд (1 GB x броя на наличните ядра). Ако използвате бавни механични устройства обаче, има забележима разлика, дори когато инициализирате само 8 GB или 16 GB данни – това нулиране е доста скъпо, когато главите на диска трябва да се движат. Въпреки това, дали настройката отнема 75 секунди или 2 минути, е доста незначително в голямата схема на нещата (освен ако не инсталирате стотици сървъри, но не автоматизирате това по някаква причина), така че мисля, че по-голямото предимство тук е удобството - не трябва да не забравяте да предоставите на акаунта за услугата правата за обем, необходими известно време след като инсталацията е успешна. Ако се замислите, тази нова опция за конфигурация всъщност може да се изплати много по-добре при автоматизирани инсталирания на голям брой сървъри, извън всяко спестено време по време на действителната инсталация.

  • Изтеглете конфигурационните файлове и пакетния файл

(Следващият ми тест ще разгледа времето, необходимо за разширяване на съществуващите tempdb файлове до много по-голям размер от 1024 MB след инсталация .)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. FORMAT() е хубаво и всичко, но...

  2. Как да класифицирате, намирате и маскирате PII в бази данни...

  3. Модификации на данни при изолация на четене на ангажирани моментни снимки

  4. ER диаграми в IRI Workbench

  5. Как да започнете с Amazon ECS и Amazon Fargate