Gambaran umum dan skenario penggunaan OLTP Dalam Memori

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

OLTP Dalam Memori adalah teknologi utama yang tersedia di SQL Server dan SQL Database untuk mengoptimalkan performa pemrosesan transaksi, penyerapan data, beban data, dan skenario data sementara. Artikel ini mencakup gambaran umum teknologi dan menguraikan skenario penggunaan untuk OLTP Dalam Memori. Gunakan informasi ini untuk menentukan apakah OLTP Dalam Memori tepat untuk aplikasi Anda. Artikel ini menyimpulkan dengan contoh yang memperlihatkan objek OLTP Dalam Memori, referensi ke demo perf, dan referensi ke sumber daya yang dapat Anda gunakan untuk langkah berikutnya.

Gambaran umum OLTP Dalam Memori

OLTP Dalam Memori dapat memberikan keuntungan performa yang besar, untuk beban kerja yang tepat. Meskipun pelanggan telah melihat hingga 30X peningkatan performa dalam beberapa kasus, berapa banyak keuntungan yang Anda lihat tergantung pada beban kerja.

Sekarang, dari mana perolehan performa ini berasal? Intinya, OLTP Dalam Memori meningkatkan performa pemrosesan transaksi dengan membuat akses data dan eksekusi transaksi lebih efisien, dan dengan menghapus ketidakcocokan kunci dan kait antara transaksi yang dijalankan secara bersamaan. OLTP Dalam Memori tidak cepat karena dalam memori; cepat karena pengoptimalan di sekitar data dalam memori. Algoritma penyimpanan, akses, dan pemrosesan data dirancang ulang dari bawah ke atas untuk memanfaatkan peningkatan terbaru dalam memori dan komputasi konkurensi tinggi.

Sekarang, hanya karena data hidup dalam memori tidak berarti Anda kehilangannya ketika ada kegagalan. Secara default, semua transaksi sepenuhnya tahan lama, yang berarti Anda memiliki jaminan durabilitas yang sama dengan yang Anda dapatkan untuk tabel lain di SQL Server: sebagai bagian dari penerapan transaksi, semua perubahan ditulis ke log transaksi, pada disk. Jika ada kegagalan kapan saja setelah transaksi dilakukan, data Anda ada saat database kembali online. Selain itu, OLTP Dalam Memori berfungsi dengan semua ketersediaan tinggi dan kemampuan pemulihan bencana SQL Server, seperti grup ketersediaan, instans kluster failover, pencadangan/pemulihan, dan sebagainya.

Untuk menggunakan OLTP Dalam Memori dalam database, Anda menggunakan satu atau beberapa jenis objek berikut:

  • Tabel yang dioptimalkan memori digunakan untuk menyimpan data pengguna. Anda mendeklarasikan tabel untuk dioptimalkan memori pada waktu pembuatan.
  • Tabel yang tidak tahan lama digunakan untuk data sementara, baik untuk penembolokan atau untuk tataan hasil menengah (menggantikan tabel sementara tradisional). Tabel yang tidak tahan lama adalah tabel yang dioptimalkan memori yang dideklarasikan dengan DURABILITY=SCHEMA_ONLY, yang berarti bahwa perubahan pada tabel ini tidak menimbulkan IO apa pun. Ini menghindari penggunaan sumber daya IO log untuk kasus di mana durabilitas tidak menjadi perhatian.
  • Jenis tabel yang dioptimalkan memori digunakan untuk parameter bernilai tabel (TVP) dan tataan hasil menengah dalam prosedur tersimpan. Jenis tabel yang dioptimalkan memori dapat digunakan alih-alih jenis tabel tradisional. Variabel tabel dan TVP yang dinyatakan menggunakan jenis tabel yang dioptimalkan memori mewarisi manfaat tabel yang dioptimalkan memori yang tidak tahan lama: akses data yang efisien, dan tanpa IO.
  • Modul T-SQL yang dikompilasi secara asli digunakan untuk lebih mengurangi waktu yang diperlukan untuk transaksi individu dengan mengurangi siklus CPU yang diperlukan untuk memproses operasi. Anda mendeklarasikan modul Transact-SQL untuk dikompilasi secara asli pada waktu pembuatan. Saat ini, modul T-SQL berikut dapat dikompilasi secara asli: prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna skalar.

OLTP Dalam Memori dibangun ke dalam SQL Server dan SQL Database. Karena objek-objek ini berulah dengan cara yang sama dengan rekan-rekan tradisionalnya, Anda sering kali dapat memperoleh manfaat performa sambil hanya membuat perubahan minimal pada database dan aplikasi. Selain itu, Anda dapat memiliki tabel berbasis disk yang dioptimalkan memori dan tradisional dalam database yang sama, dan menjalankan kueri di dua tabel tersebut. Lihat contoh skrip Transact-SQL untuk setiap jenis objek ini nanti di artikel ini.

Skenario penggunaan untuk OLTP Dalam Memori

OLTP Dalam Memori bukan tombol ajaib cepat, dan tidak cocok untuk semua beban kerja. Misalnya, tabel yang dioptimalkan memori tidak menurunkan pemanfaatan CPU Anda jika sebagian besar kueri melakukan agregasi atas berbagai data. Indeks penyimpan kolom membantu skenario tersebut.

Perhatian

Masalah yang diketahui: Untuk database dengan tabel yang dioptimalkan memori, melakukan pencadangan log transaksi tanpa pemulihan, dan kemudian menjalankan pemulihan log transaksi dengan pemulihan, dapat mengakibatkan proses pemulihan database yang tidak responsif. Masalah ini juga dapat memengaruhi fungsionalitas pengiriman log. Untuk mengatasi masalah ini, instans SQL Server dapat dimulai ulang sebelum memulai proses pemulihan.

Berikut adalah daftar skenario dan pola aplikasi di mana kami telah melihat pelanggan berhasil dengan OLTP Dalam Memori.

Pemrosesan transaksi throughput tinggi dan latensi rendah

Ini adalah skenario inti di mana kami membangun OLTP Dalam Memori: mendukung transaksi dalam volume besar, dengan latensi rendah yang konsisten untuk transaksi individu.

Skenario beban kerja umum adalah: perdagangan instrumen keuangan, taruhan olahraga, game seluler, dan pengiriman iklan. Pola umum lainnya adalah "katalog" yang sering dibaca dan/atau diperbarui. Salah satu contohnya adalah tempat Anda memiliki file besar, masing-masing didistribusikan melalui beberapa node kluster, dan Anda membuat katalog lokasi setiap pecahan setiap file dalam tabel yang dioptimalkan memori.

Pertimbangan implementasi

Gunakan tabel yang dioptimalkan memori untuk tabel transaksi inti Anda, yaitu tabel dengan transaksi paling penting performa. Gunakan prosedur tersimpan yang dikompilasi secara asli untuk mengoptimalkan eksekusi logika yang terkait dengan transaksi bisnis. Semakin banyak logika yang dapat Anda dorong ke prosedur tersimpan dalam database, semakin banyak manfaat yang Anda lihat dari OLTP Dalam Memori.

Untuk memulai aplikasi yang ada:

  1. Gunakan laporan analisis performa transaksi untuk mengidentifikasi objek yang ingin Anda migrasikan.
  2. Gunakan Memory Optimization Advisor dan Native Compilation Advisor untuk membantu migrasi.

Penyerapan data, termasuk IoT (Internet-of-Things)

OLTP Dalam Memori baik dalam menyerap data dalam volume besar dari banyak sumber yang berbeda secara bersamaan. Dan seringkali bermanfaat untuk menyerap data ke dalam database SQL Server dibandingkan dengan tujuan lain, karena SQL Server membuat menjalankan kueri terhadap data dengan cepat, dan memungkinkan Anda mendapatkan wawasan real-time.

Pola aplikasi umum adalah:

  • Menyerap pembacaan sensor dan peristiwa, dan memungkinkan pemberitahuan serta analisis historis.
  • Mengelola pembaruan batch, bahkan dari beberapa sumber, sambil meminimalkan dampak pada beban kerja baca bersamaan.

Pertimbangan implementasi

Gunakan tabel yang dioptimalkan memori untuk penyerapan data. Jika penyerapan sebagian besar terdiri dari sisipan (bukan pembaruan) dan jejak penyimpanan OLTP Dalam Memori data menjadi perhatian, baik

  • Gunakan pekerjaan untuk secara teratur membongkar data batch ke tabel berbasis disk dengan indeks penyimpan kolom berkluster, menggunakan pekerjaan yang melakukan INSERT INTO <disk-based table> SELECT FROM <memory-optimized table>; atau
  • Gunakan tabel yang dioptimalkan memori temporal untuk mengelola data historis - dalam mode ini, data historis berada di disk, dan pergerakan data dikelola oleh sistem.

Repositori sampel SQL Server berisi aplikasi kisi pintar yang menggunakan tabel yang dioptimalkan memori temporal, jenis tabel yang dioptimalkan memori, dan prosedur tersimpan yang dikompilasi secara asli, untuk mempercepat penyerapan data, sambil mengelola jejak penyimpanan OLTP Dalam Memori data sensor:

Penembolokan dan status sesi

Teknologi OLTP Dalam Memori membuat mesin database di database SQL Server atau Azure SQL menjadi platform yang menarik untuk mempertahankan status sesi (misalnya, untuk aplikasi ASP.NET) dan untuk penembolokan.

status sesi ASP.NET adalah kasus penggunaan yang berhasil untuk OLTP Dalam Memori. Dengan SQL Server, satu pelanggan akan mencapai 1,2 Juta permintaan per detik. Sementara itu, mereka telah mulai menggunakan OLTP Dalam Memori untuk kebutuhan penembolokan semua aplikasi tingkat menengah di perusahaan. Detail: Bagaimana bwin menggunakan OLTP Dalam Memori SQL Server 2016 (13.x) untuk mencapai performa dan skala yang belum pernah terjadi sebelumnya

Pertimbangan implementasi

Anda dapat menggunakan tabel yang dioptimalkan memori yang tidak tahan lama sebagai penyimpanan nilai kunci sederhana dengan menyimpan BLOB dalam kolom varbinary(max). Atau, Anda dapat menerapkan cache semi terstruktur dengan dukungan JSON di SQL Server dan SQL Database. Terakhir, Anda dapat membuat cache relasional penuh melalui tabel yang tidak tahan lama dengan skema relasional penuh, termasuk berbagai jenis dan batasan data.

Mulai mengoptimalkan memori ASP.NET status sesi dengan menggunakan skrip yang diterbitkan di GitHub untuk mengganti objek yang dibuat oleh penyedia status sesi SQL Server bawaan: aspnet-session-state

Studi kasus pelanggan

penggantian objek tempdb

Gunakan tabel yang tidak tahan lama dan jenis tabel yang dioptimalkan memori untuk menggantikan struktur berbasis tradisional tempdb Anda, seperti tabel sementara, variabel tabel, dan parameter bernilai tabel (TVP).

Variabel tabel yang dioptimalkan memori dan tabel yang tidak tahan lama biasanya mengurangi CPU dan menghapus IO log sepenuhnya, jika dibandingkan dengan variabel tabel tradisional dan tabel #temp.

Pertimbangan implementasi

Untuk memulai: Meningkatkan performa tabel sementara dan variabel tabel menggunakan pengoptimalan memori.

Studi kasus pelanggan

ETL (Ekstrak Beban Transformasi)

Alur kerja ETL sering menyertakan beban data ke dalam tabel penahapan, transformasi data, dan memuat ke dalam tabel akhir.

Gunakan tabel yang dioptimalkan memori yang tidak tahan lama untuk penahapan data. Mereka sepenuhnya menghapus semua IO, dan membuat akses data lebih efisien.

Pertimbangan implementasi

Jika Anda melakukan transformasi pada tabel penahapan sebagai bagian dari alur kerja, Anda dapat menggunakan prosedur tersimpan yang dikompilasi secara asli untuk mempercepat transformasi ini. Jika Anda dapat melakukan transformasi ini secara paralel, Anda mendapatkan manfaat penskalaan tambahan dari pengoptimalan memori.

Sampel skrip

Sebelum dapat mulai menggunakan OLTP Dalam Memori, Anda perlu membuat grup file MEMORY_OPTIMIZED_DATA. Selain itu, sebaiknya gunakan tingkat kompatibilitas database 130 (atau lebih tinggi), dan atur opsi database MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ke AKTIF.

Anda dapat menggunakan skrip di lokasi berikut untuk membuat grup file di folder data default, dan mengonfigurasi pengaturan yang direkomendasikan:

Contoh skrip berikut mengilustrasikan objek OLTP Dalam Memori yang bisa Anda buat di database Anda.

Pertama, mulailah dengan mengonfigurasi database untuk OLTP Dalam Memori.

-- configure recommended DB option
ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;
GO

Anda dapat membuat tabel dengan durabilitas yang berbeda:

-- memory-optimized table
CREATE TABLE dbo.table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON);
GO
-- non-durable table
CREATE TABLE dbo.temp_table1
( c1 INT IDENTITY PRIMARY KEY NONCLUSTERED,
  c2 NVARCHAR(MAX))
WITH (MEMORY_OPTIMIZED=ON,
      DURABILITY=SCHEMA_ONLY);
GO

Anda dapat membuat jenis tabel sebagai tabel dalam memori.

-- memory-optimized table type
CREATE TYPE dbo.tt_table1 AS TABLE
( c1 INT IDENTITY,
  c2 NVARCHAR(MAX),
  is_transient BIT NOT NULL DEFAULT (0),
  INDEX ix_c1 HASH (c1) WITH (BUCKET_COUNT=1024))
WITH (MEMORY_OPTIMIZED=ON);
GO

Anda dapat membuat prosedur tersimpan yang dikompilasi secara asli. Untuk informasi selengkapnya, lihat Memanggil Prosedur Tersimpan yang Dikompilasi Secara Asli dari Aplikasi Akses Data.

-- natively compiled stored procedure
CREATE PROCEDURE dbo.usp_ingest_table1
  @table1 dbo.tt_table1 READONLY
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC
    WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT,
          LANGUAGE=N'us_english')

  DECLARE @i INT = 1

  WHILE @i > 0
  BEGIN
    INSERT dbo.table1
    SELECT c2
    FROM @table1
    WHERE c1 = @i AND is_transient=0

    IF @@ROWCOUNT > 0
      SET @i += 1
    ELSE
    BEGIN
      INSERT dbo.temp_table1
      SELECT c2
      FROM @table1
      WHERE c1 = @i AND is_transient=1

      IF @@ROWCOUNT > 0
        SET @i += 1
      ELSE
        SET @i = 0
    END
  END

END
GO
-- sample execution of the proc
DECLARE @table1 dbo.tt_table1;
INSERT @table1 (c2, is_transient) VALUES (N'sample durable', 0);
INSERT @table1 (c2, is_transient) VALUES (N'sample non-durable', 1);
EXECUTE dbo.usp_ingest_table1 @table1=@table1;
SELECT c1, c2 from dbo.table1;
SELECT c1, c2 from dbo.temp_table1;
GO