Можно ли создавать индексы во временной таблице при использовании 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)

введите описание изображения здесь


person Ian R. O'Brien    schedule 21.12.2012    source источник
comment
@HamletHakobyan, вы не можете создать таблицу и использовать select для вставки в нее.   -  person HLGEM    schedule 22.12.2012
comment
@HamletHakobyan Это таблица в виде кучи - значит, тогда мне нужно было бы добавить столбец для ПК?   -  person Ian R. O'Brien    schedule 22.12.2012
comment
Вы пробовали запустить оператор создания индекса в качестве следующего оператора в пакете?   -  person HLGEM    schedule 22.12.2012
comment
@HLGEM Похоже, я решу эту проблему следующим образом: 1) Создайте временную таблицу с CREATE TABLE и столбцом PK / Identity, а затем 2) выполните INSERT для всех данных. Я могу добавить индексы между 1) и 2).   -  person Ian R. O'Brien    schedule 22.12.2012
comment
Да, вставка предназначена для существующей таблицы (постоянной или временной), поэтому вы можете создать индекс. Выбор в - создает таблицу без индексов.   -  person paparazzo    schedule 22.12.2012
comment
Я знаю, что это не было указано, но если вы создаете кластерный индекс, лучший способ - использовать CREATE TABLE #t (даже если это требует повторения самого себя), потому что INSERT INTO #t SELECT будет вставляйте данные в правильном порядке наиболее эффективным способом. Создание индекса постфактум потребует больше работы.   -  person binki    schedule 11.01.2018


Ответы (1)


Таблица, созданная 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
person Martin Smith    schedule 21.12.2012