Редагувати:
Будь ласка, дивіться коментарі Мартіна нижче:
CTE не матеріалізується як таблиця в пам'яті. Це лише спосіб інкапсуляції визначення запиту. У випадку з ОП це буде накреслено і те саме, що робиться SELECT Column1, Column2, Column3 FROM SomeTable
. Більшу частину часу вони не матеріалізуються вперед, тому це не повертає рядків WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
, а також перевіряйте плани виконання. Хоча іноді вдається зламати план отримання котушки. Є елемент підключення, який вимагає підказки для цього. - Мартін Сміт 15 лютого 1212 о 17:08
Оригінальна відповідь
CTE
Детальніше читайте на MSDN
CTE створює таблицю, яка використовується в пам'яті, але справедлива лише для конкретного запиту, що слідує за нею. При використанні рекурсії це може бути ефективною структурою.
Ви також можете розглянути можливість використання змінної таблиці. Це використовується, оскільки використовується таблиця темпів і може використовуватися кілька разів, не потребуючи повторної матеріалізації для кожного з'єднання. Крім того, якщо вам потрібно зберегти кілька записів зараз, додайте ще кілька записів після наступного вибору, додайте ще кілька записів після іншого оп, а потім поверніть лише ті жменю записів, то це може бути зручною структурою, як це робить Не потрібно скидати їх після виконання. Переважно просто синтаксичний цукор. Однак, якщо тримати кількість рядків низькою, вона ніколи не матеріалізується на диску. Див. У чому різниця між тимчасовою таблицею та змінною таблиці в SQL Server? для отримання детальної інформації.
Темп. Таблиця
Детальніше про MSDN - прокрутіть приблизно 40% шляху
Темп-таблиця - це буквально таблиця, створена на диску, просто в певній базі даних, яку всі знають, може бути видалена. Відповідальність доброго розробника знищує ці таблиці, коли вони більше не потрібні, але DBA також може їх витерти.
Тимчасові столи бувають двох різновидів: локальні та глобальні. З точки зору MS Sql Server, ви використовуєте #tableName
позначення для локального та ##tableName
позначення для глобального (зверніть увагу на використання одиничного або подвійного # як ідентифікаційної характеристики).
Зауважте, що для темп-таблиць, на відміну від змінних таблиць або CTE, ви можете застосовувати індекси та подібне, оскільки це законні таблиці в нормальному розумінні цього слова.
Як правило, я використовував би темп-таблиці для більш довгих або великих запитів, а також CTE або змінних таблиць, якщо б у мене вже був невеликий набір даних і я хотів би швидко скриптувати трохи коду для чогось невеликого. Досвід та поради інших людей свідчать про те, що ви повинні використовувати CTE, де ви повертаєте з нього невелику кількість рядків. Якщо у вас є велика кількість, ви, ймовірно, отримаєте користь від можливості індексувати на темп-таблиці.