In-Memory gambaran umum OLTP dan skenario penggunaan

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance

In-Memory OLTP adalah teknologi utama yang tersedia dalam 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 In-Memory OLTP. Gunakan informasi ini untuk menentukan apakah In-Memory OLTP tepat untuk aplikasi Anda. Artikel ini menyimpulkan dengan contoh yang memperlihatkan In-Memory objek OLTP, referensi ke demo perf, dan referensi ke sumber daya yang dapat Anda gunakan untuk langkah berikutnya.

Artikel ini membahas teknologi OLTP In-Memory baik di SQL Server maupun SQL Database. Untuk informasi selengkapnya khusus untuk data dalam memori di Azure SQL, lihat Mengoptimalkan performa dengan menggunakan teknologi dalam memori di Azure SQL Database dan Azure SQL Managed Instance dan Blog: In-Memory OLTP di Azure SQL Database.

Ringkasan OLTP In-Memory

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

Sekarang, dari mana perolehan performa ini berasal? Intinya, In-Memory OLTP meningkatkan performa pemrosesan transaksi dengan membuat akses data dan eksekusi transaksi lebih efisien, dan dengan menghapus ketidakcocokan kunci dan kait antara menjalankan transaksi secara bersamaan. In-Memory OLTP tidak cepat karena dalam memori; cepat karena dioptimalkan di sekitar data yang ada dalam memori. Algoritma penyimpanan, akses, dan pemrosesan data didesain 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 dalam 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 di sana saat database kembali online. Selain itu, In-Memory OLTP bekerja dengan semua ketersediaan tinggi dan kemampuan pemulihan bencana SQL Server, seperti grup ketersediaan AlwaysOn, Instans Kluster Failover AlwaysOn (SQL Server), pencadangan/pemulihan, dll.

Untuk menggunakan In-Memory OLTP dalam database Anda, Anda menggunakan satu atau beberapa jenis objek berikut ini:

  • 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 (mengganti 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), serta tataan hasil menengah dalam prosedur tersimpan. Ini 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 dibutuhkan 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 skalar yang ditentukan pengguna.

In-Memory OLTP dibangun ke dalam SQL Server dan SQL Database. Karena objek-objek ini berkinerja mirip dengan rekan-rekan tradisional mereka, Anda sering 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 kedua tabel tersebut. Anda akan menemukan skrip Transact-SQL dengan contoh untuk masing-masing jenis objek ini menuju bagian bawah artikel ini.

Skenario penggunaan untuk OLTP In-Memory

In-Memory OLTP bukanlah 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.

Berikut adalah daftar skenario dan pola aplikasi di mana kami telah melihat pelanggan berhasil dengan In-Memory OLTP.

Pemrosesan transaksi throughput tinggi dan latensi rendah

Ini adalah skenario inti yang kami bangun In-Memory OLTP: 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 lain yang telah kita lihat 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 In-Memory OLTP.

Untuk memulai di aplikasi yang sudah ada:

  1. Gunakan laporan analisis performa transaksi untuk mengidentifikasi objek yang ingin Anda migrasikan.
  2. Gunakan pengoptimalan memori dan penasihat kompilasi asli untuk membantu migrasi.

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

In-Memory OLTP 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 kueri berjalan terhadap data dengan cepat, dan memungkinkan Anda untuk 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 memori yang dioptimalkan untuk penyerapan data. Jika penyerapan sebagian besar terdiri dari sisipan (bukan pembaruan) dan In-Memory jejak penyimpanan data OLTP 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 In-Memory data sensor:

Status penembolokan dan sesi

Teknologi OLTP In-Memory membuat mesin database dalam database SQL Server atau Azure SQL menjadi platform yang menarik untuk mempertahankan keadaan sesi (misalnya, untuk aplikasi ASP.NET) dan untuk penembolokan.

ASP.NET keadaan sesi adalah kasus penggunaan yang berhasil untuk In-Memory OLTP. Dengan SQL Server, satu pelanggan akan mencapai 1,2 Juta permintaan per detik. Sementara itu, mereka telah mulai menggunakan In-Memory OLTP untuk kebutuhan penembolokan semua aplikasi tingkat menengah di perusahaan. Detail: Bagaimana bwin menggunakan SQL Server 2016 (13.x) In-Memory OLTP 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(maks). 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 keadaan sesi dengan menggunakan skrip yang diterbitkan pada GitHub untuk mengganti objek yang dibuat oleh penyedia keadaan 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 sepenuhnya menghapus IO log, jika dibandingkan dengan variabel tabel tradisional dan tabel #temp.

Pertimbangan implementasi

Untuk memulai, lihat: 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 pemuatan 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.

Skrip sampel

Sebelum dapat mulai menggunakan In-Memory OLTP, 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 In-Memory objek OLTP yang bisa Anda buat di database Anda.

Pertama,mulailah dengan mengonfigurasi database untuk In-Memory OLTP.

-- 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

Sumber daya untuk mempelajari lebih lanjut

Lihat juga

Langkah berikutnya