0Pricing
SQL Interview Prep · Ders

Hesaplanan Değerlere Göre Filtreleme

Sütunlar üzerinde işlev kullanmanın dizin kullanımını neden engellediğini ve mülakatçıların bunu nasıl sorguladığını öğrenin.

Hesaplanan Değerlere Göre Filtreleme, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Bu Soru Düzeyleri Nasıl Ayırt Eder

İstek masum görünüyor: bu sorgu doğru ama yavaş, neden? Çoğu zaman yanıt, WHERE yan tümcesinin dizinlenmiş bir sütunu bir işlevin içine sarmalamasıdır. Bu, koşulu dizin aramasına uygun olmayan bir hâle getirir: iyileştirici artık dizini kullanamaz ve her satırı taramak zorunda kalır.

Bu ders dizin aramasına uygunluğu açıklar, mülakat yapanların beklediği yeniden yazımları gösterir ve hesaplanan bir filtrenin gerçekte nereye ait olduğunu ele alır.

Dizin Aramasına Uygunluğun Tek Tanımı

Dizin aramasına uygun (arama bağımsız değişkeni ABLE), bir koşulun eşleşen satırlara doğrudan gitmek için bir dizini kullanabilmesi anlamına gelir. Temel kural şudur: dizinlenmiş sütun, karşılaştırmanın bir tarafında tek başına yer almalıdır; bir işlevin veya ifadenin içine gömülmemelidir.

  • Dizin aramasına uygun: col = 5, col > 100, col LIKE 'abc%'
  • Dizin aramasına uygun olmayan: FUNC(col) = 5, col + 1 > 100

Sütuna İşlev Uygulama Karşıt Örüntüsü

Buradaki amaç 2024'te verilen siparişleri bulmaktır. Sütunu YEAR() içine almak, motoru karşılaştırma yapmadan önce her bir satır için yılı hesaplamaya zorlar; bu nedenle order_date üzerindeki dizin kullanılamaz hâle gelir.

Doğru sonucu döndürür, ancak tüm tabloyu tarar. Büyük bir tabloda bu, milisaniyeler ile dakikalar arasındaki farktır.

-- non-sargable: function on the indexed column
SELECT *
FROM orders
WHERE YEAR(order_date) = 2024;

Aralık Olarak Yeniden Yazma

Çözüm, order_date sütununu tek başına bırakıp koşulu yarı açık bir aralık olarak ifade etmektir. Artık order_date üzerindeki dizin doğrudan 2024'ün başlangıcına gidebilir ve 2025 sınırında durabilir.

Sonuç aynıdır, ancak tam tarama yerine dizin aralığı taraması yapılır. Bu aralık biçiminde yeniden yazma, mülakatlarda dizin aramasına uygunlukla ilgili en sık sınanan düzeltmedir.

-- sargable: column stays bare
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2025-01-01';

Sütun Üzerinde Aritmetik İşlem

Aynı sorun aritmetik işlemlerde de gizlenir. WHERE salary + bonus > 100000 veya WHERE price * 0.9 < 50 ifadelerinin ikisi de sütun üzerinde hesaplama yapar ve dizini engeller.

Matematiği mümkün olduğunda sabit tarafa taşıyın: price * 0.9 < 50 ifadesini price < 50 / 0.9 olarak yeniden yazın. Sabit değer bir kez hesaplanır; price ise tek başına kalır ve dizinlenebilir.

-- before: math on the column (non-sargable)
WHERE price * 0.9 < 50
-- after: math on the constant (sargable)
WHERE price < 50 / 0.9

Büyük-Küçük Harfe Duyarsız Arama Biçimi

WHERE LOWER(email) = 'a@b.com', email üzerindeki normal bir dizine göre dizin aramasına uygun değildir; çünkü her satırın e-posta adresi önce küçük harfe çevrilir.

Üretim ortamları için iki çözüm vardır: normalleştirilmiş, küçük harfe çevrilmiş bir kopya saklayıp bunu dizinlemek veya ifadenin kendisinin dizinlenmesi için LOWER(email) üzerinde bir işlevsel dizin oluşturmaktır. İşlevsel dizin seçeneğinden söz etmek, gerçek dünya deneyiminizi gösterir.

-- functional index makes the expression sargable
CREATE INDEX idx_email_lower ON users (LOWER(email));
SELECT * FROM users WHERE LOWER(email) = 'a@b.com';

Hesaplamaya Gerçekten İhtiyaç Duyduğunuzda

Bazen filtre gerçekten de aralık olarak yeniden yazılamayan hesaplanmış bir değere, örneğin bir orana, bağlıdır. Yine de SELECT takma adına WHERE içinde başvuramazsınız; çünkü WHERE, SELECT listesinden önce değerlendirilir.

Bu nedenle ifadeyi WHERE içinde tekrarlamanız veya sorguyu bir alt sorgu / CTE içine alıp hesaplanan sütunu dış sorguda filtrelemeniz gerekir.

SELECT *
FROM (
  SELECT *, revenue / NULLIF(visits, 0) AS rev_per_visit
  FROM stats
) t
WHERE t.rev_per_visit > 2.5;

Toplu Hesaplamalar WHERE Değil, HAVING İçinde Yer Alır

Toplu hesaplama olan bir hesaplama WHERE içinde hiç kullanılamaz; çünkü WHERE, gruplama gerçekleşmeden önce tek tek satırları filtreler. WHERE SUM(amount) > 1000 bir hatadır.

Toplu hesaplamalara dayalı filtreler, GROUP BY işleminden sonra çalışan HAVING içinde yer alır. Hesaplamayı hangi yan tümcenin gördüğünü bilmek, başlı başına sık sorulan bir yürütme sırası sorusudur.

SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > 1000;

Mülakat Yapanlar Bunu Nasıl Sınar

Bir sütun üzerinde işlev kullanan yavaş bir sorgu gösterir ve sonucu değiştirmeden sorguyu hızlandırmanızı isterler. Yapmanız gerekenler:

  • Sütun üzerinde işlev kullanımının dizin aramasına uygun olmadığını belirleyin
  • Sütunu tek başına bırakacak şekilde yeniden yazın (aralık veya sabit tarafında matematik)
  • Yeniden yazma mümkün değilse işlevsel dizin veya saklanan hesaplanmış sütun önerin

Planın sıralı taramadan dizin taramasına değiştiğini doğrulamak için EXPLAIN kullanmayı belirtmeniz yanıtı güçlendirir.

Ödünleşimleri Gözetme

Dengeli olun: dizinler ve işlevsel dizinler okumaları hızlandırır, ancak yazmaları yavaşlatır ve depolama alanı kullanır. Çok küçük bir tabloda tam tarama sorun değildir; dizin eklemek gereksiz çabadır.

Kıdemli düzeyde yanıt koşulludur: bu sütun büyükse ve sık sık bu şekilde filtreleniyorsa koşulu dizin aramasına uygun hâle getirin veya işlevsel bir dizin ekleyin; aksi durumda olduğu gibi bırakın. Mülakatlarda bağlam, katı kurallardan daha önemlidir.

İşlevsel Dizinler Hesaplamayı İndekslenebilir Kılar

Bazen gerçekten de dönüştürülmüş bir değere göre filtreleme yapmanız gerekir; örneğin büyük-küçük harf duyarsız bir eşleşme için. Dizinlerden vazgeçmek yerine, filtreleme yaptığınız tam ifade üzerinde bir ifade (işlevsel) dizini oluşturun.

  • Böylece bir işlev sütunu sarmalasa bile iyileştirici dizini kullanabilir.
  • Dizin ifadesi, koşul ifadesiyle tamamen aynı olmalıdır.
-- index the expression you filter on
CREATE INDEX idx_users_lower_email ON users (lower(email));

-- now this predicate stays sargable
SELECT * FROM users WHERE lower(email) = 'amy@example.com';

Hızlı Kontrol

İyileştiricinin hangi koşul için dizin kullanabileceğini belirleyin.

Özet

Temel çıkarımlar:

  • Bir koşul, dizinlenmiş sütun bir işlevin veya aritmetik işlemin içinde değil de tek başına yer aldığında dizin aramasına uygundur
  • YEAR(col) = 2024 ifadesini yarı açık bir aralık olarak yeniden yazın; matematiği sabit tarafa taşıyın
  • Kaçınılmaz ifadeler için işlevsel dizin veya saklanan hesaplanmış sütun kullanın
  • SELECT takma adını WHERE içinde kullanamazsınız; toplu hesaplamalar HAVING içinde yer alır

Klasik soru yavaş bir sorgudur; klasik çözüm ise sütunu tek başına bırakmaktır.

Sıkça Sorulan Sorular

“Hesaplanan Değerlere Göre Filtreleme” dersi ücretsiz mi?

Evet — “Hesaplanan Değerlere Göre Filtreleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Hesaplanan Değerlere Göre Filtreleme” dersinde ne öğreneceğim?

Sütunlar üzerinde işlev kullanmanın dizin kullanımını neden engellediğini ve mülakatçıların bunu nasıl sorguladığını öğrenin. SQL Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

SQL Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te SQL Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Hesaplanan Değerlere Göre Filtreleme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. AND/OR Önceliği ve Parantez Kullanımı
  2. BETWEEN, IN ve Dahil Sınırlar
  3. LIKE, Joker Karakterler ve Kaçış
  4. Hesaplanan Değerlere Göre Filtreleme
← SQL Interview Prep Sayfasına Dön