Можно ли добавить индекс в временную таблицу? И в чем разница между 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/