web-dev-qa-db-ja.com

SELECT INTOを使用するときに、一時テーブルにインデックスを作成することはできますか?

CSVファイルから一時ステージングテーブルにデータを読み込んでいますが、この一時テーブルは頻繁にクエリされています。実行プランを調べたところ、一時テーブルのスキャンに多くの時間が費やされていることがわかりました。

SELECT INTOしたときに、このテーブルにインデックスを作成する方法はありますか?

SELECT *    
FROM TradeTable.staging.Security s
WHERE (
    s.Identifier IS NOT NULL
    OR s.ConstituentTicker IS NOT NULL
    OR s.CompositeTicker IS NOT NULL
    OR s.CUSIP IS NOT NULL
    OR s.ISIN IS NOT NULL
    OR s.SEDOL IS NOT NULL
    OR s.eSignalTicker IS NOT NULL)

enter image description here

18
Ian R. O'Brien

SELECT INTOによって作成されたテーブルは常にヒープです。 PK/Identity列が必要な場合は、コメントで提案されているように行うことができます

CREATE TABLE #T
(
Id INT IDENTITY(1,1) PRIMARY KEY,
/*Other Columns*/
)

INSERT INTO #T 
SELECT *
FROM TradeTable.staging.Security

または、明示的なCREATEを避け、すべての列をリストする必要があります。

SELECT TOP (0) IDENTITY(int,1,1) As Id, *
INTO #T
FROM TradeTable.staging.Security

ALTER TABLE #T ADD PRIMARY KEY(Id)

INSERT INTO #T 
SELECT *
FROM TradeTable.staging.Security
21
Martin Smith