Можно ли добавить индекс в временную таблицу? И в чем разница между create #t и declare @t

мне нужно сделать очень сложный запрос. В какой-то момент этот запрос должен иметь соединение с представлением, которое, к сожалению, не может быть индексировано. Этот вид тоже сложный вид работы больших таблиц.

вывод представления можно упростить следующим образом:

PID (int), Kind (int), Date (date), D1,D2..DN

где поля PID и Date и Kind не уникальны (может быть несколько строк с одинаковой комбинацией pid,kind,date), но это те, которые будут использоваться в join, как это

left join ComplexView mkcs on mkcs.PID=q4.PersonID and mkcs.Date=q4.date and mkcs.Kind=1
left join ComplexView mkcl on mkcl.PID=q4.PersonID and mkcl.Date=q4.date and mkcl.Kind=2
left join ComplexView mkco on mkco.PID=q4.PersonID and mkco.Date=q4.date and mkco.Kind=3

теперь, если я просто делаю это, как это, выполнение запроса занимает значительное время, потому что сложное представление выполняется три раза, я предполагаю, и из его огромного количества строк на самом деле используются только некоторые (например, из 40000 используются только 2000)

то, что я сделал, это объявить @temptable и вставить в @temptable select * из ComplexView, где дата... - один раз на запрос я выбираю только строки, которые я собираюсь использовать из моего ComplexView, а затем я присоединяюсь к этому @temptable.

это сокращенное исполнение время существенно.

однако, я заметил, что если я сделаю таблицу в моей базе данных, и добавить кластеризованный индекс по пид,Вид,время (неуникальный кластеризованный) и брать данные из этой таблицы, затем делаем удалить * из этой таблицы и вставить в эту таблицу из комплекса вид занимает несколько секунд (3 или 4), а затем с помощью этой таблицы в запрос (левое соединение его три раза) взять вниз время запроса на половину, от 1 минуты до 30 секунд!

Итак, мой вопрос, прежде всего - возможно ли это создание индексов на объявленных @temptables. И потом-я видел, как люди говорили о синтаксисе "create #temptable". Может, это то, что мне нужно? Где я могу прочитать о том, в чем разница между declare @temptable и create #temptable? Что я должен использовать для запроса, подобного моему? (этот запрос предназначен для отчета MS Reporting Services, если это имеет значение).

3 ответов


Это не полный ответ, но #table создаст временную таблицу, которую вам нужно удалить, или она сохранится в вашей базе данных. @table-это переменная таблицы, которая не будет сохраняться дольше, чем ваш скрипт.

кроме того, я думаю, что этот пост ответит на другие части вашего вопроса.

создание индекса для табличной переменной


#tablename - физическая таблица, хранящаяся в tempdb что сервер автоматически упадет, когда соединение, которое его создало, будет закрыто,@tablename - Это таблица, хранящаяся в памяти и жизни в течение всего срока службы пакета / процедуры, которая его создала, так же, как локальная переменная.

вы можете добавить индекс (не PK) только в #temp таблица.

create table #blah (fld int)
create nonclustered index idx on #blah (fld)

Да, вы можете создавать индексы на временные таблицы или табличные переменные. http://sqlserverplanet.com/sql/create-index-on-table-variable/