$ 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.
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 kokku | OS-ile reserv | Max Server Memory |
|---|---|---|
| 8 GB | 2 GB | 6 144 MB |
| 16 GB | 4 GB | 12 288 MB |
| 32 GB | 4 GB | 28 672 MB |
| 64 GB | 6.4 GB | 59 187 MB |
| 128 GB | 12.8 GB | 116 531 MB |
| 256 GB | 25.6 GB | 235 110 MB |
-- !! 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)');
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.
-- Kontrolli kas LPIM on aktiivne SELECT sql_memory_model_desc FROM sys.dm_os_sys_info; -- Results: CONVENTIONAL | LOCK_PAGES | LARGE_PAGES
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's | Soovitatav MAXDOP |
|---|---|
| ≤ 8 tuuma | = tuumade arv |
| 8–16 tuuma | 8 |
| > 16 tuuma | tuumad / 2, max 16 |
| OLTP koormus | 1–4 (lühikesed päringud) |
| DWH/Analüütiline | 8–16 |
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';
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.
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 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.
| Seade | Soovitus |
|---|---|
| Andmefailide arv | 8 |
| Kõik ühesuurused | Jah |
| Autogrowth | MB-põhine (nt 512 MB) |
| Logifaile | Täpselt 1 |
| Asukoht | Eraldi kiire ketas (nt T:\TempDB\) |
-- 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
);
-T1117 -T1118Kuidas 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.
-- 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;
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.
-- 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 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.
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;
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.
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;
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 versioon | Tase |
|---|---|
| SQL Server 2025 | 170 |
| SQL Server 2022 | 160 |
| SQL Server 2019 | 150 |
| SQL Server 2017 | 140 |
| SQL Server 2016 | 130 |
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;
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.
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;
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.
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';
MSDB andmebaasi backup history ja agent job history kasvatavad MSDB suurust piiramatult. Puhasta regulaarselt SQL Agent job'iga.
EXEC msdb.dbo.sp_delete_backuphistory
@oldest_date = DATEADD(DAY, -30, GETDATE());
EXEC msdb.dbo.sp_purge_jobhistory
@oldest_date = DATEADD(DAY, -30, GETDATE());
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.
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'optimize for ad hoc workloads', 1; RECONFIGURE;
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 →
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.
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
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.
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;
-- ============================================================
-- 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;
