Bagikan melalui


Kolase dan Halaman Kode

In-Memory OLTP memiliki batasan pada halaman kode yang didukung untuk kolom karakter (var) dalam tabel yang dioptimalkan memori dan kolase yang didukung yang digunakan dalam indeks dan prosedur tersimpan yang dikompilasi secara asli.

Halaman kode untuk nilai karakter (var)menentukan pemetaan antara karakter dan representasi byte yang disimpan dalam tabel. Misalnya, dengan halaman kode Windows Latin 1 (1252; SQL Server default), karakter 'a' sesuai dengan 0x61 byte.

Halaman kode dari nilai karakter (var) ditentukan oleh kolase yang terkait dengan nilai . Misalnya, kolase SQL_Latin1_General_CP1_CI_AS memiliki halaman kode terkait 1252.

Kolase nilai diwarisi dari kolase database, atau dapat ditentukan secara eksplisit menggunakan kata kunci COLLATE. Kolase database tidak dapat diubah jika database berisi tabel yang dioptimalkan memori atau prosedur tersimpan yang dikompilasi secara asli. Contoh berikut mengatur kolase database dan membuat tabel, yang memiliki kolom dengan kolase yang berbeda. Database menggunakan kolater latin yang tidak peka huruf besar/kecil.

Indeks hanya dapat dibuat pada kolom string jika menggunakan kolase BIN2. Variabel LastName menggunakan kolab BIN2. FirstName menggunakan default database, yang CI_AS (tidak peka huruf besar/kecil, peka aksen).

Penting

Anda tidak dapat menggunakan urutan menurut atau kelompokkan menurut pada kolom string indeks yang tidak menggunakan kolae BIN2.

CREATE DATABASE IMOLTP  
  
ALTER DATABASE IMOLTP ADD FILEGROUP IMOLTP_mod CONTAINS MEMORY_OPTIMIZED_DATA  
ALTER DATABASE IMOLTP ADD FILE( NAME = 'IMOLTP_mod' , FILENAME = 'c:\data\IMOLTP_mod') TO FILEGROUP IMOLTP_mod;  
--GO  
  
--  set the database collations  
ALTER DATABASE IMOLTP COLLATE Latin1_General_100_CI_AS  
GO  
  
--  
USE IMOLTP   
GO  
  
-- create a table with collation  
CREATE TABLE Employees (  
  EmployeeID int NOT NULL ,   
  LastName nvarchar(20) COLLATE Latin1_General_100_BIN2 NOT NULL INDEX IX_LastName NONCLUSTERED,   
  FirstName nvarchar(10) NOT NULL ,  
  CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED HASH(EmployeeID)  WITH (BUCKET_COUNT=1024)  
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_AND_DATA)  
GO  

Pembatasan berikut berlaku untuk tabel yang dioptimalkan memori dan prosedur tersimpan yang dikompilasi secara asli:

  • (var)kolom karakter dalam tabel memori yang dioptimalkan harus menggunakan kolase halaman kode 1252. Pembatasan ini tidak berlaku untuk kolom karakter n(var). Kode berikut mengambil semua kolase 1252:

    -- all supported collations for (var)char columns in memory-optimized tables  
    select * from sys.fn_helpcollations()  
    where collationproperty(name, 'codepage') = 1252;  
    

    Jika Anda perlu menyimpan karakter non-Latin, gunakan kolom karakter n(var).

  • Indeks pada kolom karakter (n)(var)hanya dapat ditentukan dengan kolase BIN2 (lihat contoh pertama). Kueri berikut mengambil semua kolae BIN2 yang didukung:

    -- all supported collations for indexes on memory-optimized tables and   
    -- comparison/sorting in natively compiled stored procedures  
    select * from sys.fn_helpcollations() where name like '%BIN2'  
    

    Jika Anda mengakses tabel melalui Transact-SQL yang ditafsirkan, Anda dapat menggunakan COLLATE kata kunci untuk mengubah kolase dengan ekspresi atau operasi pengurutan. Lihat contoh terakhir untuk sampel ini.

  • Prosedur tersimpan yang dikompilasi secara asli tidak dapat menggunakan parameter, variabel lokal, atau konstanta string dari jenis karakter (var) jika kolase database bukan kolase halaman kode 1252.

  • Semua ekspresi dan operasi pengurutan di dalam prosedur tersimpan yang dikompilasi secara asli harus menggunakan kolase BIN2. Implikasinya adalah bahwa semua perbandingan dan operasi pengurutan didasarkan pada titik kode Unicode dari karakter (representasi biner). Misalnya semua pengurutan peka huruf besar/kecil ('Z' datang sebelum 'a'). Jika perlu, gunakan Transact-SQL yang ditafsirkan untuk pengurutan dan perbandingan yang tidak peka huruf besar/kecil.

  • Pemotokan data UTF-16 tidak didukung di dalam prosedur tersimpan yang dikompilasi secara asli. Ini berarti bahwa nilai n(var)char(n) tidak dapat dikonversi ke tipe n(var)char(i), jika i<n, jika kolase memiliki properti _SC. Misalnya, berikut ini tidak didukung:

    -- column definition using an _SC collation  
     c2 nvarchar(200) collate Latin1_General_100_CS_AS_SC not null   
    -- assignment to a smaller variable, requiring truncation  
     declare @c2 nvarchar(100) = '';  
     select @c2 = c2  
    

    Fungsi manipulasi string, seperti LEN, SUBSTRING, LTRIM, dan RTRIM dengan data UTF-16 tidak didukung di dalam prosedur tersimpan yang dikompilasi secara asli. Anda tidak dapat menggunakan fungsi manipulasi string ini untuk nilai karakter n(var) yang memiliki kolase _SC.

    Deklarasikan variabel menggunakan jenis yang cukup besar untuk menghindari pemotokan.

Contoh berikut menunjukkan beberapa implikasi dan solusi untuk batasan kolaterasi dalam In-Memory OLTP. Contohnya menggunakan tabel Karyawan yang ditentukan di atas. Sampel ini mencantumkan semua karyawan . Perhatikan bahwa untuk LastName, karena kolase biner, nama huruf besar diurutkan sebelum huruf kecil. Oleh karena itu, 'Thomas' hadir sebelum 'nolan' karena karakter huruf besar memiliki titik kode yang lebih rendah. FirstName memiliki kolater yang tidak peka huruf besar/kecil. Jadi, pengurutan berdasarkan huruf alfabet, bukan titik kode karakter.

-- insert a number of values  
INSERT Employees VALUES (1,'thomas', 'john')  
INSERT Employees VALUES (2,'Thomas', 'rupert')  
INSERT Employees VALUES (3,'Thomas', 'Jack')  
INSERT Employees VALUES (4,'Thomas', 'annie')  
INSERT Employees VALUES (5,'nolan', 'John')  
GO  
  
-- ===========  
SELECT EmployeeID, LastName, FirstName FROM Employees  
ORDER BY LastName, FirstName  
GO  
  
-- ===========  
-- specify collation: sorting uses case-insensitive collation, thus 'nolan' comes before 'Thomas'  
SELECT * FROM Employees  
ORDER BY LastName COLLATE Latin1_General_100_CI_AS, FirstName  
GO  
  
-- ===========  
-- retrieve employee by Name  
-- must use BIN2 collation for comparison in natively compiled stored procedures  
CREATE PROCEDURE usp_EmployeeByName @LastName nvarchar(20), @FirstName nvarchar(10)  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS BEGIN ATOMIC WITH   
(  TRANSACTION ISOLATION LEVEL = SNAPSHOT,  
  LANGUAGE = N'us_english'  
)  
  SELECT EmployeeID, LastName, FirstName FROM dbo.Employees  
  WHERE   
    LastName = @LastName AND  
    FirstName COLLATE Latin1_General_100_BIN2 = @FirstName  
  
END  
GO  
  
-- this does not return any rows, as EmployeeID 1 has first name 'john', which is not equal to 'John' in a binary collation  
EXEC usp_EmployeeByName 'thomas', 'John'  
  
-- this retrieves EmployeeID 1  
EXEC usp_EmployeeByName 'thomas', 'john'  

Lihat juga

OLTP Dalam Memori (Pengoptimalan Dalam Memori)