ネイティブ コンパイル T-SQL モジュールでサポートされる機能
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance
このトピックには、T-SQL 領域とネイティブ コンパイル T-SQL モジュールの本体でサポートされる機能が含まれています。ストアド プロシージャ (CREATE PROCEDURE (Transact-SQL))、スカラー ユーザー定義機能、インライン テーブル値関数、トリガーなどです。
ネイティブ モジュールの定義でサポートされる機能については、「 ネイティブ コンパイル T-SQL モジュールでサポートされる DDL」をご覧ください。
サポートされない構造に関する詳細と、ネイティブ コンパイル モジュールのサポートされない一部の機能に対処する方法については、「 Migration Issues for Natively Compiled Stored Procedures」を参照してください。 サポートされていない機能の詳細については、「 インメモリ OLTP でサポートされていない Transact-SQL の構造」をご覧ください。
ネイティブ モジュールのクエリ領域
次のクエリ構造がサポートされます。
CASE 式: CASE は、有効な式を使用できる任意のステートメントや句で使用できます。
- 適用対象: SQL Server 2017 (14.x)
SQL Server 2017 (14.x) 以降、CASE ステートメントはネイティブ コンパイル T-SQL モジュールに対してサポートされています。
SELECT 句:
列と名前のエイリアス (AS または = 構文を使用)。
スカラー サブクエリ
- 適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、スカラー サブクエリはネイティブ コンパイル モジュールでサポートされています。
TOP*
SELECT DISTINCT
適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、DISTINCT 演算子はネイティブ コンパイル モジュールでサポートされています。
- DISTINCT 集計はサポートされていません。
UNION および UNION ALL
- 適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、UNION および UNION ALL 演算子はネイティブ コンパイル モジュールでサポートされています。
変数割り当て
FROM 句:
FROM <メモリ最適化テーブルまたはテーブル変数>
FROM <ネイティブ コンパイル インライン TVF>
LEFT OUTER JOIN、RIGHT OUTER JOIN、CROSS JOIN、INNER JOIN。
- 適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、JOINS はネイティブ コンパイル モジュールでサポートされています。
サブクエリ
[AS] table_alias
。 詳細については、「FROM (Transact-SQL)」を参照してください。- 適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、サブクエリはネイティブ コンパイル モジュールでサポートされています。
WHERE 句:
フィルター述語 IS [NOT] NULL
AND、BETWEEN
OR、NOT、IN、EXISTS
- 適用対象: SQL Server 2016 (13.x) SQL Server 2016 (13.x) 以降、OR/NOT/IN/EXISTS 演算子はネイティブ コンパイル モジュールでサポートされています。
GROUP BY 句:
集計関数 AVG、COUNT、COUNT_BIG、MIN、MAX、SUM。
MIN および MAX は、nvarchar、char、varchar、varchar、varbinary、および binary 型ではサポートされていません。
ORDER BY 句:
ORDER BY 句での DISTINCT のサポートはありません。
ORDER BY リスト内の式が GROUP BY (Transact-SQL) リスト内にもそのまま出現する場合は、GROUP BY でサポートされます。
- たとえば、GROUP BY a + b ORDER BY a + b はサポートされますが、GROUP BY a, b ORDER BY a + b はサポートされません。
HAVING 句:
- WHERE 句と同じ式の制限が適用されます。
ORDER BY と TOP はネイティブ コンパイル モジュールでサポートされますが、いくつかの制限があります。
WITH TIES 句での PERCENT または TOP のサポートはありません。
ORDER BY 句での DISTINCT のサポートはありません。
TOP と ORDER BY の組み合わせでは、 TOP 句内で定数を使用するときに 8,192 を超える値はサポートされません。
- クエリに結合または集計関数が含まれている場合は、この制限値がさらに小さくなる場合があります (たとえば、1 回の結合 (2 つのテーブル) では、制限値は 4,096 行です。 2 回の結合 (3 つのテーブル) では、制限値は 2,730 行です)。
- 変数内に行の数を格納すると、8,192 より多くの結果を取得できます。
DECLARE @v INT = 9000;
SELECT TOP (@v) ... FROM ... ORDER BY ...
ただし、変数を使用する場合に比べて、 TOP 句内で定数を使用する方がパフォーマンスが向上する結果になります。
ネイティブにコンパイルされる Transact-SQL でのこれらの制限は、インタープリターによって処理される Transact-SQL によるメモリ最適化テーブルへのアクセスには適用されません。
データの変更
以下の DML ステートメントがサポートされています。
INSERT VALUES (ステートメントごとに 1 行) と INSERT ...SELECT
UPDATE
DELETE
WHERE は UPDATE ステートメントと DELETE ステートメントでサポートされています。
フロー制御言語
次のフロー制御言語構成がサポートされています。
DECLARE @local_variable (Transact-SQL) では、すべてのインメモリ OLTP に対してサポートされるデータ型とメモリ最適化テーブル型を使用できます。 変数は NULL または NOT NULL として宣言できます。
-
- パフォーマンスを最適化するには、ネイティブ コンパイル T-SQL モジュール全体に対して 1 つの TRY/CATCH ブロックを使用します。
BEGIN ATOMIC (ストアド プロシージャの外部レベル)。 詳細については、「 Atomic Blocks」を参照してください。
サポートされる演算子
サポートされている演算子は次のとおりです。
比較演算子 (Transact-SQL) (例: >、<、>=、および <=)
単項演算子 (+、-)。
二項演算子 (*、/、+、-、% (剰余))。
- プラス演算子 (+) は、数値と文字列の両方でサポートされています。
論理演算子 (AND、OR、NOT)。
ビット演算子 ~、&、|、および ^
APPLY 演算子
- 適用対象: SQL Server 2017 (14.x)
SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで APPLY 演算子がサポートされます。
- 適用対象: SQL Server 2017 (14.x)
ネイティブ コンパイル モジュールの組み込み関数
メモリ最適化テーブルの構造とネイティブ コンパイル T-SQL モジュールでは、次の関数がサポートされます。
日付関数: CURRENT_TIMESTAMP、DATEADD、DATEDIFF、DATEFROMPARTS、DATEPART、DATETIME2FROMPARTS、DATETIMEFROMPARTS、DAY、EOMONTH、GETDATE、GETUTCDATE、MONTH、SMALLDATETIMEFROMPARTS、SYSDATETIME、SYSUTCDATETIME、および YEAR
文字列関数: LEN、LTRIM、RTRIM、および SUBSTRING。
- 適用対象: SQL Server 2017 (14.x)
SQL Server 2017 (14.x) 以降では、組み込み関数の TRIM、TRANSLATE、CONCAT_WS もサポートされます。
- 適用対象: SQL Server 2017 (14.x)
ID 関数: SCOPE_IDENTITY
NULL 関数: ISNULL
Uniqueidentifier 関数: NEWID および NEWSEQUENTIALID
JSON 関数
- 適用対象: SQL Server 2017 (14.x)
SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで JSON 関数がサポートされます。
- 適用対象: SQL Server 2017 (14.x)
エラー関数: ERROR_LINE、ERROR_MESSAGE、ERROR_NUMBER、ERROR_PROCEDURE、ERROR_SEVERITY、および ERROR_STATE
システム関数: @@rowcount。 ネイティブ コンパイル ストアド プロシージャ内のステートメントによって、@@rowcount が更新されます。ネイティブ コンパイル ストアド プロシージャ内で @@rowcount を使用し、ネイティブ コンパイル ストアド プロシージャ内で実行された最後のステートメントによる影響を受けた行の数を決定することができます。 ただし、ネイティブ コンパイル ストアド プロシージャの実行の開始時および終了時に、@@rowcount は 0 にリセットされます。
セキュリティ関数: 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()。
ネイティブ モジュールの実行は入れ子にすることができます。
監査
プロシージャ レベルの監査はネイティブ コンパイル ストアド プロシージャでサポートされています。
監査の詳細については、「 Create a Server Audit and Database Audit Specification」を参照してください。
テーブル ヒントとクエリ ヒント
サポート対象は次のとおりです。
テーブル ヒント構文またはクエリの OPTION 句 (Transact-SQL) での INDEX、FORCESCAN、および FORCESEEK ヒント。 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。
FORCE ORDER
LOOP 結合ヒント
OPTIMIZE FOR
詳細については、「 クエリ ヒント (Transact-SQL)」を参照してください。
並べ替えに関する制限事項
TOP (Transact-SQL) および ORDER BY 句 (Transact-SQL) を使用するクエリでは、8,000 を超える行の並べ替えを行うことができます。 ただし、ORDER BY 句 (Transact-SQL) を使用しない場合、TOP (Transact-SQL) で並べ替えができる行数は最大で 8,000 です (結合がある場合は、より少ない行数になります)。
クエリが TOP (Transact-SQL) 演算子および ORDER BY 句 (Transact-SQL) を使用する場合、TOP 演算子には 8192 行まで指定できます。 「8192 行を超える行を指定すると、メッセージ 41398、レベル 16、状態 1、プロシージャ <procedureName>、行 <lineNumber> TOP 演算子は、最大 8192 行を返すことができます。<number> が要求されました」というエラー メッセージが表示されます。
TOP 句がない場合は、ORDER BY で任意の数の行を並べ替えることができます。
ORDER BY 句を使用しない場合、TOP 演算子と共に任意の整数値を使用できます。
TOP N = 8192 の例: コンパイル
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
TOP N > 8192 の例: コンパイルは失敗します。
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
8192 行の制限は、 TOP N
が定数の場合に、前の例のように、 N
にのみ適用されます。 8192 より大きな N
が必要である場合は、値を変数に割り当て、 TOP
と共にその変数を使用することができます。
変数を使用した例: コンパイル
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
返される行に関する制限事項: TOP 演算子から返される行数を減らせる可能性がある場合が 2 つあります。
クエリで JOIN を使用します。 制限における JOIN の影響は、クエリ プランによって異なります。
ORDER BY 句で集計関数または集計関数への参照を使用する。
TOP N での最悪のケースでサポートされる最大 N を計算する式は次のとおりです: N = floor ( 65536 / number_of_tables * 8 + total_size+of+aggs )
。