Мне нужно сделать очень сложный запрос. В какой-то момент этот запрос должен иметь соединение с представлением, которое, к сожалению, не может быть проиндексировано. Это представление также представляет собой сложный вид, соединяющий большие таблицы.
Просмотр вывода можно упростить следующим образом:
PID (int), Kind (int), Date (date), D1,D2..DN
где поля PID и Date и Kind не уникальны (может быть более одной строки с одинаковой комбинацией pid, kind, date), но это те, которые будут использоваться в объединении, как это
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)
То, что я сделал, - declare @temptable, и вставить в @temptable select * из ComplexView, где Date... - одно время для каждого запроса. Я выбираю только строки, которые я собираюсь использовать из своего ComplexView, а затем я присоединяюсь к этому @temptable.
Это значительно сократило время выполнения.
Тем не менее, я заметил, что если я создам таблицу в своей базе данных и добавлю кластерный индекс в PID, Kind, Date (non-unique clustered) и возьму данные из этой таблицы, а затем сделаю delete * из этой таблицы и вставка в эту таблицу из сложного вида занимает несколько секунд (3 или 4), а затем, используя эту таблицу в моем запросе (левое присоединение к ней три раза), сократите время запроса до половины, от 1 минуты до 30 секунд!
Итак, мой вопрос, в первую очередь, - возможно ли создать индексы для объявленных @temptables. И затем - я видел, как люди говорили о синтаксисе "create #temptable". Может, это то, что мне нужно? Где я могу прочитать о том, какая разница между declare @temptable и create #temptable? Что я должен использовать для запроса, такого как мой? (этот запрос относится к отчету служб MS Reporting Services, если это имеет значение).