12 min czytania

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.

Rys. 1. O zmianie edycji decyduje konkretny limit albo brakująca funkcja, a nie wielkość serwera; w małej firmie kolejnym krokiem po Express jest zwykle Standard, a edycje Developer i Evaluation nie mają licencji na produkcję.

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 ExpressSkutekCo zamiast
SQL Server Agentbrak zadań według harmonogramuHarmonogram zadań Windows i sqlcmd
Kompresja kopiikopie mają pełny rozmiarwiększy zapas miejsca na kopie; skompresowaną kopię z innej edycji Express odtworzy
Szyfrowanie kopii i TDESQL Server nie szyfruje plików bazy ani kopiiszyfrowanie wolumenu i ograniczony dostęp do udziału z kopiami
Log shipping, FCI, grupy dostępnościjedyną drogą odtworzenia jest przywrócenie kopiiregularne kopie, test odtworzenia, opisany czas przywrócenia
Database Mailsilnik nie wyśle powiadomienia e-mailemalerty z systemu monitorowania
Resource Governorbrak podziału zasobów między obciążeniaosobne 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.

EdycjaLicencjaProcesor na instancjęPula buforaRozmiar bazyAgent, log shippingKompresja i szyfrowanie kopii, TDEWysoka dostępność
Expressbezpłatnamniejsza z wartości: 1 gniazdo, 4 rdzenie1410 MB50 GBnieniebrak
Standardpłatna, produkcjamniejsza z wartości: 4 gniazda, 32 rdzenie256 GB524 PBtaktakFCI do 2 węzłów, podstawowa grupa dostępności (2 repliki, 1 baza)
Enterprisepłatna, produkcjamaksimum systemu operacyjnegomaksimum systemu operacyjnego524 PBtaktakFCI do 16 węzłów, grupy dostępności Always On (do 8 replik pomocniczych)
Standard Developertylko tworzenie i testyjak Standardjak Standardjak Standardtaktakjak Standard
Enterprise Developertylko tworzenie i testyjak Enterprisejak Enterprisejak Enterprisetaktakjak Enterprise
Evaluationocena przez 180 dnijak Enterprisejak Enterprisejak Enterprisetaktakjak Enterprise

Co zmieniło się w SQL Server 2025 względem 2022

ElementSQL Server 2022SQL Server 2025
Express: maksymalny rozmiar bazy10 GB50 GB
Express: procesor i pula bufora1 gniazdo lub 4 rdzenie, 1410 MBbez zmian
Express with Advanced Servicesosobna edycja, m.in. z wyszukiwaniem pełnotekstowymwchłonięta przez Express
Standard: procesormniejsza z wartości: 4 gniazda, 24 rdzeniemniejsza z wartości: 4 gniazda, 32 rdzenie
Standard: pula bufora128 GB256 GB
Standard: Resource Governornietak
Web4 gniazda lub 16 rdzeni, 64 GBniedostępna
Developerjedna edycja z funkcjami EnterpriseStandard 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';