Müşterilerimiz İletişim EN

LookML ile Yüksek Performanslı Veri Modelleri Oluşturma Rehberi

İyi bir LookML, yalnızca soruları yanıtlamakla kalmaz; onları daha hızlı, daha temiz ve kolay sorgulanabilir hale getirir. Looker’da biraz deneyim kazandıysanız, LookML’in sadece bir modelleme dili olmadığını fark edersiniz. Looker, ham veriyi güvenilir ve iş için hazır içgörülere dönüştüren temel bir platformdur. Ölçeklenebilir bir LookML modeli oluşturmak ise onu sadece “çalışır” hale getirmekle ilgili değildir; temiz, tutarlı ve sürdürülebilir kod yazmayı gerektirir. Bu sayede gelecekte hem siz hem de ekip arkadaşlarınız daha memnun ve verimli olabilirsiniz.


Bu rehberde, temel bilgilerin ötesine geçerek Dimensions ve Measures sözdizimini, Explore ve join tanımlarını, ayrıca türetilmiş tablolar ve PDT’ler ile önbellekleme stratejilerini detaylıca ele alacacağız. Yalnızca her parametrenin ne yaptığını öğrenmekle kalmayacak, onları LookML’de tam olarak nasıl yazacağınızı da göreceksiniz.


İster ilk modelinizi oluşturuyor olun, ister karmaşık bir analitik katmanını yeniden düzenliyor olun; bu örüntüler ve en iyi uygulamalar LookML’inizi anlaşılır, tekrar kullanılabilir ve performans için optimize edilmiş hale getirmenize yardımcı olacak.


1. Boyut (Dimension) ve Ölçüm (Measure) Sözdizimi


1.1 Boyut (Dimension) Tanımlama

Dimension, kaynağınızdaki verinin bir özelliğini (sütun) temsil eder. Tanımlarken şu en iyi uygulamaları takip edin:

  • İsimlendirme kuralı: Küçük harflerle yazın ve boşluklar için alt çizgi kullanın (örn. full_name).
  • Kod düzeni: Gezinmeyi kolaylaştırmak için yeni dimension’ları view dosyasında mevcut olanların ardına ekleyin.

Örnek:


dimension: first_name {
     sql: ${TABLE}.first_name ;;
     }


Önemli dimension parametreleri:

  • type
    • string – Metin değerleri için varsayılan.
    • number – Sayısal veriler ve matematiksel hesaplamalar için.
    • yesno – Boolean çıktısı (“Yes”/”No”).
    • tier – Değerleri aralıklara ayırmak için.
  • dimension_group – Tek bir alandan birden fazla dimension oluşturur.
    • type: time – Tarih/zaman alanları için (timeframes gerektirir)
    • ${created_date} ile referans verin.
    • type: duration – Zaman farkları için (intervals, sql_start, sql_end gerektirir)
    • Esneklik için sabit kodlanmış DATE_DIFF() yerine kullanın.

1.2 Ölçüm (Measure) Tanımlama

Measure, verinizin toplanmış (aggregate) versiyonudur.


Yaygın measure türleri şunlardır:

  • sum – Değerleri toplar.
  • average – Ortalama hesaplar.
  • count – Satırları sayar, varsayılan olarak primary key kullanır.
  • count_distinct – Benzersiz değerleri sayar.

Örnek:


measure: total_sales {
     type: sum
     sql: ${sale_price} ;;
     }


Ek seçenekler:

  • value_format_name – Gösterim formatı (örn. para birimi için usd_0).
  • filters – Bir measure için koşul uygular.

Örnek:


measure: new_user_count {
     type: count
     filters: [users.is_new_user: "Yes"]
     }


  • Diğer measure’lardan türetme: LookML’de, measure’ları yalnızca ham alanlardan oluşturmakla sınırlı değilsiniz, aynı zamanda mevcut measure’lardan yeni measure’lar da oluşturabilirsiniz. Yeter ki; yeni measure’ın type değerini number olarak ayarlayın.

    Bu özellikle, oranlar, yüzdeler veya KPI gibi performans metriklerini hesaplamak istediğinizde faydalıdır. Çünkü bu sayede toplama mantığını tekrar etmenize gerek kalmaz. SQL’i yeniden yazmak yerine diğer measure’lara referans vererek hesaplamalarınızın tutarlı kalmasını ve gelecekte yapılacak değişikliklerin orijinal measure’lara otomatik olarak yansımasını sağlarsınız.

Örnek:


measure: profit_margin {
     type: number
     sql: ${total_profit} / ${total_revenue} ;;
     value_format_name: percent_2
     }


Bu örnekte, total_profit ve total_revenue önceden tanımlanmış measure’lardır. Bunları bölerek şu özelliklere sahip bir hesaplanmış KPI oluşturursunuz:

  • Sürdürülmesi daha kolaydır, tekrar eden SQL yoktur.
  • Hataya daha az açıktır, orijinal measure’ların mantığını devralır.
  • Kaynak measure’lar değişirse, otomatik olarak güncellenir.

💡 Önemli Tavsiye: Measure’lara her zaman ${TABLE}.column_name yerine ${measure_name} ile referans verin. Bunu yaptığınızda, mantığınız ortaklaşır ve tutarsız hesaplamalar yapma riskiniz azalır.


1.3 Alanlara Referans Verme

LookML, mantığı yeniden kullanmak ve sabit kodlamayı azaltmak için yerine koyma operatörleri (substitution operators) kullanır.


  • ${field_name} – Aynı view’daki mevcut bir dimension ya da measure’a referans verir.

Örnek:


sql: concat(${first_name}, " ", ${last_name}) ;;


  • ${TABLE}.column_name – Doğrudan bir veritabanı sütununa referans verir, bir alanı ilk kez tanımlarken kullanılır.
  • ${view_name.field_name}Join edilmiş başka bir view’daki alanlara referans verir.

2. Explore ve Join Sözdizimi


2.1 Explore Tanımlama

Explore, önceden join edilmiş view’ları içeren bir analiz başlangıç noktasıdır.


Örnek:


explore: orders { }


Explore adı mutlaka mevcut bir view adıyla eşleşmelidir.


2.2 Join Tanımlama

Join’ler, Explore içindeki ek view’ları bağlar.


Örnek:


join: users {
     type: left_outer
     sql_on: ${order_items.user_id} = ${users.id} ;;
     relationship: many_to_one
     }


Temel join parametreleri:

  • type: left_outer (varsayılan), inner, full_outer, cross.
  • sql_on: LookML alan referansları kullanan join koşulu.
  • relationship: Simetrik toplama için kardinaliteyi tanımlar (one_to_one, one_to_many, many_to_one, many_to_many).
  • from: Aynı view birden fazla kez join edildiğinde alias için kullanılır.

2.3 Birincil Anahtarlar (Primary Keys) ve Filtreleme


  • primary_key: yes – Simetrik toplama için her view’da mutlaka tanımlayın.
  • sql_always_where – Gizli ve kaldırılamayan bir WHERE ifadesi ekler.
  • sql_always_having – Gizli ve kaldırılamayan bir HAVING ifadesi ekler.
  • always_filter – Görünür ve zorunlu bir filtre; kullanıcı kaldıramaz.
  • conditionally_filter – Görünür filtre; başka bir filtre uygulandığında kaldırılabilir.

Özet Tablo: Filtreleme Türleri


Özellik Uygulandığı SQL İfadesi Kullanıcıya Görünür mü? Kullanıcı Düzenleyebilir mi? Kullanım Senaryosu
sql_always_where WHERE ❌ Hayır ❌ Hayır Veriyi kısıtlamak için kalıcı bir satır düzeyinde filtre uygular (örn. status = 'active').
sql_always_having HAVING ❌ Hayır ❌ Hayır Kalıcı bir toplama düzeyinde filtre uygular (örn. COUNT(*) > 0).
always_filter Looker UI filtresi ✅ Evet ⚠️ Evet
(değer değiştirilebilir ama filtre kaldırılamaz)
Analizi yönlendiren ama ayarlamalara izin veren varsayılan, zorunlu filtre sağlar.
conditionally_filter LookML’de koşullu mantık ✅ Evet ✅ Evet Sadece başka bir belirli filtre uygulandığında görünür, bağımlı filtreleme mantığı için faydalıdır.

3. Türetilmiş Tablolar (Derived Tables) Sözdizimi

Türetilmiş tablolar; temel veritabanında var olmayan, LookML’de tanımlanmış özel tablolardır. Kaynak şemayı değiştirmeden doğrudan modelinizde tekrar kullanılabilir dönüşümler oluşturmanıza olanak tanır.


💡 Daha önce yayınladığımız Looker en iyi uygulamaları konulu yazıyı incelemek için buraya tıklayın.


3.1 Türetilmiş Tablolar (SQL-Derived Tables – SDTs) -View olarak

SDT’ler LookML içinde ham SQL ile tanımlanır. Bunları SQL Runner üzerinden veya doğrudan IDE içinde oluşturabilirsiniz ve Looker sizin için bir .view dosyası üretir. Bu dosyayı projenizdeki diğer view’lar gibi kullanabilirsiniz.


SDT’ler ne zaman kullanmalı?

  • SQL ile ifade edilmesi LookML’den daha kolay olan dönüşümler için idealdir.
  • Tek seferlik ön toplama gerektiğinde kullanışlıdır.
  • Karmaşık join’ler veya CASE mantığı Explore join’lerine iyi dönüştürülmediğinde faydalıdır.

Örnek:


view: order_facts {
  derived_table: {
    sql:
      SELECT
        order_id,
        SUM(sale_price) AS total_sales
      FROM order_items
      GROUP BY order_id ;;
    }
  primary_key: order_id
  measure: total_sales {
    type: sum
    sql: ${TABLE}.total_sales ;;
  }
}


3.2 Yerel Türetilmiş Tablolar (Native Derived Tables – NDTs)

NDT’ler tamamen LookML ile yazılır ve mevcut LookML nesnelerinden (dimensions, measures, filters) yararlanır.


NDT’ler ne zaman kullanmalı?

LookML modelinizle sıkı bir şekilde entegre kalacak dönüşümler istediğinizde özellikle değerlidir.

  • SQL mantığını tekrar etmeyi önler; her şey LookML alanlarına referans verir.
  • Kaynak alanlar değiştiğinde güncellemeleri otomatik olarak devralır.
  • Bakımı daha kolaydır ve modeller arasında taşınabilir.

Örnek:


view: top_customers {
  derived_table: {
    explore_source: orders {
      column: customer_id { field: orders.customer_id }
      column: total_spent { field: orders.total_spent }
      filters: [orders.order_status: "completed"]
    }
  }
  primary_key: customer_id
}


Temel Parametreler:

  • explore_source – Oluşturulacak Explore (SQL’deki FROM ile eşdeğer).
  • column – Türetilmiş tablodaki çıktı alanı; yeniden adlandırılabilir veya alias verilebilir.
  • filtersWHERE/HAVING koşulları ekler.
  • bind_filtersExplore’dan kullanıcı filtrelerini NDT’ye geçirir.
  • derived_column – NDT içinde, hesaplanmış yeni bir sütun oluşturur.
  • expression_custom_filterAND/OR ile karmaşık filtre mantığı oluşturur.

3.3 Kalıcı Türetilmiş Tablolar (Persistent Derived Tables – PDTs)

PDT’ler türetilmiş tabloları veritabanınızda saklar. Böylece her seferinde sorguları yeniden oluşturmak yerine materyalize edilmiş bir versiyon üzerinde çalışır. Bu, performans ağırlıklı sorgular veya anlık veri gösteriminde tutarlılık gerektiğinde kritik öneme sahiptir.


PDT’ler ne zaman kullanmalı?

  • Büyük taramalar veya pahalı join’ler gerektirecek sorguları hızlandırır.
  • Aynı materyalize edilmiş veriyi sunarak kullanıcılar arasında tutarlılığı sağlar.
  • Türetilmiş tabloların birbirine bağlı olduğu durumlarda kademeli mantık için faydalıdır.

Kalıcılık Stratejileri:


Seçenek 1 – datagroup_trigger kullanımı: Tavsiye edilir; önbellek politikasına göre yeniden oluşturur.


view: order_summary {
  derived_table: {
    sql:
      SELECT customer_id, COUNT(*) AS order_count
      FROM orders
      GROUP BY customer_id ;;
  }
  datagroup_trigger: orders_datagroup
}


Seçenek 2 – sql_trigger_value kullanımı: Sorgu sonucu değiştiğinde yeniden oluşturur.


sql_trigger_value: SELECT MAX(updated_at) FROM orders ;;


Seçenek 3 – persist_for kullanımı: PDT’yi belirli bir süre boyunca güncel tutar.


persist_for: "8 hours"


3.4 Geçici Türetilmiş Tablolar (Ephemeral Derived Tables (EDTs)

EDT’ler geçicidir; veritabanında kalıcı olmazlar. Bunun yerine, genellikle Looker’ın oluşturduğu SQL sorgusu içinde yalnızca Ortak Tablo İfadesi (CTE) olarak var olurlar.


EDT’ler ne zaman kullanmalı?

  • Hafif ara dönüşümler için idealdir.
  • Veritabanı depolama maliyetlerinin önüne geçer.
  • Sadece bir defa ihtiyaç duyulan ve tekrar kullanılmayacak mantık için mükemmeldir.

Örnek:


view: temporary_calc {
  derived_table: {
    sql:
      SELECT user_id, COUNT(*) AS event_count
      FROM events
      GROUP BY user_id ;;
    ephemeral: yes
  }
}


Özet Tablosu: Türetilmiş Tablo Türleri


Tür Tanımlandığı Yer Veritabanında Kalıcı mı? Kullanım Senaryosu
Türetilmiş Tablo (SDT) Ham SQL, .view içinde ❌ Hayır Tek seferlik dönüşümler veya karmaşık SQL mantığı
Yerel Türetilmiş Tablo (NDT) LookML ❌ Hayır LookML tabanlı tekrar kullanılabilir toplamalar
Kalıcı Türetilmiş Tablo (PDT) SQL veya LookML ✅ Evet Önbellek gerektiren ağır sorgular veya büyük toplamalar
Geçici Türetilmiş Tablo (EDT) SQL, .view içinde ephemeral: yes ❌ Hayır Geçici hesaplamalar veya CTE tarzı sorgular

4. Önbellekleme ve Veri Grubu (Datagroup) Söz Dizimi

Datagroup’lar, Looker’ın önbelleğe alınmış sorgu sonuçlarını veya PDT’lerin ne zaman güncelleneceğini kontrol etme yöntemidir. Onları, birden fazla Explore ve PDT’nin paylaşabileceği merkezi önbellek politikaları olarak düşünebilirsiniz. Böylece veriniz güncel, yüksek performanslı ve tutarlı kalırken, veritabanına fazla yük binmez.


Neden önemlidir?

  • Performans: Gereksiz sorguları azaltır ve veritabanı maliyetlerini düşürür.
  • Tutarlılık: Tüm bağımlı Explore ve PDT’ler aynı takvime göre güncellenir.
  • Kontrol: Önbellek güncellemelerini rastgele bir zamana değil, bir veritabanı değişikliğine (via sql_trigger) bağlayabilirsiniz.

4.1 Datagroup Tanımlama

Datagroup’lar önbellek yenileme kurallarını tanımlar.


En İyi Uygulama:

Her zaman hem max_cache_age (zaman bazlı yenileme) hem de sql_trigger (olay bazlı yenileme) tanımlayın.

  • max_cache_age verinin uzun süre eski kalmasını önler.
  • sql_trigger gerçek kaynak tablo değişikliklerini algılar ve gerektiğinde hemen yeniler.

Örnek:


datagroup: orders_datagroup {
  max_cache_age: "1 hour"
  sql_trigger: SELECT MAX(order_id) FROM orders ;;
}


  • max_cache_age: Veri değişikliği olmasa bile her saat başı yenilemeyi zorlar.
  • sql_trigger: En yüksek order_id değerini kontrol eder; değişirse önbellek hemen yenilenir.

4.2 Datagroup Uygulama

  • Explore seviyesinde: Explore seviyesinde önbellek kontrolü sağlar.


explore: orders {
  persist_with: orders_datagroup
}


  • PDT yenilemesi için: Yeniden PDT oluşturmayı bir datagroup’a bağlayın.


datagroup_trigger: orders_datagroup


  • Sabit zamanlı önbellekleme (datagroup yoksa): Datagroup desteklenmediğinde kullanılır.


persist_for: "2 hours"


Özet Tablosu: Datagroup vs. persist_for


Özellik Veri Değişikliklerini Algılar mı? Zamana Dayalı Yenileme Kullanım Senaryosu
Datagroup ✅ Evet (sql_trigger ile) ✅ Evet (max_cache_age) Veritabanı değişikliklerine bağlı dinamik yenileme, paylaşılan önbellek politikası.
persist_for ❌ Hayır ✅ Evet Datagroup desteklenmediğinde sabit yenileme.

LookML’de Ustalaşmak için Nihai Özet Tablosu


Bileşen Amaç SQL Çıktısı En İyi Uygulama
Explore Görünümleri analiz başlangıç noktası olarak birleştirir FROM + JOIN Sadece gerekli olanları join edin, güvenlik filtreleri için sql_always_where kullanın.
Dimension Gruplandırılabilir alanlar; toplama yok SELECT + GROUP BY Kullanıcı dostu isimler kullanın, ham DB sütun isimlerinden kaçının.
Measure Toplamalı metrikler SELECT + AGG() Hesaplamaları explore’lar arasında tekrar kullanın, SQL’de sabitlenmiş kodlardan kaçının.
Dimension Filtreleri Toplama öncesi uygulanan filtreler WHERE Sorgu hızını artırmak için ham seviyede filtreleme yapın.
Measure Filtreleri Toplama sonrası uygulanan filtreler HAVING Sadece, toplama gerekiyorsa kullanın.
Türetilmiş Tablolar (SDT) LookML içinde özel SQL mantığı SQL’e bağlı LookML alanlarıyla yapılamayan karmaşık mantık için kullanın.
Yerel Türetilmiş Tablolar (NDT) LookML referansları kullanılarak oluşturulmuş türetilmiş tablolar Otomatik oluşturulan SQL Bakımı kolaydır, şema değişikliklerine otomatik uyum sağlar.
Kalıcı Türetilmiş Tablolar (PDT) Hız için veritabanında önbelleğe alınmış tablolar Veritabanında fiziksel tablo Ağır sorgular için kullanın, datagroup ile yenileyin.
Geçici Türetilmiş Tablolar (EDT) Sorgu bağlamı için geçici tablolar Sorguda CTE Kalıcılık gerektirmeyen hafif mantık için idealdir.
Veri Grupları (Datagroups) Önbellek yenileme kurallarını kontrol eder Yok Her zaman max_cache_age & sql_trigger birlikte ayarlayın.
Kalıcılık Kontrolleri (Persistence Controls) PDT’leri güncel tutar Yok Yenilemeyi veri güncelleme sıklığına göre ayarlayın.

⭐⭐⭐


LookML yalnızca bir modelleme dili değil, ham veriniz ile iş kararlarınızı yönlendiren içgörüler arasında bir köprüdür. Explore, Dimensions, Measures, türetilmiş tablolar ve veri grubu gibi kavramları ustalıkla kullanarak, hızlı, doğru ve tutarlı analizleri ölçekli şekilde sunma yeteneğini açığa çıkarırsınız. Bu en iyi uygulamalar sayesinde sorgu performansını optimize ederken, yönetişim kurallarını uygularken ya da tekrar kullanılabilir metrikler oluştururken her pano ve veri keşfinin doğru hikayeyi, doğru zamanda anlatmasını sağlarsınız.


Looker deneyiminizi bir üst seviyeye taşımaya hazır mısınız? Ekibimiz, ölçeklenebilir bir LookML çerçevesi tasarlamanıza, performansı optimize etmenize ve iş kullanıcılarınızın yönetişimden ödün vermeden kendi içgörülerini elde edebilmesine yardımcı olabilir.


Bizimle iletişime geçin, verinizi rekabet avantajına dönüştürelim.


Yazan: Umniyah Abbood

Yayınlanma Tarihi: 21.08.2025



Kategoriler

Tümü Açık Kaynak (27) Android Anthos Çekirdekten Yetişenler Çevik Metodoloji Çocuklar ve Teknoloji (2) Ödeme Sistemleri (2) Üretim Sektörü (5) B2B Pazarlama (5) Bamboo Büyük Ölçekli Şirketler (4) BT Bulut (156) Buluta Geçiş (19) Bulutta Yerel Yazılım Geliştirme (4) C++ Chef ClickHouse Dayanıklılık DevOps (13) Dijital Pazarlama (11) Dijital Yerli Firmalar (3) Django (2) E-ticaret (8) Enerji Sektörü Eğitim Sektörü (7) Felaket Kurtarma (2) Finansal Hizmetler (4) FinOps (3) Firebase (10) Flutter Güvenlik (14) Git Golang (2) Google Cloud (107) Google Labs (14) Google Maps (2) Google Workspace (27) Helm Hibrit ve Çoklu Bulut (8) JavaScript Kadınlar ve STEM (3) Kamu Sektörü (2) KOBİ (5) Kubernetes (5) Kullandığımız Teknolojiler (24) Kullanıcı Arayüzü ve Kullanıcı Deneyimi Linux (6) Looker (7) MariaDB Mobil Uygulama Geliştirme (2) MySQL OpenStack (4) Oyun Sektörü (15) Perakende (13) PostgreSQL Proje Metodolojileri Python (7) Sadakat Programı (5) Sağlık ve Yaşam Bilimleri Sektörü (3) Sürdürülebilirlik (6) Sektöre Özgü Bulut Çözümleri (40) Selenium (2) Sigorta Sektörü Sistem Mimarisi (7) Tüketici Ürünleri (2) Tedarik Zinciri ve Lojistik (3) Teknoloji, Medya, Telekom (3) Terraform Test Etme (4) Turizm ve Eğlence (4) Ulaşım Sektörü (2) Uygulama Modernizasyonu Veri Analitiği (35) Veri Bilimi (2) Veri Depolama Veri Görselleştirme (7) Veri Tabanı (4) Versiyon Kontrolü Yapay Zeka - Makine Öğrenmesi (142) Yasal Uyum Yazılım Geliştirme (9) Yazılım Tarihi (3) Yazılımcı Deneyimi (8) İK Uygulamaları (9) İnşaat Sektörü İşe Alım (7)
Daha Fazla Kategori Göster >> Kategorileri Gizle >>

Kartaca sitesinden daha fazla şey keşfedin

Okumaya devam etmek ve tüm arşive erişim kazanmak için hemen abone olun.

Okumaya Devam Edin