2012-07-25 14 views
5

Generating Random Data Via SQL diye 5 rastgele dizeleri oluşturmak için aşağıdaki kodu kullanılır. Bunu kaldırdığımda, sonuç 5 benzer dizgiye dönüştü, bu da Postgres'in dış seçim ifadesini (sonuç) önbelleğe aldığını gösterir!PostgreSQL uçucu ifadeler ve alt sorgular Bruce Momjian blog yayınında

İfade önbelleğinin Postgres'te nasıl çalıştığını bulamadım. the documentation'a göre rastgele() işlevi VOLATILE olarak işaretlenir, bu nedenle, herhangi bir ifadenin de uçuculuğa bağlı olmasını beklerdim.

İfade önbelleği Postgres'te nasıl çalışır? Herhangi bir yerde belgelenmiş mi? Neden 'b * 0' önbelleği rasgele() kullanmadı?

Güncelleme:

... 
       SELECT chr(ascii('a') + floor(random() * 26 + b * 0)::integer) 
       FROM generate_series(1, 40) as s(f) 
... 

sonucu:

sorunu incelemek için, ben() (aynı pozisyon/seviyede rasgele olmak çağrı) zemine içeriye 'b * 0' taşındı hala önbelleğe alınmamış; farklı dizeler.

Güncelleme: Başka bir örnek dolayısıyla Sonuna tekrarlanan aynı karakterle dizeleri alamadım, kendisi uçucu olan problemi

create sequence seq_test; 

SELECT (SELECT nextval('seq_test')) FROM generate_series(1,5); 

?column? 
---------- 
     1 
     1 
     1 
     1 
     1 
(5 rows) 

cevap

4

Peki, random() göstermek için. Birlikte ve b*0 olmadan sorguları için planlar bakarsak

göreceksiniz:

b*0 olarak:

Function Scan on generate_series a (cost=0.00..37530.00 rows=1000 width=4) 
    SubPlan 1 
    -> Aggregate (cost=37.51..37.52 rows=1 width=32) 
      -> Function Scan on generate_series (cost=0.01..25.01 rows=1000 width=0) 

b*0 olmadan:

Function Scan on generate_series a (cost=37.52..47.52 rows=1000 width=0) 
    InitPlan 1 (returns $0) 
    -> Aggregate (cost=37.50..37.51 rows=1 width=32) 
      -> Function Scan on generate_series (cost=0.00..25.00 rows=1000 width=0) 

PostgreSQL belirlerse iç agregasyon a bağımlı değildir, o zaman bir kezolarak değerlendirilirve içerideki ifadelerin uçuculuğu ya da yokluğu ilgisizdir. Alt sorgunun bağımlılığını a'da sunarak, yani, onu bir ilişkili alt-sorgu haline getirerek, değerlendirme her bir a sırası için yeniden yapılmalıdır.

+0

Bu yüzden planlayıcı, her bir satırın iç ifadesini, bağımlı olmadığı halde (uçucu olduğu için doğru olmasına rağmen) değerlendirdi, ancak dış ifade, satırda bağımlı olmadıkça bir kez değerlendiriliyor! Uçucu değerler, herhangi bir sonucu temel almaz mı? tıpkı sıra bağımlılığı gibi. –

+0

ifadesinin volatilitesi satır içi olarak durdurulacak, ancak planlayıcının sorgu planını nasıl düzenlediğini etkilemez; bu, alt seçimin ilişkilendirilip ilişkilendirilmediğine bağlıdır. – araqnid

+0

Dış sorgunun satır değişkenine bağımlı olmadığı sürece, herhangi bir alt sorgunun STABLE olarak kabul edildiğini söylüyorsunuz! Bana bir böcek gibi görünüyor. Uçucu ifadelerin herhangi bir ifade veya alt sorguda volatilite etkisi olmasını beklerdim. InitPlan bir optimizasyon, sonucu değiştirmemelidir. –