Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1 Gerçek veritabanı kılıçları - küreseller - uzun zamandır biliniyor, ancak hala çok az kişi bunların nasıl etkili bir şekilde kullanılacağını biliyor veya bu süper silaha hiç sahip değil.

Gerçekten iyi oldukları sorunları çözmek için globalleri kullanırsanız olağanüstü sonuçlar elde edebilirsiniz. Ya üretkenlik açısından ya da sorunun çözümünü basitleştirmede (1, 2).

Globaller, SQL'deki tablolardan tamamen farklı olarak verileri depolamanın ve işlemenin özel bir yoludur. 1966'da dilde ortaya çıktılar KABAKULAK) (Evrimsel gelişme - Önbellek ObjectScript, bundan sonra COS olarak anılacaktır) tıbbi veritabanındadır ve hala oradadır aktif olarak kullanılanAyrıca güvenilirlik ve yüksek performansın gerekli olduğu diğer bazı alanlara da nüfuz etti: finans, ticaret vb.

Modern DBMS'lerdeki globaller işlemleri, günlüğe kaydetmeyi, çoğaltmayı ve bölümlemeyi destekler. Onlar. modern, güvenilir, dağıtılmış ve hızlı sistemler oluşturmak için kullanılabilirler.

Küreseller sizi ilişkisel modelle sınırlamaz. Size belirli görevler için optimize edilmiş veri yapıları geliştirme özgürlüğü verirler. Birçok uygulama için globallerin akıllı kullanımı gerçekten gizli bir silah olabilir ve ilişkisel uygulama geliştiricilerinin yalnızca hayal edebileceği performansı sağlar.

Veri depolamanın bir yolu olarak globaller, hem yüksek hem de düşük seviyeli birçok modern programlama dilinde kullanılabilir. Bu nedenle, bu makalede, bir zamanlar geldikleri dile değil, özellikle küresellere odaklanacağım.

2. Küreseller nasıl çalışır?

Öncelikle küresellerin nasıl çalıştığını ve güçlü yönlerinin neler olduğunu anlayalım. Küresellere farklı bakış açılarından bakılabilir. Yazının bu bölümünde onlara ağaç olarak bakacağız. Veya hiyerarşik veri ambarları gibi.

Basitçe söylemek gerekirse, global kalıcı bir dizidir. Otomatik olarak diske kaydedilen bir dizi.
Veri depolamak için daha basit bir şey hayal etmek zor. Kodda (COS/M dillerinde) normal ilişkisel diziden yalnızca sembol açısından farklılık gösterir. ^ isimden önce.

Verileri global olarak kaydetmek için SQL sorgu dilini öğrenmenize gerek yoktur; onlarla çalışmaya yönelik komutlar çok basittir. Bir saat içinde öğrenilebilirler.

En basit örnekle başlayalım. 2 dallı tek seviyeli ağaç. Örnekler COS'ta yazılmıştır.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"



Bilgileri global (Set komutu) içine eklerken, otomatik olarak 3 şey gerçekleşir:

  1. Verileri diske kaydetme.
  2. Endeksleme. Parantez içindekiler anahtardır (İngiliz edebiyatında - “alt simge”) ve eşitlerin sağında değer (“düğüm değeri”) bulunur.
  3. Sıralama. Veriler anahtara göre sıralanır. Gelecekte diziyi dolaşırken ilk öğe "Sergey Smith" ve ikinci öğe "John Sidorov" olacaktır. Globalden kullanıcı listesi alındığında veritabanı sıralama yaparak zaman kaybetmez. Ayrıca, herhangi bir anahtardan, hatta var olmayan bir anahtardan başlayarak sıralanmış bir listenin çıktısını isteyebilirsiniz (çıktı, var olmayan anahtardan sonra gelen ilk gerçek anahtardan başlayacaktır).

Tüm bu işlemler inanılmaz derecede hızlı gerçekleşir. Ev bilgisayarımda tek işlemde 750 ekleme/sn'ye varan değerler elde ediyordum. Çok çekirdekli işlemcilerde bu değerlere ulaşılabilmektedir onlarca milyon ekler/sn.

Elbette ekleme hızının kendisi pek bir şey ifade etmiyor. Örneğin, bilgileri metin dosyalarına çok hızlı bir şekilde yazabilirsiniz - bunun gibi söylenti Vize işlemleri çalışıyor. Ancak globaller söz konusu olduğunda, sonuç olarak, gelecekte kolayca ve hızlı bir şekilde üzerinde çalışılabilecek, yapılandırılmış indeksli bir depolama elde ederiz.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

  • Küresellerin en büyük gücü, yeni düğümlerin eklenebilme hızıdır.
  • Globaldeki veriler her zaman indekslenir. Bunları hem tek bir seviyede hem de ağacın derinliklerinde geçmek her zaman hızlıdır.

Küresele ikinci ve üçüncü seviyelerin birkaç dalını daha ekleyelim.

Set ^a("+7926X", "city") = "Moscow"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Küresellere dayalı olarak çok düzeyli ağaçların oluşturulabileceği açıktır. Üstelik ekleme sırasındaki otomatik indeksleme nedeniyle herhangi bir düğüme erişim neredeyse anında gerçekleşir. Ve ağacın herhangi bir seviyesinde tüm dallar anahtara göre sıralanır.

Gördüğünüz gibi bilgiler hem anahtarda hem de değerde saklanabilir. Toplam anahtar uzunluğu (tüm indekslerin uzunluklarının toplamı) şuna ulaşabilir: 511 baytve değerler 3.6 МБ Önbellek için. Ağaçtaki düzey sayısı (boyut sayısı) 31'dir.

Bir başka ilginç nokta. Üst seviyelerdeki düğümlerin değerlerini belirtmeden bir ağaç oluşturabilirsiniz.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3

Boş daireler, atanan değeri olmayan düğümlerdir.

Globalleri daha iyi anlamak için onları diğer ağaçlarla karşılaştıralım: bahçe ağaçları ve dosya sistemi ad ağaçları.

Küresellerdeki ağaçları bize en tanıdık hiyerarşik yapılarla karşılaştıralım: bahçelerde ve tarlalarda yetişen sıradan ağaçların yanı sıra dosya sistemleriyle.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Bahçe ağaçlarında gördüğümüz gibi yaprak ve meyveler sadece dalların uçlarında bulunur.
Dosya sistemleri - bilgiler yalnızca tam olarak nitelenmiş dosya adları olan dalların uçlarında depolanır.

Ve işte küresel veri yapısı.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1Farklılıklar:

  1. Dahili düğümler: Global olarak bilgi sadece dalların uçlarında değil her düğümde saklanabilir.
  2. Dış düğümler: Küresel, dalların uçlarında tanımlanmış değerlere sahip olmalıdır, FS ve bahçe ağaçları ise yoktur.



Dahili düğümler açısından globalin yapısının, dosya sistemlerindeki ve bahçe ağaçlarındaki isim ağaçları yapısının bir üst kümesi olduğunu söyleyebiliriz. Onlar. daha esnek.

Genel olarak küresel Her düğümde veri depolayabilme özelliğine sahip sıralı ağaç.

Globallerin çalışmasını daha iyi anlamak için, dosya sistemlerinin yaratıcılarının bilgi depolamak için globallere benzer bir yaklaşım kullanmaları durumunda ne olacağını hayal edin.

  1. Bir dizindeki tek bir dosyayı silmek, dizini ve yalnızca yeni silinen dizini içeren tüm üstteki dizinleri otomatik olarak siler.
  2. Dizinlere gerek kalmayacaktı. Yalnızca alt dosyaları olan dosyalar ve alt dosyaları olmayan dosyalar olacaktır. Sıradan bir ağaca benzetsek her bir dalı meyve olur.

    Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

  3. README.txt dosyaları gibi şeylere ihtiyaç duyulmayabilir. Dizinin içeriği hakkında söylenmesi gereken her şey dizin dosyasının içine yazılabilir. Yol alanında, dosya adı dizin adından ayırt edilemez, dolayısıyla yalnızca dosyalarla idare etmek mümkündü.
  4. İç içe geçmiş alt dizinlere ve dosyalara sahip dizinleri silme hızı önemli ölçüde artacaktır. Habré'de birçok kez milyonlarca küçük dosyayı silmenin ne kadar uzun ve zor olduğu hakkında makaleler yayınlandı (1, 2). Ancak globalde sahte dosya sistemi oluşturursanız, bu birkaç saniye veya birkaç saniye sürecektir. Bir ev bilgisayarındaki alt ağaçları silmeyi test ettiğimde, bir HDD'deki (SSD değil) iki katmanlı bir ağaçtan 1-96 milyon düğümü 341 saniyede kaldırdı. Üstelik sadece globals içeren dosyanın tamamını değil, ağacın bir kısmını silmekten bahsediyoruz.

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1
Alt ağaçların kaldırılması, küresellerin bir başka güçlü noktasıdır. Bunun için özyinelemeye ihtiyacınız yok. Bu inanılmaz derecede hızlı gerçekleşir.

Ağacımızda bu şu komutla yapılabilir: Öldürmek.

Kill ^a("+7926X")

Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 1

Globaller üzerinde hangi eylemlerin bizim için mevcut olduğunu daha iyi anlamak için kısa bir tablo sunacağım.

COS'ta globallerle çalışmaya yönelik temel komutlar ve işlevler

set
Bir düğüme (henüz tanımlanmamışsa) ve düğüm değerlerine dallar ayarlama

gitmek
Bir alt ağacın kopyalanması

Öldürmek
Bir alt ağacı kaldırma

ZÖldür
Belirli bir düğümün değerinin silinmesi. Düğümden çıkan alt ağaca dokunulmaz

$sorgu
Ağacın derinliklerine inerek ağacın tam geçişini yapın

$Sipariş
Belirli bir düğümün dallarını geçme

$Veri
Bir düğümün tanımlı olup olmadığını kontrol etme

$ Artış
Bir düğüm değerinin atomik olarak arttırılması. ASİT için okuma ve yazma yapmaktan kaçınmak için. Son zamanlarda şu şekilde değiştirilmesi önerildi: $Sıra

İlginiz için teşekkür ederiz, sorularınızı cevaplamaya hazırız.

Feragatname: Bu makale ve ona ilişkin yorumlarım benim görüşümdür ve InterSystems Corporation'ın resmi konumuyla hiçbir ilgisi yoktur.

Uzatma Küreseller veri depolamak için kullanılan hazine kılıçlarıdır. Ağaçlar. Bölüm 2. Globallerde ne tür verilerin görüntülenebileceğini ve bunların hangi görevlerde maksimum fayda sağladığını öğreneceksiniz.

Kaynak: habr.com

Yorum ekle