Przejdź do treści
Powrót do Centrum Pomocy
Ilustracja artykułu: Insert into SQL Server — kompletny przewodnik 2026
Aplikacje Microsoft

Insert into SQL Server — kompletny przewodnik 2026

Operacja INSERT INTO w SQL Server to absolutny fundament pracy z danymi — każdy administrator baz danych, deweloper .NET czy analityk biznesowy wykonuje ją dzie

13 min czytania·Zaktualizowano dzisiaj
Autor:Piotr ZielińskiSprawdzone przezKatarzyna NowakAktualizacja: 9 czerwca 2026
Faktura VAT 23% + KSeFDostawa 1-3 min e-mailemGwarancja działania klucza5,0 / 5,0(KluczeSoft)

Operacja INSERT INTO w SQL Server to absolutny fundament pracy z danymi — każdy administrator baz danych, deweloper .NET czy analityk biznesowy wykonuje ją dziesiątki, jeśli nie setki razy dziennie. Na pozór proste wstawianie wierszy do tabeli w rzeczywistości kryje dziesiątki niuansów: od wydajności i blokowania transakcyjnego, przez składnię OUTPUT, aż po współpracę z Entity Framework i Azure SQL. W tym przewodniku zebraliśmy wszystko, co musisz wiedzieć w 2026 roku, niezależnie od tego, czy dopiero zaczynasz przygodę z Microsoft SQL Server 2025 (build 17.x), czy szukasz sposobu na optymalizację istniejących procesów ETL.

Czym jest INSERT INTO i dlaczego to więcej niż proste wstawianie

W swojej najprostszej formie polecenie INSERT INTO dodaje jeden lub wiele wierszy do tabeli lub perspektywy modyfikowalnej (ang. updatable view). Wersja SQL Server 2025, która zadebiutowała w listopadzie 2024 jako następca SQL Server 2022 (build 16.0.x), kontynuuje rozszerzanie składni zgodnej ze standardem T-SQL, oferując przy tym unikalne rozszerzenia niedostępne w konkurencyjnych silnikach.

Podstawowe zastosowania obejmują:

  • Ładowanie danych z systemów zewnętrznych (pliki CSV, API, kolejki komunikatów) do staging tables.
  • Rejestrację zdarzeń w tabelach dzienników (logowanie aplikacji, audyt).
  • Kopiowanie danych pomiędzy tabelami przy pomocy INSERT INTO ... SELECT.
  • Zasilanie tabel tymczasowych w trakcie złożonych procesów raportowych.
  • Zatwierdzanie danych formularzy w aplikacjach webowych opartych o ASP.NET Core.

Jednak prawdziwą wartość INSERT INTO doceniasz dopiero wtedy, gdy zrozumiesz jego współdziałanie z transakcjami, indeksami, wyzwalaczami i mechanizmem równoległości. Źle napisane zapytanie INSERT potrafi sparaliżować nawet kilkudziesięciordzeniowy serwer — i odwrotnie, dobrze zoptymalizowane wstawi milion wierszy w czasie poniżej sekundy.

Składnia INSERT INTO — od absolutnych podstaw do zaawansowanych wariantów

Microsoft dokumentuje kilkanaście dopuszczalnych form składni, ale w codziennej pracy najczęściej spotkasz trzy główne warianty. Oto one:

-- 1. Klasyczne wstawienie pojedynczego wiersza z jawną listą kolumn
INSERT INTO dbo.Klienci (Imie, Nazwisko, Email, DataRejestracji)
VALUES ('Anna', 'Kowalska', 'anna.k@firma.pl', GETDATE());

-- 2. Wstawienie wielu wierszy jednym poleceniem (do 1000 wierszy w VALUES)
INSERT INTO dbo.Klienci (Imie, Nazwisko, Email, DataRejestracji)
VALUES
    ('Jan', 'Nowak', 'jan.n@firma.pl', GETDATE()),
    ('Ewa', 'Wiśniewska', 'ewa.w@firma.pl', GETDATE()),
    ('Tomasz', 'Zieliński', 'tomasz.z@firma.pl', GETDATE());

-- 3. INSERT INTO ... SELECT (kopiowanie danych)
INSERT INTO dbo.KlienciArchiwum (Imie, Nazwisko, Email, DataRejestracji)
SELECT Imie, Nazwisko, Email, DataRejestracji
FROM dbo.Klienci
WHERE DataRejestracji < '2024-01-01';

Klauzula OUTPUT — natychmiastowy podgląd wstawionych danych

Jednym z najpotężniejszych rozszerzeń T-SQL jest klauzula OUTPUT, która zwraca dane z wierszy zmodyfikowanych przez INSERT — włącznie z wartościami generowanymi automatycznie (identity, kolumny computed, domyślne). W 2026 roku to standardowe narzędzie każdego dewelopera SQL Server:

INSERT INTO dbo.Klienci (Imie, Nazwisko, Email)
OUTPUT inserted.Id, inserted.DataRejestracji
VALUES ('Michał', 'Lewandowski', 'michal.l@firma.pl');

Zastosowanie praktyczne: od razu otrzymujesz wygenerowane ID rekordu bez dodatkowego SELECT SCOPE_IDENTITY(), co jest niezastąpione w scenariuszach API i ORM.

WITH (TABLOCK) i minimalnie rejestrowane wstawienia

Przy ładowaniu dużych wolumenów danych (ETL, migracje) warto rozważyć wskazówkę WITH (TABLOCK), która w modelu odzyskiwania BULK_LOGGED lub SIMPLE umożliwia minimalnie rejestrowane wstawienia (minimally logged inserts). Mechanizm ten redukuje obciążenie dziennika transakcji nawet o 70-80%:

INSERT INTO dbo.FakturySprzedazy WITH (TABLOCK)
SELECT * FROM Staging.dbo.FakturyImport;

Uwaga: TABLOCK zakłada blokadę na poziomie całej tabeli, co wyklucza równoczesny dostęp innych sesji. Używaj go wyłącznie w oknach serwisowych lub na dedykowanych tabelach staging.

Wydajność INSERT INTO — jak wstawić milion wierszy i nie zwolnić serwera

Wydajność operacji INSERT zależy od kilkunastu czynników, ale trzy z nich mają znaczenie krytyczne: struktura indeksów, model odzyskiwania bazy oraz sposób zarządzania transakcjami.

Indeksy — przyjaciel czy wróg?

Każdy indeks klastrowany (a tym bardziej nieklastrowany) na tabeli docelowej oznacza dodatkową pracę przy INSERT. Dla tabel o wysokiej częstotliwości zapisów (OLTP) warto rozważyć:

  • Ograniczenie liczby indeksów nieklastrowanych do absolutnego minimum — każdy dodatkowy indeks wydłuża INSERT średnio o 15-30% (pomiary z SQL Server 2025, workload 80/20 read/write).
  • Stosowanie indeksów filtrowanych na kolumnach często używanych w WHERE.
  • Rozważenie indeksu columnstore (CCI) dla tabel faktów w hurtowniach danych — INSERT INTO z CCI wykorzystuje mechanizm trickle insert, który kieruje małe partie do magazynów delta.
-- Przykład: tworzenie klastrowanego indeksu columnstore dla hurtowni
CREATE CLUSTERED COLUMNSTORE INDEX CCI_Faktury
ON dbo.FakturySprzedazy;

Transakcje — rozmiar partii i izolacja

Wstawianie 10 milionów wierszy w jednej transakcji to pewny przepis na rozdęcie dziennika transakcyjnego (tempdb również ucierpi) i potencjalny timeout. Zamiast tego dziel operację na partie (batche) po 10 000–100 000 wierszy, zatwierdzając każdą partię oddzielnie. Technika ta, znana jako batch commit, to standard w ETL od lat, a SQL Server 2025 jeszcze ją usprawnił dzięki inteligentniejszemu zarządzaniu pamięcią buforową.

DECLARE @BatchSize INT = 50000;
DECLARE @RowsInserted INT = @BatchSize;

WHILE @RowsInserted = @BatchSize
BEGIN
    BEGIN TRANSACTION;
    
    INSERT INTO dbo.DuzaTabela (Kolumna1, Kolumna2)
    SELECT TOP (@BatchSize) Kolumna1, Kolumna2
    FROM Staging.dbo.DuzaTabelaImport
    WHERE NOT EXISTS (
        SELECT 1 FROM dbo.DuzaTabela T
        WHERE T.Id = DuzaTabelaImport.Id
    );
    
    SET @RowsInserted = @@ROWCOUNT;
    
    COMMIT TRANSACTION;
    
    -- Krótka przerwa dla innych procesów
    WAITFOR DELAY '00:00:01';
END;

Parallel INSERT i INSERT INTO ... SELECT

Od SQL Server 2016 mechanizm INSERT INTO ... SELECT obsługuje wstawianie równoległe (parallel insert) dla tabel stert (heap) i tabel z indeksem columnstore. Oznacza to, że zapytanie SELECT jest wykonywane równolegle na wielu wątkach, a wyniki są bezpośrednio zapisywane do tabeli docelowej. W SQL Server 2025 Microsoft poprawił wykrywanie kandydatów do parallel insert — optymalizator częściej wybiera ten tryb dla zapytań o koszcie szacunkowym powyżej 25 jednostek.

Aby sprawdzić, czy Twój INSERT korzysta z parallelizmu, wystarczy zajrzeć do rzeczywistego planu wykonania (Actual Execution Plan) — obecność operatora Parallelism (INSERT) to potwierdzenie.

INSERT INTO a integralność danych — klucze, więzy i wyzwalacze

Każdy INSERT jest automatycznie weryfikowany przez silnik integralności danych SQL Server. Oznacza to sprawdzenie:

  • Klucza podstawowego (PRIMARY KEY) i ograniczeń unikalności — naruszenie skutkuje błędem 2627.
  • Kluczy obcych (FOREIGN KEY) — próba wstawienia wiersza z nieistniejącą wartością referencyjną zgłasza błąd 547.
  • Ograniczeń CHECK — np. CHECK (Wiek >= 18).
  • Wyzwalaczy AFTER INSERT / INSTEAD OF INSERT.

Zrozumienie kolejności tych operacji jest kluczowe przy debugowaniu problemów:

  1. Generowanie wartości identity i computed columns.
  2. Wstawienie wiersza do tabeli (lub bufora delta w CCI).
  3. Sprawdzenie ograniczeń CHECK.
  4. Sprawdzenie kluczy obcych.
  5. Wykonanie wyzwalaczy AFTER INSERT.
  6. Sprawdzenie klucza podstawowego i indeksów unikalnych (w praktyce równolegle z krokiem 2).

Błędy walidacji w krokach 3-4-6 powodują automatyczne wycofanie wiersza (rollback na poziomie instrukcji, nie transakcji).

Obsługa błędów z TRY...CATCH

Każdy produkcyjny kod INSERT powinien być opakowany w TRY...CATCH, szczególnie gdy wstawiasz dane, których integralności nie możesz w pełni zagwarantować (np. importy z plików CSV):

BEGIN TRY
    INSERT INTO dbo.Klienci (Email, Imie)
    VALUES ('duplikat@firma.pl', 'Test');
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_MESSAGE() AS ErrorMessage,
        ERROR_LINE() AS ErrorLine;
END CATCH;

INSERT INTO w ekosystemie Microsoft — Entity Framework, Azure SQL i Power Automate

Entity Framework Core 9 i INSERT

W 2026 roku standardem w aplikacjach .NET (wraz z niedawnym .NET 10 Preview) jest Entity Framework Core 9.0 (lub nowszy), który tłumaczy wywołania DbSet.Add() i SaveChanges() na wydajne polecenia INSERT. Kluczowe fakty:

  • SaveChanges() po dodaniu N encji domyślnie wysyła N osobnych INSERT — dla batch insertów użyj rozszerzenia EFCore.BulkExtensions lub natywnego ExecuteSqlRaw.
  • Mechanizm śledzenia zmian (ChangeTracker) wykrywa tylko encje dodane przez Add(), AddRange() lub nawigację po relacjach.
  • Od EF Core 7.0 dostępny jest ExecuteUpdate i ExecuteDelete, ale wstawianie nadal wymaga oddzielnych INSERT.
// Rekomendowane podejście dla batch insert > 1000 encji (EF Core 9)
using var context = new AppDbContext();

var klienci = Enumerable.Range(0, 10000)
    .Select(i => new Klient { Imie = $"Klient{i}", Email = $"k{i}@firma.pl" });

context.BulkInsert(klienci, options => options.BatchSize = 500);

Azure SQL Database i Azure SQL Managed Instance

W chmurze publicznej Azure operacje INSERT rządzą się tymi samymi prawami, ale dochodzi specyfika środowiska PaaS:

  • Limity jednostek DTU/vCore bezpośrednio przekładają się na przepustowość INSERT. Przykładowo: baza S2 (50 DTU) wstawi około 200-400 wierszy/s przy indeksie klastrowanym, podczas gdy baza Business Critical 8 vCore osiąga 5000-8000 wierszy/s.
  • Opóźnienia log write są wyższe niż w on-premises (dysk SSD w chmurze vs NVMe lokalnie) — rozważ grupowanie INSERT w transakcjach po 100-500 wierszy zamiast auto-commit dla każdego wiersza.
  • Azure SQL obsługuje INSERT INTO ... EXTERNAL TABLE (PolyBase), co umożliwia bezpośrednie wstawianie danych z Azure Blob Storage / Data Lake Gen2.

Power Automate i łącznik SQL Server

W środowisku low-code Power Automate (część Microsoft Power Platform) operacja "Wstaw wiersz (V2)" tłumaczy się na pojedyncze INSERT-y. Przy większych wolumenach lepiej sprawdza się wywołanie procedury składowanej przyjmującej TVP (Table-Valued Parameter), co redukuje opóźnienia sieciowe.

INSERT INTO a bezpieczeństwo — uprawnienia, SQL Injection i szyfrowanie

Bezpieczeństwo operacji INSERT to nie tylko kwestia GRANT INSERT ON ... TO .... Pełny obraz obejmuje:

  • Uprawnienia granularne: minimum INSERT na tabeli docelowej, SELECT na tabelach źródłowych w INSERT INTO ... SELECT. W SQL Server 2025 Microsoft rozszerzył fine-grained permissions o możliwość przyznania INSERT wyłącznie na wybranych kolumnach.
  • SQL Injection: nigdy nie składaj zapytań INSERT przez konkatenację stringów, nawet w wewnętrznych skryptach. Używaj parametryzowanych zapytań (sp_executesql, SqlCommand.Parameters w .NET).
  • Always Encrypted z bezpiecznymi enklawami: SQL Server 2025 rozszerza support dla INSERT na kolumny szyfrowane z kluczami przechowywanymi w enklawie (Intel SGX, AMD SEV-SNP). Oznacza to, że możesz bezpiecznie wstawiać dane wrażliwe (PESEL, numery kart) bez ich odszyfrowywania po stronie klienta.
-- Przykład parametryzowanego INSERT (sp_executesql)
DECLARE @sql NVARCHAR(MAX) = N'
    INSERT INTO dbo.Klienci (Imie, Email)
    VALUES (@Imie, @Email)';

EXEC sp_executesql @sql,
    N'@Imie NVARCHAR(100), @Email NVARCHAR(200)',
    @Imie = 'Test', @Email = 'test@test.pl';

Porównanie INSERT INTO z alternatywami — MERGE, BULK INSERT i OPENROWSET

Sam INSERT INTO nie zawsze jest optymalnym narzędziem. Oto kiedy warto rozważyć alternatywę:

MetodaZastosowaniePrzepustowość (wierszy/s)*Ograniczenia
INSERT INTO ... VALUESPojedyncze wstawienia, API500-2000Narzut sieciowy na każdy wywołanie
INSERT INTO ... SELECTKopiowanie, transformacje T-SQL5000-50000Zależna od złożoności SELECT
BULK INSERTPliki CSV/TSV bezpośrednio z dysku100000-500000Wymaga uprawnień serwera, plik lokalny
MERGEUPSERT (insert/update/delete)2000-10000Wyższy narzut blokowania, ryzyko race condition
SqlBulkCopy (.NET)Aplikacje .NET, dane z DataTable50000-200000Tylko INSERT, bez logiki UPDATE
PolyBase / OPENROWSETAzure Blob, Data Lake100000-1000000Tylko dla tabel zewnętrznych

* Szacunkowe wartości dla SQL Server 2025 na sprzęcie 8 vCPU / 64 GB RAM, tabela z indeksem klastrowanym, model SIMPLE.

Wniosek praktyczny: jeśli potrzebujesz UPSERT (insert lub update w zależności od istnienia rekordu), MERGE jest składniowo wygodny, ale niesie znane ryzyka związane z izolacją transakcji i blokowaniem zakresowym. Wielu doświadczonych DBA preferuje podejście "sprawdź-istnienie-potem-wstaw" z IF NOT EXISTS ... INSERT — jest to bezpieczniejsze przy wysokiej współbieżności.

Częste pytania

1. Jaka jest różnica między INSERT INTO a SELECT INTO?

INSERT INTO wstawia dane do istniejącej już tabeli (lub perspektywy). SELECT INTO tworzy nową tabelę na podstawie wyniku zapytania SELECT, kopiując strukturę kolumn i dane. SELECT INTO jest minimalnie rejestrowane w modelu SIMPLE lub BULK_LOGGED i nie przenosi indeksów, kluczy ani ograniczeń CHECK z tabel źródłowych.

2. Ile wierszy mogę wstawić jednym INSERT INTO ... VALUES?

Maksymalnie 1000 wierszy w jednym poleceniu INSERT INTO ... VALUES — to jawne ograniczenie SQL Server (niezależnie od wersji). Próba wstawienia 1001 wierszy kończy się błędem składni. Dla większych partii użyj INSERT INTO ... SELECT z tabelą tymczasową lub wielu osobnych poleceń w transakcji.

3. Czy INSERT INTO blokuje całą tabelę?

Zależy od poziomu izolacji i wskazówek. Przy domyślnym READ COMMITTED INSERT zakłada blokady na poziomie wiersza (IX na tabeli, X na wierszu/kluczu) — inne sesje mogą czytać, ale nie mogą wstawiać ani aktualizować tych samych wierszy. Wskazówka WITH (TABLOCK) jawnie żąda blokady na całą tabelę (X), blokując wszystkie inne operacje do końca transakcji.

4. Jak uzyskać ID ostatnio wstawionego rekordu?

Najbezpieczniejszą metodą jest SCOPE_IDENTITY(), która zwraca ostatnią wartość identity wygenerowaną w bieżącym zakresie (sesja + moduł). Unikaj @@IDENTITY — zwraca ostatnie ID z dowolnego zakresu, co przy wyzwalaczach daje błędną wartość. Alternatywnie, użyj klauzuli OUTPUT inserted.Id.

5. Dlaczego mój INSERT jest wolny mimo prostego zapytania?

Najczęstsze przyczyny: (1) zbyt wiele indeksów nieklastrowanych na tabeli docelowej, (2) blokowanie przez inne transakcje (sprawdź sp_who2 lub sys.dm_exec_requests), (3) zbyt wolny dysk dziennika transakcji, (4) autogrowth plików danych lub logu podczas INSERT, (5) wyzwalacze AFTER INSERT wykonujące kosztowne operacje. Zacznij diagnostykę od włączenia rzeczywistego planu wykonania i SET STATISTICS TIME, IO ON.

6. Czy mogę wstawiać dane do perspektywy (VIEW)?

Tak, pod warunkiem że perspektywa jest modyfikowalna (updatable view). Oznacza to, że musi opierać się na pojedynczej tabeli bazowej, nie może zawierać agregacji, DISTINCT, GROUP BY, UNION ani klauzul TOP/OFFSET. Od SQL Server 2019 dostępne są także wyzwalacze INSTEAD OF INSERT na perspektywach, które pozwalają obsłużyć INSERT na złożonych widokach.

7. Jak działa INSERT INTO w Always On Availability Groups?

W grupie dostępności operacja INSERT jest wykonywana na replice podstawowej (primary) i synchronizowana z replikami pomocniczymi (secondary) poprzez dziennik transakcji. W trybie synchronicznym INSERT nie zostanie zatwierdzony, dopóki dziennik nie zostanie utwardzony na wszystkich replikach synchronicznych — to wydłuża czas odpowiedzi, ale gwarantuje RPO=0. W trybie asynchronicznym INSERT wraca szybciej, ale repliki mogą być opóźnione.

8. Czy SQL Server 2025 ma nowości w zakresie INSERT INTO?

SQL Server 2025 wprowadza natywne wsparcie dla szyfrowania kolumn JSON podczas INSERT (Always Encrypted z enklawami dla JSON path), ulepszone parallel insert dla tabel z indeksami nieklastrowanymi oraz nowy tryb OPTIMIZED_LOCKING (domyślnie włączony), który redukuje eskalację blokad podczas dużych batch insertów. Dodatkowo zoptymalizowano INSERT na tabelach memory-optimized (In-Memory OLTP) — teraz natywnie współpracują z wersjonowaniem wierszy (ADR).

9. Jak bezpiecznie wstawić dane z pliku CSV do SQL Server?

Najlepsze praktyki: (1) użyj BULK INSERT z opcją FIRSTROW = 2 (pomijanie nagłówka) i CODEPAGE = '65001' (UTF-8), (2) zdefiniuj plik formatu (XML lub fmt) dla precyzyjnego mapowania typów, (3) ładuj do tabeli staging bez indeksów, potem transformuj do docelowej, (4) rozważ OPENROWSET(BULK ...) zamiast BULK INSERT, jeśli plik jest na udziale sieciowym. W Azure: PolyBase do CSV w Blob Storage.

10. Czym różni się INSERT w SQL Server od PostgreSQL i MySQL?

Wszystkie trzy silniki obsługują podstawowe INSERT INTO ... VALUES i INSERT INTO ... SELECT, ale różnice obejmują: PostgreSQL ma ON CONFLICT DO UPDATE (odpowiednik MERGE), MySQL wspiera ON DUPLICATE KEY UPDATE i nie ma klauzuli OUTPUT (zamiast tego LAST_INSERT_ID()). T-SQL wyróżnia się klauzulą OUTPUT, która zwraca pełny zestaw kolumn z wstawionych wierszy — to możliwość niedostępna natywnie w MySQL i bardziej rozbudowana niż RETURNING w PostgreSQL.


Prawdziwa biegłość w SQL Server to nie tylko znajomość składni — to umiejętność podejmowania świadomych decyzji architektonicznych, które przekładają się na stabilność całego systemu. Jeśli zarządzasz infrastrukturą Microsoft i zależy Ci na legalnym, w pełni licencjonowanym oprogramowaniu bez ryzyka audytu BSA, zapoznaj się z ofertą kluczy Microsoft SQL Server 2025 Standard oraz Enterprise dostępnych od ręki w KluczeSoft.pl.

Sprawdź też

Potrzebujesz licencji? Microsoft SQL Server — sprawdź ofertę KluczeSoft.pl — legalne klucze, faktura VAT, dostawa e-mail.

<!-- INLINE-LINKS-V1 -->

Najczęściej zadawane pytania

`INSERT INTO` wstawia dane do istniejącej już tabeli (lub perspektywy). `SELECT INTO` tworzy nową tabelę na podstawie wyniku zapytania SELECT, kopiując strukturę kolumn i dane. `SELECT INTO` jest minimalnie rejestrowane w modelu SIMPLE lub BULK_LOGGED i nie przenosi indeksów, kluczy ani ograniczeń CHECK z tabel źródłowych.
Maksymalnie 1000 wierszy w jednym poleceniu `INSERT INTO ... VALUES` — to jawne ograniczenie SQL Server (niezależnie od wersji). Próba wstawienia 1001 wierszy kończy się błędem składni. Dla większych partii użyj `INSERT INTO ... SELECT` z tabelą tymczasową lub wielu osobnych poleceń w transakcji.
Zależy od poziomu izolacji i wskazówek. Przy domyślnym `READ COMMITTED` INSERT zakłada blokady na poziomie wiersza (IX na tabeli, X na wierszu/kluczu) — inne sesje mogą czytać, ale nie mogą wstawiać ani aktualizować tych samych wierszy. Wskazówka `WITH (TABLOCK)` jawnie żąda blokady na całą tabelę (X), blokując wszystkie inne operacje do końca transakcji.
Najbezpieczniejszą metodą jest `SCOPE_IDENTITY()`, która zwraca ostatnią wartość identity wygenerowaną w bieżącym zakresie (sesja + moduł). Unikaj `@@IDENTITY` — zwraca ostatnie ID z dowolnego zakresu, co przy wyzwalaczach daje błędną wartość. Alternatywnie, użyj klauzuli `OUTPUT inserted.Id`.
Najczęstsze przyczyny: (1) zbyt wiele indeksów nieklastrowanych na tabeli docelowej, (2) blokowanie przez inne transakcje (sprawdź `sp_who2` lub `sys.dm_exec_requests`), (3) zbyt wolny dysk dziennika transakcji, (4) autogrowth plików danych lub logu podczas INSERT, (5) wyzwalacze AFTER INSERT wykonujące kosztowne operacje. Zacznij diagnostykę od włączenia rzeczywistego planu wykonania i `SET STATISTICS TIME, IO ON`.
Tak, pod warunkiem że perspektywa jest modyfikowalna (*updatable view*). Oznacza to, że musi opierać się na pojedynczej tabeli bazowej, nie może zawierać agregacji, DISTINCT, GROUP BY, UNION ani klauzul TOP/OFFSET. Od SQL Server 2019 dostępne są także wyzwalacze `INSTEAD OF INSERT` na perspektywach, które pozwalają obsłużyć INSERT na złożonych widokach.
W grupie dostępności operacja INSERT jest wykonywana na replice podstawowej (primary) i synchronizowana z replikami pomocniczymi (secondary) poprzez dziennik transakcji. W trybie synchronicznym INSERT nie zostanie zatwierdzony, dopóki dziennik nie zostanie utwardzony na wszystkich replikach synchronicznych — to wydłuża czas odpowiedzi, ale gwarantuje RPO=0. W trybie asynchronicznym INSERT wraca szybciej, ale repliki mogą być opóźnione.
SQL Server 2025 wprowadza natywne wsparcie dla szyfrowania kolumn JSON podczas INSERT (Always Encrypted z enklawami dla JSON path), ulepszone parallel insert dla tabel z indeksami nieklastrowanymi oraz nowy tryb `OPTIMIZED_LOCKING` (domyślnie włączony), który redukuje eskalację blokad podczas dużych batch insertów. Dodatkowo zoptymalizowano INSERT na tabelach memory-optimized (In-Memory OLTP) — teraz natywnie współpracują z wersjonowaniem wierszy (ADR).
Najlepsze praktyki: (1) użyj `BULK INSERT` z opcją `FIRSTROW = 2` (pomijanie nagłówka) i `CODEPAGE = '65001'` (UTF-8), (2) zdefiniuj plik formatu (XML lub fmt) dla precyzyjnego mapowania typów, (3) ładuj do tabeli staging bez indeksów, potem transformuj do docelowej, (4) rozważ `OPENROWSET(BULK ...)` zamiast BULK INSERT, jeśli plik jest na udziale sieciowym. W Azure: PolyBase do CSV w Blob Storage.
Wszystkie trzy silniki obsługują podstawowe `INSERT INTO ... VALUES` i `INSERT INTO ... SELECT`, ale różnice obejmują: PostgreSQL ma `ON CONFLICT DO UPDATE` (odpowiednik MERGE), MySQL wspiera `ON DUPLICATE KEY UPDATE` i nie ma klauzuli OUTPUT (zamiast tego `LAST_INSERT_ID()`). T-SQL wyróżnia się klauzulą OUTPUT, która zwraca pełny zestaw kolumn z wstawionych wierszy — to możliwość niedostępna natywnie w MySQL i bardziej rozbudowana niż `RETURNING` w PostgreSQL. --- Prawdziwa biegłość w SQL Server to nie tylko znajomość składni — to umiejętność podejmowania świadomych decyzji architektonicznych, które przekładają się na stabilność całego systemu. Jeśli zarządzasz infrastrukturą Microsoft i za

Czy ten artykuł był pomocny?