ANSI SQL standartlaştırılmış SQL:1999 sözdizimi ile birlikte WITH RECURSIVE kullanarak özyinelemeli CTE (Ortak Tablo İfadeleri) sağlar. Hiyerarşik geçişler sırasında sonsuz döngüleri önlemek için standart, ziyaret edilen düğümleri otomatik olarak izleyen ve bir düğüm tekrar ziyaret edildiğinde belirli dalları sonlandıran CYCLE tespit kısımlarını tanımlar. Bu mekanizma, dairesel referanslar içeren grafik yapılarını işleyerek duraksama veya sonsuz kaynak tüketimi olmaksızın sorguların çalışmasına olanak tanır.
Veritabanı sistemleri yerel CYCLE kuralı desteğinden yoksun olduğunda, özyinelemeli üyede manuel yol izleme uygulamanız gerekir. Ziyaret edilen tanımlayıcıları biriktiren bir yol sütunu oluşturmak için dize birleştirme veya dizi toplama kullanarak, mevcut düğümün inşa edilen yolda zaten mevcut olduğu satırları hariç tutacak şekilde özyinelemeli birleştirmeyi filtrelersiniz. Bu yaklaşım, geçiş sonlandırma koşulları üzerinde açık kontrol sağlarken ANSI SQL uyumunu korur.
Bir üretim firması, bileşenlerin alt bileşenler içerdiği elektronik montajları temsil eden bir BOM veritabanı tutmaktadır ve veri girişi hataları zaman zaman dairesel bağımlılıklar yaratmaktadır. Mühendislik ekibi, mevcut prosedürel betiklerin bu döngülerle karşılaştığında sonsuz döngülerle başarısız olduğu bir bileşen patlama raporu gerektirmektedir. Veritabanı motorunun içinde tamamen çalışan bir çözüm gerekmektedir, böylece mevcut indeksleri kullanabilir ve veri aktarımını en aza indirebilirler.
Ekip başlangıçta tüm ilişkileri alıp uygulama belleğinde grafik geçişi yapan bir istemci tarafı Python çözümünü değerlendirmiştir. Bu yaklaşım, kümeler kullanarak basit döngü tespiti sağlasa da, milyonlarca bileşen kaydı işlerken ağ üzerindeki önemli yük ve bellek baskısı yaratmaktadır. Ayrıca, mantığı veritabanı katmanında tutma gereksinimini ihlal etmektedir; burada işlemsel tutarlılık garantileri geçerlidir.
İkinci bir seçenek olarak, açık yığın yönetimi ve yineleme ile birlikte saklanan yordamlar kullanmayı değerlendirdiler. Bu yöntem, geçiş derinliği üzerinde ince ayar kontrol sağlar ancak SQL motorunun küme temelli optimizasyon yeteneklerinden feragat eder. Satır satır işleme, özellikle her seviye için birçok dalı olan geniş hiyerarşilerde, küme odaklı alternatiflerden önemli ölçüde daha yavaş olduğu kanıtlanmıştır.
Seçilen çözüm, PostgreSQL ve Oracle standartları ile uyumlu olan bir özyinelemeli CTE kullanarak, bir dizi yol sütunu aracılığıyla manuel döngü tespitiyle gerçekleştirilmiştir. Temel üye, kök bileşenleri seçerken, özyinelemeli üye yalnızca çocuk tanımlayıcısının birikmekte olan yol dizisinde yer almadığı durumlarda çocuklara katılır; NOT (child_id = ANY(path_array)) kullanarak. Bu uygulama, yalnızca 400 milisaniye içinde üretim verilerindeki yedi dairesel referans zincirini başarıyla belirledi ve tamamen açıklayıcı ANSI SQL sözdizimini korudu.
Bir özyinelemeli CTE’de UNION ve UNION ALL arasındaki seçim, döngü tespiti doğruluğunu nasıl etkiler?
Özyinelemeli üye, sıfır satır döndürene kadar önceki yinelemenin sonuç kümesine karşı yinelemeli olarak çalışır. UNION, farklı yolların aynı düğüme ulaşması durumunda döngü tespit mekanizmasının kaybına neden olabilecek bir örneği deduplikasyona tabi tutan DISTINCT anlamına gelir; bu da aynı yolu paylaşan iki farklı geçiş yolu olduğunda, bir örneği silerek diğer alternatif yolu gözden kaçırabilir.
Manuel yol izleme kullanılırken meşru bir derin hiyerarşi ile döngü arasında nasıl ayrım yaparsınız?
Adaylar sıklıkla döngü tespitini yalnızca hemen üstteki ebeveyn tanımlayıcısına karşı karşılaştırarak uygularlar; bu kusurlu yaklaşım, daha yüksek hiyerarşi noktalarında, büyükbaba- torun döngüleri gibi döngüleri tespit etme yeteneğini kaybeder; çünkü hemen üst ebeveyn mevcut düğümden farklıdır. Sağlam bir çözüm, mevcut düğümü yol sütunundaki tüm birikmiş atalar tanımlayıcıları ile kontrol ederek, geçiş tarihi içinde herhangi bir derinlikte döngüleri tespit etmeyi garanti eder.
Özyinelemeli geçişlerde SEARCH DEPTH FIRST ile SEARCH BREADTH FIRST'ı ayıran pratik bellek dikkate alımları nelerdir?
SEARCH DEPTH FIRST, bellek açısından verimli olan derin, dar hiyerarşiler için yalnızca kökten yaprağa giden mevcut yolu bellekte tutan yığın temelli bir yaklaşım kullanır. SEARCH BREADTH FIRST, mevcut derinlik seviyesindeki düğümlerin tamamını korur; bu, binlerce kardeşi olan geniş grafiklerde önemli bellek tüketimine neden olabilir. Standart ANSI SQL, her iki arama stratejisini de desteklese de, verilerin topolojisi için yanlış olanı seçmek bellek tükenmesine veya performansı önemli ölçüde düşüren geçici disk üzerindeki taşmalara neden olabilir.