ネイティブ コンパイル 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 のサポートはありません。

  • TOPORDER 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 ステートメントでサポートされています。

フロー制御言語

次のフロー制御言語構成がサポートされています。

サポートされる演算子

サポートされている演算子は次のとおりです。

  • 比較演算子 (Transact-SQL) (例: >、<、>=、および <=)

  • 単項演算子 (+、-)。

  • 二項演算子 (*、/、+、-、% (剰余))。

    • プラス演算子 (+) は、数値と文字列の両方でサポートされています。
  • 論理演算子 (AND、OR、NOT)。

  • ビット演算子 ~、&、|、および ^

  • APPLY 演算子

    • 適用対象: SQL Server 2017 (14.x)
      SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで APPLY 演算子がサポートされます。

ネイティブ コンパイル モジュールの組み込み関数

メモリ最適化テーブルの構造とネイティブ コンパイル T-SQL モジュールでは、次の関数がサポートされます。

  • すべての数学関数 (Transact-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 もサポートされます。
  • ID 関数: SCOPE_IDENTITY

  • NULL 関数: ISNULL

  • Uniqueidentifier 関数: NEWID および NEWSEQUENTIALID

  • JSON 関数

    • 適用対象: SQL Server 2017 (14.x)
      SQL Server 2017 (14.x) 以降では、ネイティブ コンパイル モジュールで JSON 関数がサポートされます。
  • エラー関数: 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」を参照してください。

テーブル ヒントとクエリ ヒント

サポート対象は次のとおりです。

詳細については、「 クエリ ヒント (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 )

参照

ネイティブ コンパイル ストアド プロシージャ
ネイティブ コンパイル ストアド プロシージャの移行に関する問題