¿El comportamiento de valla de optimización de un CTE (CON consulta) se especifica en el estándar SQL: 2008? ¿Si es así, donde?

23

Veo referencias frecuentes a WITHconsultas (expresiones de tabla comunes o CTE) que actúan como una valla de optimización, donde el servidor no puede insertar filtros en las consultas de CTE, extraer expresiones comunes del CTE, etc. A menudo se afirma ser un comportamiento requerido por los estándares SQL.

Los CTE son definitivamente una valla de optimización en PostgreSQL ... ¿pero esto es requerido por el estándar, o en realidad solo por detalles de implementación?

Por ejemplo, estas publicaciones en la lista de correo afirman o sugieren que es estándar:

Después de mencionarlo en un comentario, me preguntaron dónde está especificado, y después de echar un vistazo al único borrador de SQL: 2008 al que tengo acceso, no tengo mucha suerte para encontrarlo.

Todavía no he estudiado el estándar de manera intensiva, por lo que espero una sugerencia de alguien que lo haya hecho: ¿El estándar requiere realmente el cerco de optimización de CTE en PostgreSQL? Y si es así, ¿dónde se especifica? ¿O las declaraciones en la lista de correo Pg son erróneas?

¿Ver también la cerca de optimización CTE de hilo en la lista de tareas pendientes? .

Craig Ringer
fuente

Respuestas:

10

Creo que es un detalle de implementación.

No se requiere una implementación conforme para realizar la secuencia exacta de acciones definidas en las Reglas Generales, siempre que su efecto en los datos y esquemas SQL, en los parámetros del host y la variable del host, y en los parámetros SQL y las variables SQL sea idéntico al efecto de ese secuencia. El término se usa efectivamente para enfatizar acciones cuyo efecto podría lograrse de otra manera mediante una implementación. 1

Creo que un implementador podría evaluar una expresión de tabla común 20 veces, incluso de 20 maneras diferentes, y aún así tener una implementación conforme. La única cuestión relevante es si "su efecto ... es idéntico al efecto" de la secuencia de acciones definidas en las Reglas generales.

[1] Sección 6.3.3.3, "Orden de evaluación de reglas", en un borrador del estándar SQL 2008, con el nombre de archivo local 5CD2-01-Framework-2006-01.pdf, p. 41 Me tienen ninguna idea de dónde lo tengo. Google podría saberlo.

Mike Sherrill 'Retiro del gato'
fuente
2
Eso tiene sentido, y dado que PostgreSQL permitirá el uso de funciones con efectos secundarios o declaraciones de modificación de datos en CTE, debe cercar dichos CTE. Supongo que eso significa que sería libre de CTE en línea que solo llama STABLEo IMMUTABLEfunciona.
Craig Ringer el
Creo que los CTE de escritura aún no están en ningún estándar de SQL, pero no soy positivo.
Mike Sherrill 'Cat Recall'
Los wCTE son sin duda una extensión de PostgreSQL. Está menos claro si las funciones que ejecutan DML son, ya que las funciones definidas por el usuario en SQL son las SQL/PSMque Pg no admite en absoluto ...
Craig Ringer