Определяется ли поведение ограничения оптимизации для запроса CTE (WITH) в стандарте SQL: 2008? Если да, то где?

23

Я вижу частые ссылки на WITHзапросы (обычные табличные выражения или CTE), выступающие в качестве ограждения оптимизации, когда серверу не разрешается вставлять фильтры в запросы CTE, извлекать общие выражения из CTE и т. Д. Часто утверждается поведение, требуемое стандартами SQL.

CTE, безусловно, являются забором оптимизации в PostgreSQL ... но требуется ли это стандартом или на самом деле просто деталями реализации?

Например, эти сообщения списка рассылки утверждают или предполагают, что это стандарт:

После упоминания об этом в комментарии меня спросили, где он указан, и после просмотра единственного черновика SQL: 2008 у меня есть доступ, и мне не повезло найти его.

Я еще не интенсивно изучал стандарт, поэтому надеюсь на предложение от кого-то, кто имеет: Требует ли стандарт ограждения CTE в PostgreSQL на самом деле? И если да, то где это указано? Или утверждения в списке рассылки Pg по ошибке?

См. Также тему оптимизации CTE в списке задач? ,

Крейг Рингер
источник

Ответы:

10

Я думаю, что это деталь реализации.

Соответствующая реализация не требуется для выполнения точной последовательности действий, определенных в Общих правилах, при условии, что ее влияние на данные и схемы SQL, параметры хоста и переменную хоста, а также параметры SQL и переменные SQL идентично эффекту этого последовательность. Термин « эффективно» используется для обозначения действий, эффект которых может быть достигнут другими способами путем реализации. 1

Я думаю, что разработчик мог бы оценить общее табличное выражение 20 раз, даже 20 различными способами, и при этом иметь соответствующую реализацию. Единственная актуальная проблема заключается в том, является ли «его эффект ... идентичным эффекту» последовательности действий, определенных в общих правилах.

[+1]. Раздел 6.3.3.3, «Порядок оценки правил», в проекте стандарта SQL 2008 с локальным именем файла 5CD2-01-Framework-2006-01.pdf, с. 41 Понятия не имею, откуда я это взял. Google может знать.

Майк Шеррилл 'Cat Recall'
источник
2
Это имеет смысл - и поскольку PostgreSQL позволит использовать функции с побочными эффектами или операторы, изменяющие данные в CTE, он должен ограничивать такие CTE. Я предполагаю, что это означает, что было бы свободно встроить CTE, которые вызывают только функции STABLEили IMMUTABLE.
Крейг Рингер
Я думаю, что доступные для записи CTE еще не включены ни в какие стандарты SQL, но я не уверен.
Майк Шеррилл 'Cat Recall'
wCTE, безусловно, являются расширением PostgreSQL. Менее понятно, являются ли функции, выполняющие DML, поскольку пользовательские функции в SQL - это те, SQL/PSMкоторые Pg вообще не поддерживает ...
Крейг Рингер,