pirmdiena, 2012. gada 16. jūlijs

SQL Server: Tūlītēja faila inicializācija

[Angliskais termins: "Instant File Initialization"] Veidojot/palielinot SQL Server datu bāzes datu failu tas tiek aizpildīts ar nullēm, lai dzēstu attiecīgajā diska apgabalā esošos datus. ja tiek izmantota tūlītēja faila inicializācija, tad šī nullēšanas daļa tiek izlaista, tādējādi būtiski paātrinot faila izveidi.

Kad tas uzlabo ātrdarbību:
  • Veidojot jaunu datu bāzi (tas attiecas tikai uz datu failiem. Uz log failu nē);
  • Atjaunojot datu bāzi no rezerves kopijas (atjaunojot no rezerves kopijas, no sākuma tiek izveidota datu bāze vajadzīgajā izmērā un tad atjaunoti dati. Tātad, pirmais posms kļūst daudz ātrāks);
  • Brīdī, kad notiek datu bāzes faila palielināšana (kad notiek faila automātiska palielināšana vai arī, ja to dara manuāli izmantojot T-SQL);
  • Startējot SQL Server instanci (katru reizi tiek veidota tempdb datu bāze, tās izveide notiek ātrāk. Tas spēlē lomu, ja maina tempdb sākotnējo izmēru SQL Server. Ja nu kas, to darīt ir labā prakse)
Ierobežojumi:
  • Neattiecas uz LOG failiem;
  • Drošības caurums, gadījumā, ja SQL Server administrators nav Windows administrators. Šādā gadījumā SQL Server administrators var piekļūt OS dzēstajiem datiem. Šis fakts gan realitātē ļoti, ļoti, ļoti retos gadījumos var kļūt par īstu "drošības caurumu".
  • Ja darbojas TDE, tad šī iespēja nevar tikt izmantota. Arī Retinātie faili (Sparse files) šo iespēju neizmanto un tas arī nav nepieciešams retināto failu gadījumā.
Konfigurēšana:
Lai izmantotu šo iespēju SQL Server instances kontam (service account) jāpiešķir tiesības "Perform volume maintenance tasks" jeb savādāk apzīmē "SE_MANAGE_VOLUME_NAME".

Pa soļiem:
  • Ir jāzina, ar kādu kontu strādā SQL Server. Interesants veids kā to izdarīt izmantojot T-SQL (avots):
    DECLARE @serviceaccount varchar(100)

    EXECUTE master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'SYSTEM\CurrentControlSet\Services\MSSQLSERVER',
    N'ObjectName',
    @ServiceAccount OUTPUT,
    N'no_output'

    SELECT @Serviceaccount
  • Administrative Tools -> Local Security Policy, pēc tam Local Policies -> user Rights Assignment -> Perform volume maintenance tasks:
  • Pievienojam servisa kontu add user or group:
  • (Ja tiek izmantots SQL Server Klasteris, šis jāatkārto visiem datoriem)
  • Pārstartē SQL Server instanci
"Vietējais" tests:
Testu veicu pāris reizes izveidojot tukšu datu bāzi.
CREATE DATABASE [CreateTimeTest] ON  PRIMARY
(
    NAME = N'CreateTimeTest',
    FILENAME = N'C:\DATA\CreateTimeTest.mdf' ,
    SIZE = 2048000KB ,
    FILEGROWTH = 10%
)
LOG ON
(
    NAME = N'CreateTimeTest_log',
    FILENAME = N'C:\DATA\CreateTimeTest_log.ldf' ,
    SIZE = 512000KB ,
    FILEGROWTH = 10%
)
Go
Drop Database [CreateTimeTest]
Kā jau iepriekš tika minēts, LOG failam šī iespēja netiek izmantota. tātad, pus GB tiek nullēts abos gadījumos. Datu fails aizņem 2 GB.
Vidējais laiks pirms iespējas pieslēgšanas: 18 sekundes
Vidējais laiks pēc iespējas pieslēgšanas: 5 sekundes
Ja log faila izmēru norāda ļoti mazu, tad izveides laiks nokrīt līdz 0 sekundēm (tātad, milisekundēm).

Jāatzīmē, ka šis ir visai triviāls piemērs, kurā cīņa ir par sekundēm. Reālākos testos šie skaitļi var sasniegt daudzas minūtes.

Avoti:
Database File Initialization
How and Why to Enable Instant File Initialization

Nav komentāru:

Komentāra publicēšana