【问题标题】:Is it possible to create indexes on a temp table when using SELECT INTO?使用 SELECT INTO 时是否可以在临时表上创建索引?
【发布时间】:2012-12-09 10:10:02
【问题描述】:

我正在将 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 插入其中。
  • @HamletHakobyan 这是一个堆表 - 所以我需要为 PK 添加一列?
  • 您是否尝试过运行创建索引语句作为批处理中的下一条语句?
  • @HLGEM 看起来我将解决这个问题的方法是 1)使用 CREATE TABLE 和 PK/Identity 列创建临时表,然后 2)对所有数据执行 INSERT。我可以在 1) 和 2) 之间添加索引。
  • 是的,插入用于现有表(永久或临时),因此您可以创建索引。 Select into 是创建没有索引的表。

标签: sql tsql indexing select-into


【解决方案1】:

SELECT INTO 创建的表始终是堆。如果您想要一个 PK/Identity 列,您可以按照 cmets 中的建议进行操作

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2013-01-02
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多