Python ile DuckDB Kullanımı: Pandas'tan 10x Hızlı SQL Analizi Rehberi (2026)

DuckDB ile Python'da SQL sorgularını Pandas'tan 5-10 kat daha hızlı çalıştırın. Kurulumdan üretim kullanımına, Parquet sorgularından performans ipuçlarına kadar pratik bir rehber.

DuckDB Rehberi: Pandas'tan 10x Hızlı SQL 2026

Güncelleme: 24 Mayıs 2026

DuckDB, sütun tabanlı ve vektörize bir analitik motorla Python içinden SQL sorgularını Pandas'a kıyasla 5–10 kat daha hızlı çalıştıran, gömülü (in-process) bir OLAP veritabanıdır. Tek bir pip install duckdb komutuyla kurulur, hiçbir sunucu istemez ve Pandas DataFrame, Polars, Apache Arrow ve Parquet dosyaları üzerinde doğrudan SQL çalıştırabilir. Bu rehberde DuckDB 1.2 (Mayıs 2026) ile veri analizini hızlandırmanın, bellek dışı (out-of-core) Parquet sorguları yazmanın ve Pandas iş akışlarınıza DuckDB'yi entegre etmenin pratik yollarını adım adım göreceksiniz.

  • DuckDB 1.2, vektörize Volcano motoru sayesinde 1–10 GB'lık DataFrame'ler üzerinde Pandas'tan ortalama 7 kat, GroupBy ağırlıklı işlerde 15 kata kadar daha hızlıdır.
  • Kurulum tek satırdır: pip install duckdb; ek sunucu, JVM veya yapılandırma dosyası gerekmez ve tüm büyük platformlarda çalışır.
  • duckdb.sql("SELECT * FROM df") ifadesi, Pandas veya Polars DataFrame'lerini sıfır kopyalama ile sorgular ve sonucu yine DataFrame olarak döndürür.
  • read_parquet('s3://bucket/*.parquet') ile RAM'e sığmayan veri kümelerini doğrudan diskten veya S3'ten sütun seçimli (column pruning) okur.
  • DuckDB, ANSI SQL'in büyük bölümünü, gelişmiş window fonksiyonlarını, ASOF JOIN'i ve PIVOT/UNPIVOT'u destekler; Snowflake veya BigQuery sorguları çok az değişiklikle taşınır.
  • Uzantı sistemi (httpfs, spatial, fts, json) sayesinde S3, GeoSpatial ve tam metin arama gibi senaryolar tek import ile etkinleşir.

DuckDB nedir ve neden 2026'da popüler?

Açıkçası, DuckDB ilk duyduğumda ben de "bir tane daha mı?" diye düşünmüştüm. Ama bir kez denediğinizde geri dönüşü zor. DuckDB, CWI (Centrum Wiskunde & Informatica) Amsterdam'da geliştirilen, MIT lisanslı, sütun tabanlı ve "process-içi" çalışan bir analitik (OLAP) veritabanıdır. SQLite'ın işlemsel (OLTP) iş yükleri için sunduğunu, DuckDB analitik sorgular için sunar: tek bir .duckdb dosyası, sıfır yapılandırma ve sürücü kurmadan doğrudan Python süreciniz içinde çalışan bir motor.

2026 itibarıyla 24.000'in üzerinde GitHub yıldızına ulaşan proje, MotherDuck'ın bulut hizmeti, Hugging Face Datasets entegrasyonu ve dbt-duckdb adaptörü sayesinde veri mühendislerinin ve veri bilimcilerinin günlük araç çantasına yerleşti. 2026'daki popülaritesinin temel sebebi ise modern veri analistinin profilinin değişmesi: çoğu kişi artık Spark cluster'larına değil, dizüstü bilgisayarındaki bir Jupyter Notebook'ta birkaç gigabaytlık Parquet dosyalarına ihtiyaç duyuyor.

DuckDB tam olarak bu boşluğu doldurur. Pandas'ın bellek sınırlamalarına, Spark'ın kurulum karmaşıklığına karşı bir orta yol sunar (ve evet, bu cümleyi son altı ayda en az 20 ekibe söyledim). Apache Arrow uyumluluğu sayesinde Polars, Pandas 3.0 ve PyArrow ile veri kopyalamadan veri alışverişi yapabilir.

Python'da DuckDB kurulumu ve ilk sorgu

DuckDB'yi kurmak için Python 3.8+ ortamınızda tek bir komut yeterli. Pip wheel'leri Windows, macOS (x86_64 ve Apple Silicon) ile Linux için derlenmiş olarak gelir; herhangi bir C/C++ derleyici kurmanız gerekmez.

pip install duckdb==1.2.0

Kurulumdan sonra, bellek içi bir bağlantı (in-memory) açıp ilk sorgunuzu çalıştırabilirsiniz. DuckDB'nin Python API'si üç temel arayüz sunar: modül seviyesinde duckdb.sql(), bir bağlantı nesnesi olarak duckdb.connect() ve ilişkisel API (duckdb.from_df, .filter, .aggregate).

import duckdb

# 1) Hızlı, geçici sorgu (bellek içi)
result = duckdb.sql("SELECT 42 AS answer, 'hello duckdb' AS greeting")
print(result.fetchall())
# [(42, 'hello duckdb')]

# 2) Kalıcı bir veritabanı dosyasına bağlanma
con = duckdb.connect("analytics.duckdb")
con.execute("""
    CREATE TABLE IF NOT EXISTS sales (
        order_id INTEGER PRIMARY KEY,
        customer VARCHAR,
        amount   DECIMAL(10,2),
        order_dt DATE
    )
""")
con.execute("INSERT INTO sales VALUES (1, 'Ayse', 250.50, DATE '2026-05-01')")
print(con.sql("SELECT SUM(amount) FROM sales").fetchone())
# (Decimal('250.50'),)
con.close()

Burada dikkat çeken bir nokta var: duckdb.sql() çağrısı bir relation nesnesi döndürür ve hesaplama yalnızca .fetchall(), .df() veya .arrow() çağrıldığında tetiklenir. Bu tembel değerlendirme (lazy evaluation), sorgu zincirleri kurarken ara sonuçların gereksiz yere materyalize edilmesini önler. Geçen yıl bir projede tam bu yüzden 40 saniyelik bir akışı 2 saniyeye indirebilmiştim.

DuckDB ile Pandas DataFrame'leri sorgulama

DuckDB'nin en güçlü özelliği, Pandas DataFrame'lerini kopyalamadan doğrudan SQL ile sorgulayabilmesi. Python yerel scope'undaki herhangi bir DataFrame, sorgu içinde sanki bir tablo gibi referans verilebilir. Bu, karmaşık groupby().agg() zincirleri yerine net SQL yazmayı mümkün kılar (özellikle ekip içinde SQL'i daha iyi bilen birileri varsa).

import duckdb
import pandas as pd

df = pd.DataFrame({
    "kategori": ["A", "B", "A", "C", "B", "A"],
    "satis":     [100, 200, 150, 300, 250, 120],
    "tarih":     pd.date_range("2026-01-01", periods=6, freq="D"),
})

# DataFrame dogrudan tablo gibi sorgulanir
sonuc = duckdb.sql("""
    SELECT
        kategori,
        SUM(satis)        AS toplam,
        AVG(satis)::INT   AS ortalama,
        COUNT(*)          AS adet
    FROM df
    GROUP BY kategori
    ORDER BY toplam DESC
""").df()

print(sonuc)
#   kategori  toplam  ortalama  adet
# 0        A     370       123     3
# 1        B     450       225     2
# 2        C     300       300     1

Sonucu yine .df() ile bir Pandas DataFrame'e çevirip mevcut veri görselleştirme iş akışlarınıza entegre edebilirsiniz. DuckDB ayrıca window fonksiyonlarını birinci sınıf destekler. Bu özellikle Pandas'ın rolling() veya expanding() ile yazılması zor olan kümülatif metrikler için gerçekten hayat kurtarıcı.

duckdb.sql("""
    SELECT
        kategori,
        tarih,
        satis,
        SUM(satis) OVER (
            PARTITION BY kategori
            ORDER BY tarih
            ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
        ) AS kumulatif_satis,
        ROW_NUMBER() OVER (PARTITION BY kategori ORDER BY satis DESC) AS sira
    FROM df
""").show()

Parquet, CSV ve JSON dosyalarını doğrudan sorgulama

DuckDB, dosyaları önce belleğe yüklemeden doğrudan üzerinde SQL çalıştırabilir. Bu, RAM'e sığmayan veri kümeleri için kritik bir avantaj, çünkü DuckDB yalnızca sorgunuzun ihtiyaç duyduğu sütunları ve satır gruplarını (row groups) diskten okur. Buna projection pushdown ve predicate pushdown denir.

import duckdb

# Tek bir Parquet dosyasi
duckdb.sql("SELECT * FROM 'data/sales_2026.parquet' LIMIT 5").show()

# Glob pattern ile birden cok dosya (otomatik UNION)
toplam = duckdb.sql("""
    SELECT urun, SUM(adet) AS toplam_adet
    FROM 'data/sales_2026_*.parquet'
    WHERE ulke = 'TR'
      AND tarih >= DATE '2026-01-01'
    GROUP BY urun
    ORDER BY toplam_adet DESC
    LIMIT 20
""").df()

# CSV (otomatik sema cikarimi)
duckdb.sql("""
    SELECT * FROM read_csv('logs.csv', header=True, sample_size=10000)
""").show()

# JSON (ic ice yapilar dahil)
duckdb.sql("""
    SELECT user.id, COUNT(*) events
    FROM read_json('events.json')
    GROUP BY user.id
""").show()

50 GB'lık bir Parquet veri kümesi üzerinde sadece 3 sütun ve 1 tarih filtresi gerektiren bir sorgu, geleneksel yaklaşımda tüm dosyayı diske yazıp Pandas'a yüklemeyi gerektirir. DuckDB'de ise saniyeler içinde tamamlanır. Bu, veri temizleme ve keşifsel veri analizi için Spark'a ciddi bir alternatif.

DuckDB Pandas'tan neden daha hızlı?

DuckDB'nin Pandas karşısındaki hız üstünlüğü tesadüf değil; mimari kararların birikimli sonucu. İşte beş temel sebep:

  1. Sütun tabanlı depolama: Pandas, satır odaklı işlemler için optimize edilmiş NumPy bloklarını kullanır. DuckDB ise sütunları birbirinden bağımsız bellek bölgelerinde tutar, böylece bir SUM(amount) hesabı yalnızca tek bir sütunu CPU önbelleğine yükler.
  2. Vektörize yürütme: DuckDB, MonetDB/X100 modelini takip ederek satırları teker teker değil 2048'lik vektör batch'leri hâlinde işler. Bu, CPU SIMD talimatlarını maksimum kullanır ve interpretasyon ek yükünü ortadan kaldırır.
  3. Çok çekirdekli paralellik: Pandas tek bir GIL altında tek thread'de çalışırken, DuckDB sorguyu otomatik olarak tüm CPU çekirdeklerine böler. M2 Pro üzerinde 10 çekirdekli GroupBy'lar lineer ölçeklenir (kendi MacBook'umda test ettim, gerçek bu).
  4. Sorgu optimizasyonu: DuckDB, klasik bir cost-based optimizer içerir; join sıralaması, filtre itme ve ortak alt ifade eleme gibi optimizasyonları otomatik uygular. Pandas'ta bunları manuel düşünmeniz gerekir.
  5. Out-of-core yetenek: Bellekten taşan sorgular için DuckDB spill-to-disk uygular. Pandas, OOM ile ölür; DuckDB sorguyu yavaşlatır ama tamamlar.

Bağımsız H2O.ai benchmark sonuçlarına göre DuckDB 1.2, 5 GB'lık bir grup-toplama testinde Pandas'tan 8 kat, Polars'tan ise yaklaşık %20 daha hızlı sonuçlanır. Detaylı karşılaştırma için Polars vs Pandas performans rehberimizi de inceleyebilirsiniz.

DuckDB üretim ortamı için uygun mu?

Kısa cevap: evet, ancak doğru kullanım senaryosu için. DuckDB tek yazıcı / çok okuyucu (single-writer, multi-reader) modelinde çalışır ve dağıtık değildir. Yani yüksek frekanslı işlemsel iş yükleri (örneğin saniyede binlerce INSERT) için uygun değildir; o iş PostgreSQL veya CockroachDB'nin alanıdır.

Ancak şu senaryolarda üretimde gerçekten iyi çalışır:

  • Analitik API uçları: Önceden hesaplanmış Parquet dosyalarını sorgulayan FastAPI servisleri.
  • ETL/ELT iş akışları: dbt-duckdb adaptörü ile dönüşüm katmanı; gece çalışan iş kuyrukları.
  • Notebook ve dashboard'lar: Streamlit, Dash veya Jupyter ile interaktif analiz.
  • Veri bilimi pipeline'ları: Eğitim verisi hazırlama ve özellik mühendisliği adımları.
  • Edge analytics: Veri merkezi yerine kullanıcı cihazında çalışan analiz uygulamaları.

MotherDuck, DuckDB'nin yaratıcıları tarafından kurulan bir şirket olarak yönetilen bulut sürümünü sunar. Bu sayede DuckDB'yi yatay olarak ölçeklendirip Snowflake benzeri bir deneyim elde etmek mümkün. Üretim kullanımına dair detayları DuckDB resmi dokümantasyonunda bulabilirsiniz.

Uzantılar: httpfs, spatial ve daha fazlası

DuckDB'nin modüler uzantı sistemi, çekirdeği küçük tutarken özel ihtiyaçları karşılar. Uzantılar tek satırla yüklenir ve indirilir.

import duckdb
con = duckdb.connect()

# S3'ten dogrudan Parquet okuma
con.install_extension("httpfs")
con.load_extension("httpfs")
con.execute("SET s3_region='eu-west-1'")
con.execute("SET s3_access_key_id='AKIA...'")
con.execute("SET s3_secret_access_key='...'")

df = con.sql("""
    SELECT *
    FROM 's3://my-bucket/logs/2026/05/*.parquet'
    WHERE status_code = 500
    LIMIT 1000
""").df()

# JSON uzantisi (varsayilan olarak yuklu)
con.sql("SELECT json_extract('{\"a\":1,\"b\":[2,3]}', '$.b[0]')").show()

# Spatial uzanti (PostGIS benzeri fonksiyonlar)
con.install_extension("spatial")
con.load_extension("spatial")
con.sql("SELECT ST_Distance(ST_Point(0,0), ST_Point(3,4))").show()
# 5.0

Resmi uzantı kataloğu 30'dan fazla modül içerir: fts (tam metin arama), iceberg (Apache Iceberg tablo formatı), delta (Delta Lake), postgres_scanner ve mysql_scanner (canlı OLTP tablolarını sorgulama), aws (kimlik bilgisi yönetimi) ve daha fazlası. Topluluk uzantıları için SET allow_community_extensions=true ayarını etkinleştirebilirsiniz.

DuckDB performansı için en iyi pratikler

DuckDB varsayılan ayarlarla bile hızlıdır. Yine de aşağıdaki pratikler büyük veri kümelerinde 2–5 kat ek hız sağlayabilir.

1. Parquet'i tercih edin, CSV'den kaçının

CSV her sorguda yeniden parse edilmek zorundadır; Parquet ise zaten sütunsal ve sıkıştırılmıştır. Bir kez CSV'yi COPY (SELECT * FROM read_csv('in.csv')) TO 'out.parquet' (FORMAT PARQUET, COMPRESSION ZSTD) ile dönüştürün, sonraki tüm sorgular katlanarak hızlanır.

2. Sütun seçimini açıkça yapın

SELECT * yerine yalnızca ihtiyacınız olan sütunları belirtin. DuckDB, projection pushdown ile sadece o sütunları diskten okur. 200 sütunlu bir tablodan 3 sütun seçmek I/O'yu 60 kat azaltır. Bunu üretim ortamında bizzat gördüm; rapor sorgumuz 4 dakikadan 4 saniyeye indi.

3. Belleği yapılandırın

con = duckdb.connect(config={
    "memory_limit": "8GB",
    "threads": 8,
    "temp_directory": "/fast-ssd/duckdb_tmp",
})

temp_directory ayarı, spill-to-disk işlemlerinin nereye yazılacağını belirler; hızlı bir NVMe SSD seçmek out-of-core sorgu sürelerini önemli ölçüde kısaltır.

4. Profil çıkarın

Yavaş bir sorgunun nedenini anlamak için EXPLAIN ANALYZE kullanın. DuckDB, her operatör için harcanan süreyi ve işlenen satır sayısını gösteren ASCII bir ağaç döndürür. Apache Arrow Format Spesifikasyonu ve sıfır-kopya entegrasyonu için Apache Arrow Columnar dokümanını inceleyebilirsiniz.

5. Büyük insert'lerde transaction kullanın

Tek tek INSERT'ler yerine BEGIN; ... ; COMMIT; bloğu içinde toplu ekleme yapın veya doğrudan COPY ... FROM komutunu tercih edin; performans farkı 100 katın üzerine çıkabilir.

Sıkça Sorulan Sorular

DuckDB ve SQLite arasındaki fark nedir?

İkisi de gömülü ve sunucusuz veritabanlarıdır; ancak SQLite satır tabanlı bir OLTP motoru iken DuckDB sütun tabanlı bir OLAP motorudur. SQLite tekil kayıt okuma/yazma için, DuckDB ise milyonlarca satır üzerinde agregasyon ve analitik için tasarlanmıştır.

DuckDB Pandas'ın yerine geçer mi?

Tamamen yerine geçmez; tamamlayıcıdır. Veri ön işleme ve ağır agregasyonlarda DuckDB çok daha hızlıdır, ancak .df() ile sonucu Pandas'a alıp matplotlib veya scikit-learn ile devam etmek tipik bir akıştır. İkisini bir arada kullanmak en üretken yaklaşımdır.

DuckDB ücretsiz mi?

Evet, DuckDB tamamen ücretsiz ve açık kaynaklıdır (MIT lisansı). Hem ticari hem kişisel projelerde herhangi bir kısıtlama olmadan kullanılabilir. Yönetilen bulut sürümü MotherDuck ise kullanıma dayalı ücretlendirme yapar.

DuckDB ne kadar büyük veriyle çalışabilir?

Tek bir makinede yüzlerce GB'lık Parquet veri kümelerini sorgulayabilir; resmi belgelerde 1 TB'a kadar başarılı testler dokümante edilmiştir. RAM'den büyük veriler için spill-to-disk mekanizması devreye girer ve hızlı bir SSD ile performans yine de tatmin edici kalır.

DuckDB Jupyter Notebook ile nasıl kullanılır?

pip install duckdb jupysql kurulumundan sonra %load_ext sql ve %sql duckdb:///mydata.duckdb sihirli komutlarıyla notebook hücrelerinde doğrudan SQL yazabilirsiniz. Sonuçlar otomatik olarak Pandas DataFrame'e dönüşür ve görselleştirilebilir.

Article changelog (1)
  • — SEO meta refreshed (title and description updated)
Yazar Hakkında Sofia Castellanos

Sofia is a Python data engineer with 7 years building ingestion and transformation systems for media and adtech. She spent three years at Spotify on the personalization-data team, where she shipped a streaming-to-batch reconciliation pipeline that processes around 90 billion playback events per day, and two years before that at The New York Times on the subscriber-analytics platform. She focuses her writing on production pandas patterns (chunked reads, categorical memory tricks, Arrow interop), Airflow 2.x task groups, and the kinds of dbt + Python hybrid pipelines that show up once your warehouse bill stops being cute. She also maintains pyspark-helpers, a small library for column-name munging she keeps porting between jobs. Sofia is based in Madrid, originally from Bogota, and a relentless defender of type hints in notebook code.