Fitur yang Didukung untuk Modul T-SQL yang Dikompilasi Secara Asli
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Topik ini berisi daftar area permukaan T-SQL dan fitur yang didukung dalam isi modul T-SQL yang dikompilasi secara asli, seperti prosedur tersimpan (CREATE PROCEDURE (Transact-SQL)), fungsi skalar yang ditentukan pengguna, fungsi bernilai tabel sebaris, dan pemicu.
Untuk fitur yang didukung sekeliling definisi modul asli, lihat DDL yang didukung untuk modul T-SQL yang Dikompilasi Secara Asli.
Untuk informasi lengkap tentang konstruksi yang tidak didukung, dan untuk informasi tentang cara mengatasi beberapa fitur yang tidak didukung dalam modul yang dikompilasi secara asli, lihat Masalah Migrasi untuk Prosedur Tersimpan yang Dikompilasi Secara Asli. Untuk informasi selengkapnya tentang fitur yang tidak didukung, lihat Konstruksi Transact-SQL Tidak Didukung oleh OLTP Dalam Memori.
Area Permukaan Kueri dalam Modul Asli
Konstruksi kueri berikut didukung:
Ekspresi CASE: CASE dapat digunakan dalam pernyataan atau klausa apa pun yang memungkinkan ekspresi yang valid.
- Berlaku untuk: SQL Server 2017 (14.x).
Dimulai dengan SQL Server 2017 (14.x), pernyataan CASE sekarang didukung untuk modul T-SQL yang dikompilasi secara asli.
Klausa SELECT:
Kolom dan alias nama (menggunakan AS atau = sintaks).
Subkueri skalar
- Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), subkueri skalar sekarang didukung dalam modul yang dikompilasi secara asli.
PUNCAK*
PILIH BERBEDA
Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), operator DISTINCT didukung dalam modul yang dikompilasi secara asli.
- Agregat DISTINCT tidak didukung.
UNION dan UNION ALL
- Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan operator SQL Server 2016 (13.x), UNION dan UNION ALL sekarang didukung dalam modul yang dikompilasi secara asli.
Penetapan variabel
Klausa FROM:
TABEL atau variabel tabel yang dioptimalkan memori FROM <>
DARI <TVF sebaris yang dikompilasi secara asli>
LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN DAN INNER JOIN.
- Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), JOINS sekarang didukung dalam modul yang dikompilasi secara asli.
Subkueri
[AS] table_alias
. Untuk informasi selengkapnya, lihat FROM (Transact-SQL).- Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), Subkueri sekarang didukung dalam modul yang dikompilasi secara asli.
Klausa WHERE:
Predikat filter ADALAH [NOT] NULL
DAN, ANTARA
ATAU, TIDAK, DI, ADA
- Berlaku untuk: SQL Server 2016 (13.x). Dimulai dengan SQL Server 2016 (13.x), operator OR/NOT/IN/EXISTS sekarang didukung dalam modul yang dikompilasi secara asli.
Fungsi agregat AVG, COUNT, COUNT_BIG, MIN, MAX, dan SUM.
MIN dan MAX tidak didukung untuk jenis nvarchar, char, varchar, varchar, varbinary, dan biner.
Tidak ada dukungan untuk DISTINCT dalam klausul ORDER BY .
Didukung dengan GROUP BY (Transact-SQL) jika ekspresi dalam daftar ORDER BY muncul verbatim dalam daftar GROUP BY.
- Misalnya, GROUP BY a + b ORDER BY a + b didukung, tetapi GROUP BY a, b ORDER BY a + b tidak.
Klausa HAVING:
- Tunduk pada batasan ekspresi yang sama dengan klausa WHERE.
ORDER BY dan TOP didukung dalam modul yang dikompilasi secara asli, dengan beberapa batasan
Tidak ada dukungan untuk WITH TIES atau PERCENT dalam klausa TOP .
Tidak ada dukungan untuk DISTINCT dalam klausul ORDER BY .
TOP yang dikombinasikan dengan ORDER BY tidak mendukung lebih dari 8.192 saat menggunakan konstanta dalam klausa TOP .
- Batas ini dapat diturunkan jika kueri berisi gabungan atau fungsi agregat. (Misalnya, dengan satu gabungan (dua tabel), batasnya adalah 4.096 baris. Dengan dua gabungan (tiga tabel), batasnya adalah 2.730 baris.)
- Anda dapat memperoleh hasil yang lebih besar dari 8.192 dengan menyimpan jumlah baris dalam variabel:
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...
Namun, konstanta dalam klausul TOP menghasilkan performa yang lebih baik dibandingkan dengan menggunakan variabel.
Pembatasan pada Transact-SQL yang dikompilasi secara asli tidak berlaku untuk akses Transact-SQL yang ditafsirkan pada tabel yang dioptimalkan memori.
Modifikasi Data
Pernyataan DML berikut didukung.
SISIPKAN NILAI (satu baris per pernyataan) dan SISIPKAN ... PILIH
UPDATE
DELETE
WHERE didukung dengan pernyataan UPDATE dan DELETE.
Bahasa kontrol aliran
Konstruksi bahasa kontrol aliran berikut didukung.
DECLARE @local_variable (Transact-SQL) dapat menggunakan semua Jenis Data yang Didukung untuk OLTP Dalam Memori, serta jenis tabel yang dioptimalkan memori. Variabel dapat dideklarasikan sebagai NULL atau NOT NULL.
-
- Untuk mencapai performa optimal, gunakan satu blok TRY/CATCH untuk seluruh modul T-SQL yang dikompilasi secara asli.
BEGIN ATOMIC (pada tingkat luar prosedur tersimpan). Untuk detail selengkapnya, lihat Blok Atomik.
Operator yang Didukung
Operator berikut didukung.
Operator Perbandingan (Transact-SQL) (misalnya, >, , <>=, dan <=)
Operator unary (+, -).
Operator biner (*, /, +, -, % (modulo)).
- Operator plus (+) didukung pada angka dan string.
Operator logis (AND, OR, NOT).
Operator bitwise ~, &, |, dan ^
Operator APPLY
- Berlaku untuk: SQL Server 2017 (14.x).
Dimulai dengan SQL Server 2017 (14.x), operator APPLY didukung dalam modul yang dikompilasi secara asli.
- Berlaku untuk: SQL Server 2017 (14.x).
Fungsi Bawaan dalam Modul yang Dikompilasi Secara Asli
Fungsi berikut didukung dalam batasan pada tabel yang dioptimalkan memori dan dalam modul T-SQL yang dikompilasi secara asli.
Fungsi tanggal: CURRENT_TIMESTAMP, DATEADD, DATEDIFF, DATEFROMPARTS, DATEPART, DATETIME2FROMPARTS, DATETIMEFROMPARTS, DAY, EOMONTH, GETDATE, GETUTCDATE, MONTH, SMALLDATETIMEFROMPARTS, SYSDATETIME, SYSUTCDATETIME, dan YEAR.
Fungsi string: LEN, LTRIM, RTRIM, dan SUBSTRING.
- Berlaku untuk: SQL Server 2017 (14.x).
Dimulai dengan SQL Server 2017 (14.x), fungsi bawaan berikut juga didukung: TRIM, TRANSLATE, dan CONCAT_WS.
- Berlaku untuk: SQL Server 2017 (14.x).
Fungsi identitas: SCOPE_IDENTITY
Fungsi NULL: ISNULL
Fungsi uniqueidentifier: NEWID dan NEWSEQUENTIALID
Fungsi JSON
- Berlaku untuk: SQL Server 2017 (14.x).
Dimulai dengan SQL Server 2017 (14.x), fungsi JSON didukung dalam modul yang dikompilasi secara asli.
- Berlaku untuk: SQL Server 2017 (14.x).
Fungsi kesalahan: ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, dan ERROR_STATE
Fungsi Sistem: @@rowcount. Pernyataan di dalam pembaruan prosedur tersimpan yang dikompilasi secara asli @@rowcount dan Anda dapat menggunakan @@rowcount dalam prosedur tersimpan yang dikompilasi secara asli untuk menentukan jumlah baris yang terpengaruh oleh pernyataan terakhir yang dijalankan dalam prosedur tersimpan yang dikompilasi secara asli. Namun, @@rowcount diatur ulang ke 0 pada awal dan di akhir eksekusi prosedur tersimpan yang dikompilasi secara asli.
Fungsi keamanan: IS_MEMBER({'group' | 'role'}), IS_ROLEMEMBER ('role' [, 'database_principal']), IS_SRVROLEMEMBER ('role' [, 'login']), ORIGINAL_LOGIN(), SESSION_USER, CURRENT_USER, SUSER_ID(['login']), SUSER_SID(['login'] [, Param2]), SUSER_SNAME([server_user_sid]), SYSTEM_USER, SUSER_NAME, USER, USER_ID(['user']), USER_NAME([id]), CONTEXT_INFO().
Eksekusi modul asli dapat ditumpuk.
Audit
Audit tingkat prosedur didukung dalam prosedur tersimpan yang dikompilasi secara asli.
Untuk informasi selengkapnya tentang audit, lihat Membuat Audit Server dan Spesifikasi Audit Database.
Petunjuk Tabel dan Kueri
Berikut ini didukung:
Petunjuk INDEX, FORCESCAN, dan FORCESEEK, baik dalam sintaks petunjuk tabel atau dalam Klausul OPTION (Transact-SQL) kueri. Untuk informasi selengkapnya, lihat Petunjuk Tabel (Transact-SQL).
URUTAN PAKSA
Petunjuk LOOP JOIN
OPTIMALKAN UNTUK
Untuk informasi selengkapnya, lihat Petunjuk Kueri (Transact-SQL).
Batasan pengurutan
Anda dapat mengurutkan lebih dari 8.000 baris dalam kueri yang menggunakan TOP (Transact-SQL) dan Klausul ORDER BY (Transact-SQL). Namun, tanpa Order BY Clause (Transact-SQL), TOP (Transact-SQL) dapat mengurutkan hingga 8.000 baris (lebih sedikit baris jika ada gabungan).
Jika kueri Anda menggunakan operator TOP (Transact-SQL) dan Order BY Clause (Transact-SQL), Anda dapat menentukan hingga 8192 baris untuk operator TOP. Jika Anda menentukan lebih dari 8192 baris, Anda mendapatkan pesan kesalahan: Msg 41398, Level 16, State 1, ProcedureName<>, LineNumber> Baris< Operator TOP dapat mengembalikan maksimum 8192 baris; <nomor> diminta.
Jika Anda tidak memiliki klausa TOP, Anda dapat mengurutkan sejumlah baris dengan ORDER BY.
Jika Anda tidak menggunakan klausa ORDER BY, Anda dapat menggunakan nilai bilangan bulat apa pun dengan operator TOP.
Contoh dengan TOP N = 8192: Kompilasi
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8192 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
Contoh dengan TOP N > 8192: Gagal dikompilasi.
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
SELECT TOP 8193 ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
Batasan baris 8192 hanya berlaku untuk TOP N
di mana N
adalah konstanta, seperti dalam contoh sebelumnya. Jika Anda membutuhkan N
lebih dari 8192, Anda dapat menetapkan nilai ke variabel dan menggunakan variabel tersebut dengan TOP
.
Contoh menggunakan variabel: Mengkompilasi
CREATE PROCEDURE testTop
WITH EXECUTE AS OWNER, SCHEMABINDING, NATIVE_COMPILATION
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
DECLARE @v int = 8193
SELECT TOP (@v) ShoppingCartId, CreatedDate, TotalPrice FROM dbo.ShoppingCart
ORDER BY ShoppingCartId DESC
END;
GO
Batasan pada baris yang dikembalikan: Ada dua kasus di mana itu berpotensi mengurangi jumlah baris yang dapat dikembalikan oleh operator TOP:
Menggunakan JOIN dalam kueri. Pengaruh WAN pada batasan tergantung pada rencana kueri.
Menggunakan fungsi agregat atau referensi ke fungsi agregat dalam klausa ORDER BY.
Rumus untuk menghitung kasus terburuk maksimum N yang didukung di TOP N adalah: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )
.
Lihat Juga
Prosedur Tersimpan yang Dikompilasi Secara Asli
Masalah Migrasi untuk Prosedur Tersimpan yang Dikompilasi Secara Asli