$ sql-server-config

Kriitilised SQL Serveri konfiguratsioonid pärast installimist. Iga seade sisaldab T-SQL skripti koos soovituslike väärtustega. Health Check tööriist kontrollib neid automaatselt.

Konfiguratsioonikalkulaator
Füüsiline RAM GB
Loogilised CPU-d tuuma
Serveris ainult SQL
🧠
Max Server Memory
Piirab SQL Serveri mälukasutust — vaikeväärtus on ohtlik
Kriitiline

Vaikeväärtus on 2 147 483 647 MB (≈ piiramatu) — SQL Server võib kogu serveri mälu enda alla võtta, jättes OS-ile liiga vähe. See põhjustab serveri külmumist, ebastabiilsust ja täielikku krahhi.

Reegel: Jäta OS-ile vähemalt max(4 GB, 10% RAM-ist). Ülejäänud võib SQL Serverile anda.

RAM kokkuOS-ile reservMax Server Memory
8 GB2 GB6 144 MB
16 GB4 GB12 288 MB
32 GB4 GB28 672 MB
64 GB6.4 GB59 187 MB
128 GB12.8 GB116 531 MB
256 GB25.6 GB235 110 MB
T-SQL
-- !! Muuda väärtust vastavalt oma serverile !!
-- Näide: 32 GB RAM server → max 28 672 MB SQL-ile
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'max server memory (MB)', 28672;
RECONFIGURE;

SELECT name, value_in_use, description
FROM sys.configurations
WHERE name IN ('max server memory (MB)', 'min server memory (MB)');
Kui serveril töötab lisaks SQL Serverile ka SSRS, SSAS, IIS vms, jäta neile rohkem mälu. Health Check näitab kas Max Server Memory on seadistamata.
📌
Lock Pages in Memory (LPIM)
Takistab OS-il SQL Serveri mälulehtede kettale kirjutamist
Info

LPIM takistab Windows'il SQL Serveri puhvervahemlust kettale page'ima (swap). Eriti kasulik suurte mäluhulkade ja Enterprise Edition puhul. Nõuab "Lock pages in memory" õigust teenusekontole.

T-SQL
-- Kontrolli kas LPIM on aktiivne
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;
-- Results: CONVENTIONAL | LOCK_PAGES | LARGE_PAGES
LPIM lubamiseks: secpol.msc → Local Policies → User Rights Assignment → Lock pages in memory → Lisa SQL teenusekonto. Seejärel taaskäivita SQL Server teenus.

MAXDOP (Max Degree of Parallelism)
Piirab ühe päringu jaoks kasutatavate protsessorite arvu
Hoiatus

Vaikeväärtus 0 = piiramatu — üks päring võib kasutada kõiki CPU tuumi, blokeerides teised päringud. See põhjustab CXPACKET ooteobtud ja ebaühtlast jõudlust.

CPU tuumad NUMA node'sSoovitatav MAXDOP
≤ 8 tuuma= tuumade arv
8–16 tuuma8
> 16 tuumatuumad / 2, max 16
OLTP koormus1–4 (lühikesed päringud)
DWH/Analüütiline8–16
T-SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

-- Muuda väärtust vastavalt CPU tuumade arvule
EXEC sp_configure 'max degree of parallelism', 8;
RECONFIGURE;

SELECT name, value_in_use FROM sys.configurations
WHERE name = 'max degree of parallelism';
💡
SQL Server 2019+ saab MAXDOP automaatselt seada installi ajal. Kontrolli alati sys.dm_os_sys_info: cpu_count ja socket_count, et teada füüsiliste tuumade arvu.
🎯
Cost Threshold for Parallelism (CTP)
Miinimumkulu mille juures SQL Server kasutab parallelismi
Hoiatus

Vaikeväärtus on 5 — mis tähendab, et SQL Server alustab parallelismi kasutamist juba väga odavate päringute jaoks. See põhjustab ülearust parallelismi lühikeste päringute puhul. Soovituslik vahemik: 40–75.

T-SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;

SELECT name, value_in_use FROM sys.configurations
WHERE name = 'cost threshold for parallelism';

🗄️
TempDB konfigureerimine
Failide arv, suurus ja asukoht
Hoiatus

TempDB on kõigi kasutajate jagatud ressurss — vale konfiguratsioon põhjustab PAGELATCH ooteid ja jõudlusprobleeme. Lihtsaim lähenemine: pane alati 8 faili — töötab hästi valdaval enamikul serveritest. Kõik failid peavad olema ühesuurused. Kui PAGELATCH_EX contention'i ei ole, ei ole vaja midagi muuta.

SeadeSoovitus
Andmefailide arv8
Kõik ühesuurusedJah
AutogrowthMB-põhine (nt 512 MB)
LogifaileTäpselt 1
AsukohtEraldi kiire ketas (nt T:\TempDB\)
T-SQL
-- NB: TempDB muutused rakenduvad SQL Serveri taaskäivitamisel
SELECT name, physical_name, size/128 AS size_mb,
       max_size, is_percent_growth, growth
FROM sys.master_files
WHERE database_id = 2;

ALTER DATABASE tempdb MODIFY FILE (
    NAME = tempdev,
    FILENAME = 'T:\TempDB\tempdb.mdf',
    SIZE = 1024MB,
    FILEGROWTH = 512MB
);

ALTER DATABASE tempdb MODIFY FILE (
    NAME = templog,
    FILENAME = 'T:\TempDB\templog.ldf',
    SIZE = 512MB,
    FILEGROWTH = 256MB
);

-- Lisa täiendavad andmefailid (näide: kokku 4 faili)
ALTER DATABASE tempdb ADD FILE (
    NAME = tempdev2, FILENAME = 'T:\TempDB\tempdb2.ndf',
    SIZE = 1024MB, FILEGROWTH = 512MB
);
ALTER DATABASE tempdb ADD FILE (
    NAME = tempdev3, FILENAME = 'T:\TempDB\tempdb3.ndf',
    SIZE = 1024MB, FILEGROWTH = 512MB
);
ALTER DATABASE tempdb ADD FILE (
    NAME = tempdev4, FILENAME = 'T:\TempDB\tempdb4.ndf',
    SIZE = 1024MB, FILEGROWTH = 512MB
);
Trace Flag 1117 ja 1118 on SQL Server 2016+ vaikimisi sisse lülitatud. Vanemas versioonis lisa käivitusparameetritesse: -T1117 -T1118

Kuidas kontrollida kas 8 faili on piisav?
Käivita allolev skript koormusperioodil. Kui PAGELATCH_EX ooteid ei esine või nende arv on väike — 8 faili on piisav ja midagi muuta ei ole vaja. Kui contention on kõrge, lisa faile 4 kaupa ja kontrolli uuesti.

T-SQL
-- Kontrolli TempDB PAGELATCH_EX contention'i
-- Käivita koormusperioodil
SELECT
    wait_type,
    waiting_tasks_count,
    wait_time_ms,
    max_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE 'PAGELATCH%'
ORDER BY wait_time_ms DESC;

SELECT
    file_id,
    io_stall_read_ms,
    io_stall_write_ms,
    io_stall,
    size_on_disk_bytes / 1024 / 1024 AS size_mb
FROM sys.dm_io_virtual_file_stats(2, NULL)
ORDER BY io_stall DESC;

📈
Autogrowth seadistamine
%-põhine kasv on ohtlik — kasuta alati MB-põhist
Hoiatus

Vaikimisi kasutab SQL Server protsendipõhist autogrowth'i — suure faili korral võib see kasvada sadadesse GB-desse korraga, põhjustades pika blokaadi. Kasuta alati fikseeritud MB väärtust.

T-SQL
-- Leia kõik %-põhise kasvuga failid
SELECT
    DB_NAME(database_id)        AS db_name,
    name                        AS file_name,
    physical_name,
    size * 8 / 1024             AS size_mb,
    CASE is_percent_growth
        WHEN 1 THEN CAST(growth AS VARCHAR) + '% !'
        ELSE CAST(growth * 8 / 1024 AS VARCHAR) + ' MB'
    END                         AS autogrowth,
    is_percent_growth
FROM sys.master_files
WHERE is_percent_growth = 1
  AND database_id > 4
ORDER BY DB_NAME(database_id);

ALTER DATABASE [MyDatabase] MODIFY FILE (
    NAME = N'MyDB_data',
    FILEGROWTH = 512MB
);
ALTER DATABASE [MyDatabase] MODIFY FILE (
    NAME = N'MyDB_log',
    FILEGROWTH = 256MB
);
🚫
Auto-Shrink ja Auto-Close
Keela kohe — mõlemad põhjustavad suuri jõudlusprobleeme
Kriitiline

Auto-Shrink vähendab faile automaatselt — seejärel kasvab fail uuesti autogrowth'iga. See tsükkel põhjustab fragmentatsiooni ja blokeerib teisi operatsioone.
Auto-Close sulgeb andmebaasi ühenduste puudumisel — uuesti avamine võtab aega ja halvendab jõudlust.

T-SQL
SELECT name,
       is_auto_shrink_on  AS auto_shrink,
       is_auto_close_on   AS auto_close
FROM sys.databases
WHERE is_auto_shrink_on = 1 OR is_auto_close_on = 1;

DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'ALTER DATABASE [' + name + '] SET AUTO_SHRINK OFF;' + CHAR(13)
             + 'ALTER DATABASE [' + name + '] SET AUTO_CLOSE OFF;'  + CHAR(13)
FROM sys.databases
WHERE is_auto_shrink_on = 1 OR is_auto_close_on = 1
  AND name NOT IN ('tempdb');

PRINT @sql;
-- EXEC sp_executesql @sql;
🚫
Ärge kunagi kasutage DBCC SHRINKFILE krooniliselt. Ühekordne kasutamine on OK (nt pärast suurt kustutamist), aga regulaarne kasutamine hävitab indeksi fragmenteerimise.
🛡️
Page Verify = CHECKSUM
Tuvastab kettavigu enne andmekaotust
Kriitiline

CHECKSUM arvutab iga 8 KB lehe kontrollsumma kirjutamisel ja kontrollib seda lugemisel. See tuvastab kettavead enne kui andmekaotus tekib. Kõigis andmebaasides peab olema CHECKSUM.

T-SQL
SELECT name,
       CASE page_verify_option
           WHEN 0 THEN 'NONE !'
           WHEN 1 THEN 'TORN_PAGE_DETECTION'
           WHEN 2 THEN 'CHECKSUM ✓'
       END AS page_verify
FROM sys.databases
WHERE page_verify_option != 2 AND name != 'tempdb';

DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'ALTER DATABASE [' + name + '] SET PAGE_VERIFY CHECKSUM;' + CHAR(13)
FROM sys.databases
WHERE page_verify_option != 2 AND name NOT IN ('tempdb');
PRINT @sql;
-- EXEC sp_executesql @sql;
🔄
Compatibility Level
Vana tase piirab SQL Serveri funktsioone ja optimizer'it
Hoiatus

Pärast SQL Serveri üleviimist jäävad andmebaasid tihti vanale compatibility level'ile. See piirab uusi funktsioone (nt batch mode, intelligent query processing). Uuenda järk-järgult — testi enne tootmises rakendamist.

SQL Server versioonTase
SQL Server 2025170
SQL Server 2022160
SQL Server 2019150
SQL Server 2017140
SQL Server 2016130
T-SQL
SELECT name, compatibility_level,
       CAST(SERVERPROPERTY('ProductMajorVersion') AS INT) * 10 AS current_server_compat
FROM sys.databases
WHERE compatibility_level < CAST(SERVERPROPERTY('ProductMajorVersion') AS INT) * 10
  AND name NOT IN ('master','model','msdb','tempdb');

ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 160;
Enne tasemel muutmist luba Query Store ja jälgi päringute jõudlust. Mõned päringud võivad erineva optimizer'iga halveneda.
📊
Query Store
Jõudluse jälgimine ja plan regression kaitse (SQL 2016+)
Hoiatus

Query Store salvestab päringute täitmisplaanid ja statistikud. Võimaldab tuvastada plan regression'e (kui SQL Server valib halvema plaani) ja tagasi pöörduda eelmise plaani juurde.

T-SQL
ALTER DATABASE [MyDatabase]
SET QUERY_STORE = ON (
    OPERATION_MODE = READ_WRITE,
    CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30),
    DATA_FLUSH_INTERVAL_SECONDS = 900,
    INTERVAL_LENGTH_MINUTES = 60,
    MAX_STORAGE_SIZE_MB = 1024,
    QUERY_CAPTURE_MODE = AUTO,
    SIZE_BASED_CLEANUP_MODE = AUTO
);

SELECT name, is_query_store_on,
       actual_state_desc AS state,
       current_storage_size_mb,
       max_storage_size_mb
FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb')
ORDER BY name;

💾
Backup Compression Default
Säästab kettaruumi ja kiirendab varundamist
Hoiatus

Vaikimisi on varukoopiate tihendamine välja lülitatud. Tihendamine vähendab backup suurust keskmiselt 3-5x ja kiirendab varundust (vähem I/O). Lülita sisse serveri tasemel — mõjutab kõiki uusi varukoopiaid.

T-SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'backup compression default', 1;
RECONFIGURE;

SELECT name, value_in_use
FROM sys.configurations
WHERE name = 'backup compression default';
SQL Server 2022 toetab ka BACKUP ... WITH COMPRESSION ALGORITHM = QAT_DEFLATE Intel hardware compression'i — oluliselt kiirem suuri CPU-de puhul.
🗑️
MSDB ajaloo puhastamine
Backup history ja Job history kogunevad lõputult
Hoiatus

MSDB andmebaasi backup history ja agent job history kasvatavad MSDB suurust piiramatult. Puhasta regulaarselt SQL Agent job'iga.

T-SQL
EXEC msdb.dbo.sp_delete_backuphistory
    @oldest_date = DATEADD(DAY, -30, GETDATE());

EXEC msdb.dbo.sp_purge_jobhistory
    @oldest_date = DATEADD(DAY, -30, GETDATE());

⚙️
Optimize for Ad Hoc Workloads
Säästab Plan Cache mälu ühekordsete päringute puhul
Info

Kui server töötleb palju ühekordseid (ad hoc) päringuid, salvestab SQL Server iga päringu täitmisplaani Plan Cache'i — ka need, mida kunagi uuesti ei kasutata. See seade salvestab ainult stub'i, säästes oluliselt mälu.

T-SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;
Kui Optimize for Ad Hoc on sees, peab Query Store olema andmebaasides aktiivne.
Ad hoc seade jätab ühekordsete päringute täitmisplaanid Plan Cache'ist välja — see tähendab, et Plan Cache'i vaadates ei ole neid plaane enam näha. Ilma Query Store'ita ei ole võimalik tuvastada aeglasi ühekordseid päringuid ega analüüsida nende täitmisplaane hiljem.

Viide: Query Store seadistamine →
🔑
Remote DAC (Dedicated Admin Connection)
Hädaolukorras ligipääs ülekoormatud serverile
Hoiatus

DAC on reserveeritud ühendus sysadmin kasutajatele — töötab isegi siis, kui server on täielikult ülekoormatud ja ei võta tavalisi ühendusi vastu. Luba alati tootmisserveritel.

T-SQL
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

EXEC sp_configure 'remote admin connections', 1;
RECONFIGURE;
📋
Error Log säilitamine ja rotatsioon
Vaikimisi 6 faili on liiga vähe
Hoiatus

Vaikimisi säilitab SQL Server ainult 6 error log faili. Kui server käivitub tihti või logib palju, kaotad olulise diagnostikainfo. Suurenda arvu ja tee igapäevane rotatsioon Agent job'iga.

T-SQL + Registry
EXEC xp_instance_regwrite
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'NumErrorLogs', REG_DWORD, 30;

EXEC sp_cycle_errorlog;

DECLARE @NumErrorLogs INT;
EXEC xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'NumErrorLogs', @NumErrorLogs OUTPUT;
SELECT ISNULL(@NumErrorLogs, 6) AS num_error_logs;

🚀
Täielik konfiguratsiooniskript
Kõik soovituslikud seaded ühes skriptis — kohandada enne käivitamist!
Valmis
🚫
Loe skript läbi enne käivitamist! Kohandada tuleb: Max Server Memory (vastavalt oma RAM-ile), MAXDOP (vastavalt CPU-dele), TempDB failide arv ja asukohad.
T-SQL
-- ============================================================
-- SQL Server Post-Install Configuration
-- dba.ee
-- ============================================================
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

-- TODO: Change MAX SERVER MEMORY
EXEC sp_configure 'max server memory (MB)', 28672;
RECONFIGURE;

-- TODO: Change MAXDOP
EXEC sp_configure 'max degree of parallelism', 8;
RECONFIGURE;

EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;

EXEC sp_configure 'backup compression default', 1;
RECONFIGURE;

EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;

EXEC sp_configure 'remote admin connections', 1;
RECONFIGURE;

EXEC sp_configure 'Database Mail XPs', 1;
RECONFIGURE;

EXEC xp_instance_regwrite
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'NumErrorLogs', REG_DWORD, 30;

-- Page Verify CHECKSUM
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'ALTER DATABASE [' + name + '] SET PAGE_VERIFY CHECKSUM WITH NO_WAIT;' + CHAR(13)
FROM sys.databases
WHERE page_verify_option != 2 AND name != 'tempdb';
IF LEN(@sql) > 0 EXEC sp_executesql @sql;

-- Disable Auto-Shrink & Auto-Close
SET @sql = '';
SELECT @sql += 'ALTER DATABASE [' + name + '] SET AUTO_SHRINK OFF;'  + CHAR(13)
             + 'ALTER DATABASE [' + name + '] SET AUTO_CLOSE OFF;'   + CHAR(13)
FROM sys.databases
WHERE (is_auto_shrink_on = 1 OR is_auto_close_on = 1) AND name != 'tempdb';
IF LEN(@sql) > 0 EXEC sp_executesql @sql;
🔍
Käivita Health Check tööriist →
Kontrollib automaatselt kõiki ülaltoodud seadeid ja näitab mis vajab veel tähelepanu