2008-08-26 9 views
16

最近、私は代替バックエンドとしてMS SQL Serverをサポートするために、私たちのアプリケーションの一部を変更し始めました。私はに走った互換性の問題のMS-SQLはメモリ内テーブルをサポートしていますか?

一つは、MySQLの使用は、永続的なストレージを必要とせず、セッションの間、非常に高速なアクセスのためのデータを保持するメモリ内のテーブルを作成するための一時テーブルを作成します。

MS SQLで同等とは何ですか?

要件は、私はそれが永久的なもので、ちょうど他の同じよう特にJOINを一時テーブルを使用できるようにする必要があるということです。

+1

私はあなたが認識している願っていますMySQLでは、ユーザが作成した一時テーブルは、デフォルトでメモリに格納されていません! CREATE TABLEステートメントでENGINE = MEMORYを指定した場合にのみ、テーブルはメモリに格納されます。そうしないと、デフォルトのストレージエンジン(MyISAMまたはINNODBの可能性が高い)を使用して一時テーブルが作成され、ディスクに保存されます。 複雑な結合中にMySQLによって作成された内部作成の一時テーブルと、ユーザー作成のものを混同しないでください。それらは可能であればメモリに作成されます。 –

答えて

13

@Keithこれはよくある誤解です:テーブル変数は必ずしもメモリに保存されません。実際、SQL Serverは、変数をメモリに保持するか、TempDBに流すかを決定します。テーブルデータが確実にメモリに保持されるようにするには、(少なくともSQL Server 2005では)信頼できる方法はありません。詳細情報については、here

0

あなたはこのように、SQL Server 2005で "テーブル変数" を宣言することができ、ハッシュ/シャープ記号の接頭辞

3

を使用して表#tmptablename

をCREATE:

declare @foo table (
    Id int, 
    Name varchar(100) 
); 

あなたが、その後を参照してください。それは変数のようです:

select * from @foo f 
    join bar b on b.Id = f.Id 

それをドロップする必要はありません変数が範囲外になります。

0

したい構文は次のとおりです。

テーブル#tablename

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

1

blog post here良いが、##と#およびグローバルな一時と基本的に接頭辞ローカル一時テーブル - 例えば

CREATE TABLE #localtemp 
17

あなたは(メモリ内の)テーブル変数を作成することができますし、一時テーブルの二つの異なるタイプ:

--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を使用します。

1

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

SQL Server 2000は、グローバルにアクセス可能な一時テーブル(例:#MyLocalTable)に対して、テーブル名に#を接頭辞として付け、セッションにローカルでアクセス可能なテンポラリテーブル(##)それぞれ## MyGlobalTableです。

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

それは、テーブル変数は常に存在すると考えるのが一般的です:-)とにかくどこから来たのか

私は、私は彼らと一緒に働いてきたものの、7、6のようなSQL Serverの旧バージョンについて話をしたくないだろうし、それはですこれは間違っています。メモリ使用量とトランザクションのデータベースサーバーボリュームに応じて、テーブル変数のページはメモリからエクスポートされ、tempdbに書き込まれ、残りの処理はtempdb内で行われます。

tempdbは、本質的に永続オブジェクトを持たないインスタンス上のデータベースですが、ソートなどのサイドトランザクションやその他の一時的な処理作業を伴う作業負荷を処理する責任があります。一方、テーブル変数(通常はデータがより小さい)はメモリに保存されているため、アクセス時間が短縮され、一時的なテーブルと比較して小さなテーブル・変数を使用する場合にtempdbドライブを使用する点でディスクIOは少なくなりますtempdbにログインします。

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

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

最後に、テンポラリテーブルはメモリストレスレベルに応じてテーブル変数が増加しない間は常にtempdbを使用するため、常にディスクIOを増加させます。

tempdbを調整して100%を上回るパフォーマンスを得るためのヒントが必要な場合はお知らせください。

+0

Chris、SOアカウントを設定してみませんか? –

+0

@Chris - あなたの記事の終わりから宗教的なタグ行を残してください。また、自己宣伝のものはあなたのプロフィールのものであり、あなたの投稿の終わりのものではありません。 – slugster

2

それはMS SQL Serverと2014

参照可能である:ここではhttp://msdn.microsoft.com/en-us/library/dn133079.aspx

は(MSDNから)SQL生成コードの例です:

-- create a database with a memory-optimized filegroup and a container. 
CREATE DATABASE imoltp 
GO 

ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod 
ALTER DATABASE imoltp SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON 
GO 

USE imoltp 
GO 


-- create a durable (data will be persisted) memory-optimized table 
-- two of the columns are indexed 
CREATE TABLE dbo.ShoppingCart ( 
    ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED, 
    UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
    CreatedDate DATETIME2 NOT NULL, 
    TotalPrice MONEY 
) WITH (MEMORY_OPTIMIZED=ON) 
GO 

-- create a non-durable table. Data will not be persisted, data loss if the server turns off unexpectedly 
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 NONCLUSTERED HASH (UserId) WITH (BUCKET_COUNT=400000) 
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO 
関連する問題