16


4

MS-SQLはインメモリテーブルをサポートしますか?

最近、代替のバックエンドとして `MS SQL Server`をサポートするように私達のアプリケーションのいくつかを変更し始めました。

私が遭遇した互換性の問題の1つは、永続的な記憶域を必要とせずにセッション中に非常に速いアクセスのためのデータを保持するインメモリテーブルを作成するためのMySQLのCREATE TEMPORARY TABLEの使用です。

MS SQLの同等物は何ですか?

必要条件は、一時テーブルを他のものと同じように使えるようにする必要があるということです。

8 Answer


17


テーブル変数(メモリ内)と2種類の一時テーブルを作成できます。

--visible only to me, in memory (SQL 2000 and above only)
declare @test table (
    Field1 int,
    Field2 nvarchar(50)
);

--visible only to me, stored in tempDB
create table #test (
    Field1 int,
    Field2 nvarchar(50)
)

--visible to everyone, stored in tempDB
create table ##test (
    Field1 int,
    Field2 nvarchar(50)
)

'' '' '

編集:

フィードバックを受けて、これを少し明確にする必要があると思います。

#table`と ## table`は常にTempDBにあります。

`@ Table`変数は通常メモリ上にありますが、それが保証されているわけではありません。 SQLはクエリプランに基づいて決定し、必要に応じてTempDBを使用します。


13


@キース

これはよくある誤解です。テーブル変数は必ずしもメモリに格納されているわけではありません。 実際、SQL Serverは変数をメモリに保持するかTempDBに書き出すかを決定します。 テーブルデータをメモリに保持するための確実な方法(少なくともSQL Server 2005では)はありません。 より詳細な情報については hereを見てください。


3


SQL Server 2005では、 "テーブル変数"を次のように宣言できます。

@fooテーブルを宣言します(Id int、Name varchar(100))。

それからそれを変数のように参照します。

@foo fから*を選択します。bのbに結合します。Id= f.Id

削除する必要はありません - 変数が範囲外になると、消えます。


2


MS SQL Server 2014でも可能です。

_http://msdn.microsoft.com/en-us/library/dn133079.aspx_を参照してください。

これは、(MSDNの)SQL生成コードの例です。

 - メモリ最適化ファイルグループとコンテナを使用してデータベースを作成します。 データベースを作成するimoltp GO

ALTER DATABASE imoltp FILEGROUPを追加します。imoltp_mod MEMORY_OPTIMIZED_DATAを追加します。ALTER DATABASE imoltpを追加します。

imoltp GOを使う

 - 永続的な(データは永続化される)メモリ最適化テーブルを作成します。 -  2つの列にインデックスが付けられます。CREATE TABLE dbo.ShoppingCart(ShoppingCartId INT IDENTITY(1,1)主キーNONCLUSTERED、ユーザーID INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT = 1000000)、CreatedDate DATETIME2はNULLではなく、TotalPrice MONEY)WITH(MEMORY_OPTIMIZED = ON)GO

 - 非永続テーブルを作成します。 データが保持されず、サーバーが突然オフになった場合はデータが失われます。CREATE TABLE dbo.UserSession(SessionId INT IDENTITY(1,1)PRIMARY KEY NONCLUSTERED HASH WITH(BUCKET_COUNT = 400000)、UserId int NOT NULL、CreatedDate DATETIME2 NOT NULL、ShoppingCartId INT、INDEX ix_UserId非ハッシュ化(UserId)WITH(BUCKET_COUNT = 400000))WITH(MEMORY_OPTIMIZED = ON、DURABILITY = SCHEMA_ONLY)GO


1


良い ここにブログを投稿しかし、基本的に#でローカルの一時テーブルを、##でグローバルの一時テーブルの前に付けてください。

CREATE TABLE #localtemp


1


私はあなたが達成しようとしていることを理解しています。 さまざまなデータベースの世界へようこそ。

SQL Server 2000では、#MyLocalTableや MyGlobalTableなど、グローバルにアクセス可能な一時テーブルの場合、テーブル名の先頭に#を付け、ローカルアクセス可能な一時テーブル(セッションに対してローカル)との前に作成した一時テーブルをサポートします。それぞれ。

SQL Server 2005以降では、一時テーブル(ローカル、グローバル)とテーブル変数の両方をサポートしています。SQL2008のテーブル変数の新機能に注意してください。 一時テーブルとテーブル変数の違いはそれほど大きくはありませんが、データベースサーバがそれらを処理する方法にあります。

私は7、6のような古いバージョンのSQLサーバーについては話したくありませんが、私は彼らと仕事をしてきました。

テーブル変数は常にメモリ内に存在すると考えるのが一般的ですが、これは間違っています。 メモリ使用量とデータベースサーバのトランザクション量に応じて、テーブル変数のページはメモリからエクスポートされてtempdbに書き込まれ、残りの処理はそこで行われます(tempdb)。

tempdbは、本質的に永続的なオブジェクトを持たないインスタンス上のデータベースですが、ソートなどのサイドトランザクションを含むワークロードの処理、およびその他の一時的な処理作業を担当します。 一方、テーブル変数(通常はデータが小さい)はメモリ(RAM)に保存されるため、アクセスが速くなるため、常に小さいデータを含むテーブル変数を使用する場合はtempdbドライブを使用することになります。 tempdbにログインします。

データ量が多い場合は、処理を高速にするために一時変数(ローカルとグローバルの両方)に索引を付けることができますが、表変数には索引を付けることができません。 そのため、一時トランザクションによる大量のデータを使用した方が処理が速い場合の選択がわかります。 テーブル変数上のトランザクションだけではログに記録されず、ロールバックすることはできませんが、一時テーブルで行われたトランザクションはロールバックできます。

要約すると、テーブル変数は小さいデータに適していますが、一時テーブルは大きいデータを一時的に処理するには適しています。 トランザクションブロックを使用した適切なトランザクション制御も必要な場合は、テーブル変数はトランザクションをロールバックするためのオプションではないため、この場合は一時テーブルを使用したほうがよいでしょう。

最後に、テンポラリテーブルは常にtempdbを使用するため、一時的なテーブルは常にディスクIOを増加させますが、メモリストレスレベルによっては、テーブル変数は一時的に増加させない可能性があります。

100%を超えるパフォーマンスを達成するためにtempdbを調整する方法に関するヒントが必要な場合は、お知らせください。


0


CREATE TABLE #tmptablename

ハッシュ/ポンド記号のプレフィックスを使う


0


必要な構文は次のとおりです。

テーブル#tablenameを作成します。

#プレフィックスは、テーブルを一時テーブルとして識別します。