ProgramlamaBackend geliştirici

WITH (Common Table Expressions, CTE) talimatı ne yapar? CTE'lerin alt sorgulara göre avantajları nelerdir? Bir örnek verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

WITH talimatı (veya CTE — Common Table Expression) geçici bir veri kümesi oluşturur, bu veri kümesi ana SELECT'te veya hatta özyinelemeli olarak kullanılabilir. CTE'ler sorguları anlamayı kolaylaştırır, okunabilirliği artırır ve ara sonuçları yeniden kullanmayı sağlar.

Normal alt sorgulara karşı avantajlar:

  • Karmaşık sorguların okunabilirliğini artırır (hata ayıklamak ve sürdürmek daha kolaydır).
  • Özyinelemeli sorgular kullanılabilir.
  • Aynı alt sorguyu kopyalamak yerine CTE'ye ismiyle birden fazla kez referans verilebilir.

Örnek:

WITH high_salary AS ( SELECT id, name FROM employees WHERE salary > 100000 ) SELECT * FROM high_salary WHERE name LIKE 'A%';

Zor Bir Soru

“CTE deklarasyonunda MATERIALIZED/NOT MATERIALIZED belirtmek önemli mi? Bu performansı nasıl etkileyebilir?”

Cevap: PostgreSQL'de MATERIALIZED (CTE'nin her zaman bir kez hesaplanmasını ve saklanmasını sağlamak) veya NOT MATERIALIZED (CTE, ana sorguya inlinelenecek) açıkça belirtilebilir. Genellikle optimizasyon aracı CTE'yi materyalize etmenin gerekip gerekmediğine karar verir, ancak zorunlu belirtim bazen hız üzerinde önemli bir etki yapabilir.

Örnek:

WITH high_salary AS MATERIALIZED ( SELECT id, name FROM employees WHERE salary > 100000 ) SELECT * FROM high_salary WHERE name LIKE 'A%';

Tarih

Büyük bir projede bir analist tüm alt sorguları CTE ile değiştirdi, PostgreSQL'in 12. sürümünden önce CTE'lerin her zaman materyalize edildiğini bilmeden. Sonuç — sorgular 2-3 kat yavaşladı. Alt sorgulara geri dönmek veya yeni sürümlere geçmek sorunu çözdü.


Tarih

Birden fazla katmanda iç içe geçmiş alt sorgulardan oluşan bir rapor, bir meslektaşım için okunamaz hale geldi. Anlamlı isimler ile CTE'ye yeniden yazdık — sorguların tartışılması ve bakımının yapılması önemli ölçüde kolaylaştı.


Tarih

Aynı isimlere sahip iki CTE büyük bir skripte karışıklık yarattı: CTE, ilan edilmeden önce kullanıldı. Sonuç — derleme hatası ve nedeni bulmak için büyük zaman kaybı.