SQL Server Express: kiedy wystarczy, a kiedy już nie
Express ma trzy twarde limity: rozmiar bazy, pamięć puli bufora i liczbę rdzeni, a do tego nie ma SQL Server Agenta, kompresji kopii ani wysokiej dostępności. Jak zmierzyć, który limit naprawdę blokuje pracę, czym różnią się edycje SQL Server 2025 i kiedy przejść na Standard.
Przewodnik SQL Server w małej firmie Część 7 z 7
- Jak klient znajduje SQL Server: instancje, SQL Browser i porty
- Kerberos do SQL Servera: SPN, stały port i nazwa DNS
- Loginy, użytkownicy i role w SQL Serverze: kto ma dostęp do czego
- Log transakcji, który rośnie: model odzyskiwania SIMPLE i FULL
- gMSA jako konto usługi SQL Servera: wdrożenie krok po kroku
- Kopia bazy bez SQL Agenta: harmonogram zadań i własna wysyłka logu
- SQL Server Express: kiedy wystarczy, a kiedy już nie
Aplikacja dostawcy od kilku lat działa na SQL Server Express na serwerze srv-sql-01. Monitorowanie zgłasza, że plik danych bazy zbliża się do limitu rozmiaru. Przy okazji ktoś zauważa, że serwer ma 64 GB pamięci, z których SQL Server używa na pulę bufora około 1,4 GB. Na spotkaniu pada propozycja zakupu edycji Enterprise, żeby problem zniknął na dobre.
Express ma kilka twardych limitów i kilka brakujących funkcji. Każdy z nich da się zmierzyć jednym zapytaniem, a decyzja o zmianie edycji powinna wynikać z tego, który z nich faktycznie blokuje pracę. W małej firmie odpowiedzią bywa nowsza wersja Express, druga instancja albo edycja Standard, a Enterprise jest potrzebny rzadko. Liczby w tym wpisie dotyczą SQL Server 2025 (17.x), chyba że zaznaczono inaczej.
Limity Express i co się dzieje po ich osiągnięciu
Express w SQL Server 2025 ma trzy limity skali: moc obliczeniową ograniczoną do mniejszej z wartości 1 gniazdo lub 4 rdzenie, pulę bufora do 1410 MB na instancję oraz maksymalny rozmiar bazy 50 GB. Osobne limity po 352 MB obejmują pamięć podręczną segmentów columnstore i dane tabel zoptymalizowanych pod kątem pamięci (memory-optimized). Limity procesora i pamięci dotyczą instancji, a limit rozmiaru każdej bazy osobno. Liczba baz w instancji nie zależy od edycji.
Do limitu rozmiaru liczy się łączny przydzielony rozmiar plików danych bazy, razem z wolnym miejscem wewnątrz plików. Plik logu transakcji się do niego nie wlicza. Dodanie drugiego pliku danych nic nie daje, bo limit obejmuje sumę wszystkich plików danych jednej bazy. Gdy plik ma urosnąć ponad limit, SQL Server odmawia: ręczne powiększenie przez ALTER DATABASE kończy się błędem 1827, a zapytanie, które potrzebuje nowego miejsca, dostaje błąd 1105. Odczyty działają dalej, ale zapisy wymagające nowych stron zatrzymują się w środku dnia pracy.
1827: CREATE DATABASE or ALTER DATABASE failed because the resulting cumulative database size
would exceed your licensed limit of %I64d MB per %S_MSG.
1105: Could not allocate space for object '%.*ls'%.*ls in database '%.*ls' because the '%.*ls'
filegroup is full ...
Zanim baza dojdzie do limitu, warto znać drogi wyjścia, które nie wymagają zmiany edycji. Kompresja danych (ROW i PAGE), partycjonowanie i indeksy columnstore są dostępne także w Express, ale w bazie dostawcy każda zmiana schematu wymaga jego zgody. Archiwizacja starych danych zwykle zależy od funkcji aplikacji. Miejsce zwolnione wewnątrz pliku jest od razu dostępne dla nowych danych, ale przydzielony rozmiar pliku się nie zmienia, więc procent wykorzystania limitu spada dopiero po zmniejszeniu pliku poleceniem DBCC SHRINKFILE.
Limit pamięci dotyczy puli bufora
1410 MB to górna granica puli bufora, czyli pamięci podręcznej stron danych i indeksów. Nie jest to limit całego procesu: sqlservr.exe zajmuje więcej, bo poza pulą bufora potrzebuje pamięci na stosy wątków, połączenia, biblioteki ładowane do procesu oraz columnstore i dane memory-optimized. Menedżer zadań pokazujący proces instancji Express powyżej 1,4 GB nie oznacza błędu konfiguracji.
W drugą stronę limit działa bezwzględnie. Instancja Express na serwerze z 64 GB pamięci nie użyje na pulę bufora więcej niż 1410 MB, a ustawienie max server memory powyżej tej wartości niczego nie zmienia. Czy to przeszkadza, zależy od tego, jaka część bazy jest czytana na co dzień. Baza o rozmiarze 20 GB, w której użytkownicy pracują głównie na danych z ostatnich miesięcy, może dobrze działać w 1,4 GB. Sygnałem problemu jest pula bufora stale wypełniona do limitu, niska wartość licznika Page life expectancy w godzinach pracy (np. kilkadziesiąt sekund) i duża liczba odczytów z dysku. Dołożenie pamięci serwerowi wtedy nie pomaga.
Limit procesora działa podobnie. Express używa mniejszej z wartości 1 gniazdo lub 4 rdzenie, a nadmiarowe procesory widać w sys.dm_os_schedulers jako harmonogramy (schedulers) w stanie VISIBLE OFFLINE. W maszynie wirtualnej SQL Server liczy procesory logiczne, które widzi system gościa, razem z ich podziałem na gniazda.
Czego brakuje w Express
Brak funkcji bywa ważniejszy niż limity skali. Najczęściej odczuwalny jest brak SQL Server Agenta: w Express nie ma zadań uruchamianych według harmonogramu, więc kopie zapasowe, utrzymanie indeksów i DBCC CHECKDB trzeba uruchamiać inaczej. Jak zbudować harmonogram kopii bez Agenta, opisuje szósta część przewodnika.
| Brak w Express | Skutek | Co zamiast |
|---|---|---|
| SQL Server Agent | brak zadań według harmonogramu | Harmonogram zadań Windows i sqlcmd |
| Kompresja kopii | kopie mają pełny rozmiar | większy zapas miejsca na kopie; skompresowaną kopię z innej edycji Express odtworzy |
| Szyfrowanie kopii i TDE | SQL Server nie szyfruje plików bazy ani kopii | szyfrowanie wolumenu i ograniczony dostęp do udziału z kopiami |
| Log shipping, FCI, grupy dostępności | jedyną drogą odtworzenia jest przywrócenie kopii | regularne kopie, test odtworzenia, opisany czas przywrócenia |
| Database Mail | silnik nie wyśle powiadomienia e-mailem | alerty z systemu monitorowania |
| Resource Governor | brak podziału zasobów między obciążenia | osobne instancje |
Jednocześnie Express potrafi więcej, niż sugeruje nazwa. W SQL Server 2025 obsługuje między innymi kompresję danych, partycjonowanie, columnstore, In-Memory OLTP, Always Encrypted, zabezpieczenia na poziomie wierszy, audyt serwera i bazy oraz wyszukiwanie pełnotekstowe.
Kilka instancji Express na jednym serwerze
Limity procesora i pamięci dotyczą pojedynczej instancji, więc kilka instancji na jednym serwerze pozwala wykorzystać moc, której jedna instancja nie użyje. Każda edycja pozwala na 50 instancji na serwer. Trzy aplikacje w instancjach CRM, ERP i HR na srv-sql-01 dostają każda własne 4 rdzenie i 1410 MB puli bufora, zamiast dzielić jeden limit.
Kosztem jest administracja. Każda instancja to osobna usługa (MSSQL$CRM, MSSQL$ERP, MSSQL$HR), osobny port (14331–14333), osobna reguła zapory, osobny SPN, osobne kopie zapasowe i osobne monitorowanie. Jak klient odnajduje instancję nazwaną i dlaczego stały port jest lepszy od dynamicznego, opisuje pierwsza część, a rejestrację SPN dla każdej instancji część druga. Podział na instancje nie pomaga na limit rozmiaru: jedna baza nadal może mieć najwyżej 50 GB, a zapytania łączące bazy z różnych instancji wymagają serwera połączonego.
Porównanie edycji SQL Server 2025
Tabela zestawia licencję, limity skali i funkcje, które najczęściej decydują o wyborze edycji.
| Edycja | Licencja | Procesor na instancję | Pula bufora | Rozmiar bazy | Agent, log shipping | Kompresja i szyfrowanie kopii, TDE | Wysoka dostępność |
|---|---|---|---|---|---|---|---|
| Express | bezpłatna | mniejsza z wartości: 1 gniazdo, 4 rdzenie | 1410 MB | 50 GB | nie | nie | brak |
| Standard | płatna, produkcja | mniejsza z wartości: 4 gniazda, 32 rdzenie | 256 GB | 524 PB | tak | tak | FCI do 2 węzłów, podstawowa grupa dostępności (2 repliki, 1 baza) |
| Enterprise | płatna, produkcja | maksimum systemu operacyjnego | maksimum systemu operacyjnego | 524 PB | tak | tak | FCI do 16 węzłów, grupy dostępności Always On (do 8 replik pomocniczych) |
| Standard Developer | tylko tworzenie i testy | jak Standard | jak Standard | jak Standard | tak | tak | jak Standard |
| Enterprise Developer | tylko tworzenie i testy | jak Enterprise | jak Enterprise | jak Enterprise | tak | tak | jak Enterprise |
| Evaluation | ocena przez 180 dni | jak Enterprise | jak Enterprise | jak Enterprise | tak | tak | jak Enterprise |
Co zmieniło się w SQL Server 2025 względem 2022
| Element | SQL Server 2022 | SQL Server 2025 |
|---|---|---|
| Express: maksymalny rozmiar bazy | 10 GB | 50 GB |
| Express: procesor i pula bufora | 1 gniazdo lub 4 rdzenie, 1410 MB | bez zmian |
| Express with Advanced Services | osobna edycja, m.in. z wyszukiwaniem pełnotekstowym | wchłonięta przez Express |
| Standard: procesor | mniejsza z wartości: 4 gniazda, 24 rdzenie | mniejsza z wartości: 4 gniazda, 32 rdzenie |
| Standard: pula bufora | 128 GB | 256 GB |
| Standard: Resource Governor | nie | tak |
| Web | 4 gniazda lub 16 rdzeni, 64 GB | niedostępna |
| Developer | jedna edycja z funkcjami Enterprise | Standard Developer i Enterprise Developer |
Dla bazy, która w SQL Server 2019 lub 2022 Express zbliża się do 10 GB, najtańszą odpowiedzią bywa aktualizacja wersji do Express 2025. Jest to obsługiwana ścieżka aktualizacji, a limit rośnie do 50 GB bez kosztu licencji. Warunkiem jest wsparcie dostawcy aplikacji dla SQL Server 2025. Limity procesora i pamięci Express się nie zmieniły, więc aktualizacja nie pomoże, gdy problemem jest pula bufora.
Kiedy przejść na Standard
Zmianę edycji uzasadnia co najmniej jeden z sygnałów:
- pliki danych przekraczają około 80% limitu, przy obecnym przyroście dojdą do niego w ciągu kilku miesięcy, a archiwizacja nie wchodzi w grę;
- pula bufora jest stale na poziomie 1410 MB, Page life expectancy w godzinach pracy jest niska, a dysk obsługuje głównie odczyty z bazy;
- cztery harmonogramy instancji są stale obciążone, a pozostałe procesory serwera stoją bezczynnie;
- dostawca wymaga zadań SQL Server Agenta albo potrzebne są powiadomienia przez Database Mail;
- docelowy czas i punkt odtworzenia (RTO, RPO) wymagają log shippingu, podstawowej grupy dostępności albo klastra FCI;
- polityka bezpieczeństwa lub audyt wymaga szyfrowania kopii albo TDE.
Zmiana Express na Standard w tej samej wersji odbywa się w miejscu, bez przenoszenia baz: SQL Server Installation Center, Maintenance, Edition Upgrade, z kluczem produktu edycji Standard. Instalator restartuje usługi instancji, więc trzeba zaplanować krótką przerwę. Po zmianie usługę SQL Server Agent trzeba włączyć i skonfigurować jej konto w SQL Server Configuration Manager, a uprawnienia grupy BUILTIN\Users nadane przy instalacji Express pozostają i warto je przejrzeć.
# Uruchamiane z katalogu nośnika instalacyjnego; restartuje usługę MSSQL$CRM
.\setup.exe /q /ACTION=EditionUpgrade /INSTANCENAME=CRM /PID=XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /IACCEPTSQLSERVERLICENSETERMS
# Usługa Agenta po instalacji Express jest wyłączona
Set-Service -Name 'SQLAgent$CRM' -StartupType Automatic
Start-Service -Name 'SQLAgent$CRM'
Enterprise jest uzasadniony, gdy instancja potrzebuje więcej niż 32 rdzeni lub 256 GB puli bufora, grupy dostępności z kilkoma bazami i więcej niż dwiema replikami albo operacji online, takich jak przebudowa indeksów bez blokowania tabeli. W scenariuszu z początku wpisu żaden z tych warunków nie występuje: problemem jest rozmiar bazy i pula bufora. Na rozmiar może wystarczyć aktualizacja do Express 2025, a na pulę bufora wystarcza Standard z limitem 256 GB.
Edycje Developer i Evaluation tylko poza produkcją
Enterprise Developer i Standard Developer mają funkcje odpowiednio edycji Enterprise i Standard, ale licencję wyłącznie na tworzenie i testy. Evaluation ma funkcje Enterprise i jest przeznaczona do oceny przez 180 dni. Instalacja którejkolwiek z nich na serwerze produkcyjnym, bo „ma wszystko”, narusza licencję. Zmiana z Developer lub Evaluation na płatną edycję jest obsługiwaną zmianą w miejscu. Zmiana w drugą stronę, na przykład z Enterprise na Standard, wymaga kopii wszystkich baz, odinstalowania instancji i ponownej instalacji.
Sprawdź u siebie
Edycja, rodzaj silnika i wersja każdej instancji. EngineEdition równe 4 oznacza Express, 2 to Standard (także Standard Developer), a 3 to Enterprise, Enterprise Developer lub Evaluation, dlatego edycję testową rozpoznaje się po kolumnie Edition. ProductVersion zaczynające się od 17 to SQL Server 2025, od 16 to 2022, a od 15 to 2019. Zły wynik na serwerze produkcyjnym to słowo Developer lub Evaluation w nazwie edycji.
'sql-crm.corp.example.com,14331', 'sql-erp.corp.example.com,14332', 'sql-hr.corp.example.com,14333' | ForEach-Object {
# -E: uwierzytelnianie Windows; -C: zaufanie certyfikatowi serwera; -W: bez spacji na końcu kolumn
sqlcmd -S $_ -E -C -W -Q "SELECT @@SERVERNAME AS server_name, SERVERPROPERTY('Edition') AS edition, SERVERPROPERTY('EngineEdition') AS engine_edition, SERVERPROPERTY('ProductVersion') AS product_version;"
}
Przydzielony rozmiar plików danych każdej bazy na tle limitu Express. Kolumna size w sys.master_files podaje rozmiar w stronach po 8 KB, a type = 0 wybiera pliki danych bez logu. Na instancji Express wynik poniżej 70% limitu nie wymaga działań, a powyżej 80% to czas na decyzję: archiwizację, aktualizację wersji albo zmianę edycji. Na innych edycjach kolumna z procentem nie ma znaczenia.
-- Limit Express: 50 GB od SQL Server 2025, 10 GB w wersjach 2019 i 2022
DECLARE @limit_mb int = CASE WHEN CAST(SERVERPROPERTY('ProductMajorVersion') AS int) >= 17 THEN 51200 ELSE 10240 END;
SELECT DB_NAME(database_id) AS database_name,
SUM(CAST(size AS bigint)) * 8 / 1024 AS data_mb,
CAST(100.0 * SUM(CAST(size AS bigint)) * 8 / 1024 / @limit_mb AS decimal(9, 1)) AS pct_of_express_limit
FROM sys.master_files
WHERE type = 0
GROUP BY database_id
ORDER BY data_mb DESC;
Pamięć procesu, rozmiar puli bufora i Page life expectancy. Na Express wartość process_mb powyżej 1410 jest normalna. Problem z pamięcią to buffer_pool_mb stale blisko 1410 razem z niskim PLE w godzinach pracy, a pula wyraźnie poniżej limitu oznacza, że pamięć nie jest wąskim gardłem.
SELECT physical_memory_in_use_kb / 1024 AS process_mb,
memory_utilization_percentage,
process_physical_memory_low
FROM sys.dm_os_process_memory;
-- Strony danych i indeksów w puli bufora
SELECT SUM(pages_kb) / 1024 AS buffer_pool_mb
FROM sys.dm_os_memory_clerks
WHERE type = 'MEMORYCLERK_SQLBUFFERPOOL';
-- Średni czas życia strony w puli, w sekundach
SELECT cntr_value AS page_life_expectancy_s
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Buffer Manager%' AND counter_name = 'Page life expectancy';
Liczba harmonogramów, z których korzysta instancja, na tle procesorów widocznych w systemie. Na Express dobry wynik to tyle harmonogramów VISIBLE ONLINE, ile procesorów ma maszyna, najwyżej 4. VISIBLE OFFLINE przy socket_count równym cpu_count i jednym rdzeniu na gniazdo oznacza topologię maszyny wirtualnej, w której Express korzysta z jednego procesora. Wpis startowy w dzienniku błędów pokazuje wykryte gniazda i rdzenie oraz liczbę procesorów użytych zgodnie z licencją.
SELECT status, COUNT(*) AS schedulers
FROM sys.dm_os_schedulers
WHERE status IN ('VISIBLE ONLINE', 'VISIBLE OFFLINE')
GROUP BY status;
SELECT cpu_count, socket_count, cores_per_socket, virtual_machine_type_desc
FROM sys.dm_os_sys_info;
-- Wpis startowy o gniazdach, rdzeniach i limicie licencji
EXEC xp_readerrorlog 0, 1, N'licensing';