5

SQL Server 2008 R2 の使用

次のような宣言されたテーブル変数を検討してください。

DECLARE @t TABLE (PK int IDENTITY(1,1) PRIMARY KEY CLUSTERED, Col1 int, Col2 int)

を含むCREATE NONCLUSTERED INDEX任意の名前の方法ON @t(Con1 ASC, Col2 ASC)

インデックスは一意の値に限定されるべきではありません。

どういうわけか、私はこれを理解することができません...

4

4 に答える 4

7

非クラスター化インデックスは次のように作成できます。

DECLARE @t TABLE (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT,
  UNIQUE (Col1, Col2, PK)) 

それ自体が一意であることが意図されている場合は、列リストからCol1, Col2削除します。PK

一見すると ( ) 内に列が追加されたように見えますが、インデックスの構造は、テーブルPKだけに非一意のインデックスを作成するのと同じになります。Col1, Col2#temp

CREATE TABLE #T  (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT) 

/*PK added in to end of key anyway*/  
CREATE NONCLUSTERED INDEX ix ON #T(Col1, Col2)

一意ではない非クラスター化インデックスの場合、SQL Server は常に CI キーを暗黙的に NCI キーに追加します。これはそれを明示的に示しているだけです。

非クラスター化インデックス キーの詳細については、Kalen Delaney を参照してください。

于 2012-07-05T06:44:54.840 に答える
5

それはいけません。declare( <table_type_definition>):

テーブルのデータ型を定義します。テーブル宣言には、列の定義、名前、データ型、および制約が含まれます。許可される制約タイプは、PRIMARY KEY、UNIQUE、NULL、および CHECK のみです。

インデックスについては言及されていないことに注意してください。

インデックスが必要な場合は、一時テーブルを作成します ( CREATE TABLE #t (...)。

于 2012-07-05T06:45:14.933 に答える
2

テーブル変数にインデックスを付けることはできません。

インデックスが必要な場合 - 一時テーブルを使用 (CREATE TABLE #TまたはCREATE TABLE ##T)

これは、テーブル変数の主な欠点の 1 つです。他に 2 つの欠点があります。

  • テーブル変数はトランザクションに参加しません。これは、状況に応じて良いことも悪いこともあります

  • テーブル変数は常に、クエリ オプティマイザーによって正確に 1 つの行が含まれていると見なされます。これは、一握りの行がある限り問題ありませんが、インデックスの必要性を感じるほど多くの行がある場合は、おそらくこの点です。クエリの最適化の問題にもなります

于 2012-07-05T06:44:39.260 に答える
1

テーブル変数に非クラスター化、非一意のインデックスを作成することはできません。一意のインデックスのみをサポートします。ここを参照してください。

代わりに、ローカルの一時テーブルを調べる必要があります。とにかく大規模なデータセットのパフォーマンスが向上します。

于 2012-07-05T06:43:18.923 に答える