PostgreSQL Ortak Tablo İfadeleri geçici bir tablo mu?


11

İLE PostgreSQL belgeleri gösterir Aşağıdaki örnek:

WITH regional_sales AS (
        SELECT region, SUM(amount) AS total_sales
        FROM orders
        GROUP BY region
     ), top_regions AS (
        SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
     )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

Ayrıca şunu da not eder:

WITH sorgularının yararlı bir özelliği, ana sorgu veya birden fazla kardeş sorgusu tarafından birden çok kez yönlendirilse bile, ana sorgunun yürütülmesi başına yalnızca bir kez değerlendirilmesidir.

Bunun WITHözyinelemeli değerlendirme gibi başka şeyler için de kullanılabileceğini görüyorum . Ancak yukarıdaki örnekte, WITHgeçici tablo kullanma ve oluşturma arasında önemli bir fark var mı?


Sorguyu kadar bina için başka bir sütun eklemek için CTE kullandığınızda SELECTiçinde WITHbunu yazarak ve rerunning edilir. Geçici tablo ile DROPve alır CREATE. Öte yandan, bir sorgu oluşturursanız ve statik verileri defalarca yeniden kullanırsanız, dizinlerle geçici tablo oluşturmak CTE'ye karşı kesinlikle faydalıdır.
Vao Tsun

@VaoTsun bir sorgu TEMPORARY TABLEile birlikte kullanıyorsanız ON COMMIT DROP, bu sadece sorguyu değiştirme ve yeniden çalıştırma meselesidir, değil mi? postgresql.org/docs/9.6/static/sql-createtable.html
Nathan Long

Yanıtlar:


16

Birkaç ince fark var, ancak sert bir şey yok:

  • Geçici tabloya dizin ekleyebilirsiniz;
  • Oturumun (veya, eğer ON COMMIT DROPişlemin) ömrü boyunca geçici tablolar vardır , wheras WITHher zaman sorguya kesinlikle dahil edilir;
  • Sorgu işlevi / prosedürü başlatır, bu geçici tabloya bakınız, ancak olabilir olmayan bir bakınız WITHtablo-ifadeleri;
  • Geçici tablo VACUUM, sistem katalogları üzerinde çalışma oluşturmaz WITH, bunu oluşturmak / doldurmak için ekstra bir yolculuğa ihtiyaç duyar ve sunucunun önbellek yönetiminde ekstra çalışma gerektirir, bu yüzden biraz daha az verimlidir.

Genel olarak, WITHbir dizin oluşturmaktan yararlanacağınızı bilmiyorsanız geçici tabloları tercih etmelisiniz .

Bununla birlikte, FROMmaddedeki bir alt sorgu olan diğer seçeneğin çok farklı avantajları vardır. Özellikle eğimli olabilir ve niteleyiciler yukarı çekilebilir / aşağı itilebilir. Bu konuyu yeni bir blog makalesinde yazdım .


Görüşler ve geçici görünümler ne olacak?
CMCDragonkai

1
Tür arasında ama geçici tabloya CTE teriminden daha yakın. Dizin yok. Oturum kapsamı belirlendi. İşlevler / prosedürler tarafından görülebilir. Katalog vakum gerektirir.
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.