SQL: 2008 standardında belirtilen bir CTE'nin (WITH sorgusu) optimizasyon çit davranışı var mı? Eğer öyleyse, nerede?


23

WITHSunucunun filtreleri CTE sorgularına itmesine, CTE'nin dışına ortak ifadeleri çekmesine izin verilmeyen bir optimizasyon perdesi gibi davranan sorgulara (ortak tablo ifadeleri veya CTE'ler) sık sık atıfta bulunuyorum. SQL standartlarının gerektirdiği bir davranış olması.

CTE'ler kesinlikle PostgreSQL'de bir optimizasyon perdesidir ... ama bu standart mı, yoksa sadece uygulama detayı mı gerekli?

Örneğin, bu posta listesi gönderileri standart olduğunu iddia eder veya önerir:

Bir yorumda bahsettikten sonra bana nerede belirtildiği soruldu - ve sadece SQL taslak taslaklarına baktıktan sonra : 2008'de erişim hakkım var.

Standardı henüz yoğun bir şekilde incelemedim, bu yüzden aşağıdakilerden birinin önerisini umuyorum: PostgreSQL'deki CTE'lerin optimizasyon esası standart tarafından gerekli midir? Ve eğer öyleyse, nerede belirtildi? Yoksa Pg posta listesindeki ifadeler hatalı mı?

Ayrıca yapılacaklar listesindeki iş parçacığı CTE optimizasyon çit bakın ? .

Yanıtlar:


10

Bence bu bir uygulama detayı.

SQL-data ve şemaları, host parametreleri ve host değişkeni üzerindeki etkisi ve SQL parametreleri ve SQL değişkenleri üzerindeki etkisinin aynısı olması koşuluyla, Genel Kurallarda tanımlanan eylemlerin tam sırasını gerçekleştirmek için uygun bir uygulama gerekmez. sıra. Etkili bir terim , bir uygulamanın etkisine başka yollarla ulaşılabilecek eylemleri vurgulamak için kullanılır. 1

Bir uygulayıcı bile 20 farklı şekillerde, ortak bir tablo ifadeyi 20 kez değerlendirmek ve düşünüyorum hala bir uyum uygulaması var. Tek ilgili sorun, "etkisinin ... Genel kurallarda tanımlanan eylemler dizisinin etkisiyle aynı olup olmadığı" dır.

[1]. Bölüm 6.3.3.3, "Kural değerlendirme emri", SQL 2008 standardı taslağında, yerel dosya adı 5CD2-01-Framework-2006-01.pdf, s. 41 Nereden bulduğum hakkında hiçbir fikrim yok . Google biliyor olabilir.


2
Bu mantıklı olan - ve PostgreSQL, CTE'lerde yan etkilere veya veri değiştirme ifadelerine sahip işlevlerin kullanımına izin vereceğinden, bu tür CTE'lere yönelmelidir. Sanırım bu, sadece çağıran STABLEya da IMMUTABLEişlev gören satır içi CTE'lerin ücretsiz olacağı anlamına geliyor .
Craig Ringer

Yazılabilir CTE'lerin henüz herhangi bir SQL standardında olmadığını düşünüyorum , ancak olumlu değilim.
Mike Sherrill 'Cat Recall'

wCTE'ler kesinlikle bir PostgreSQL uzantısıdır. SQL'de kullanıcı tanımlı fonksiyonlar SQL/PSMPg'nin hiç desteklemediğidir , çünkü DML'yi çalıştıran fonksiyonlar daha az açıktır ...
Craig Ringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.