使用SELECT INTO创建临时表时,是否可以在临时表上创建索引?

27

我正在将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)

在此输入图片描述


@HamletHakobyan,你无法创建一个表并使用select into将数据插入它。 - HLGEM
@HamletHakobyan 这是一个堆表 - 所以我需要添加一个主键列吗? - Ian R. O'Brien
2
你尝试过在批处理中的下一条语句运行 CREATE INDEX 语句吗? - HLGEM
1
@HLGEM 看起来我解决这个问题的方式是:1)使用CREATE TABLE创建临时表,并添加主键/自增列,然后2)对所有数据执行INSERT操作。我可以在1)和2)之间添加索引。 - Ian R. O'Brien
是的,INSERT 用于已存在的表格(永久性或临时性),因此您可以创建索引。SELECT INTO 则是创建没有索引的表格。 - paparazzo
我知道这并没有被明确指定,但如果你正在创建一个聚集索引,最好的方法是使用CREATE TABLE #t(即使需要重复自己),因为INSERT INTO #t SELECT将以最有效的方式按正确的顺序插入数据。事后创建索引会导致更多的工作。 - binki
1个回答

31

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接