Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
16 yazı bulundu
PostgreSQL Nedir? SQL Server Geliştiricisi için Mimari: Process'ler, Shared Buffers, WAL ve MVCC
Veritabanı SERİ 01

PostgreSQL Nedir? SQL Server Geliştiricisi için Mimari: Process'ler, Shared Buffers, WAL ve MVCC

PostgreSQL her bağlantı için ayrı bir işletim sistemi process'i başlatır, belleğin çoğunu işletim sisteminin cache'ine bırakır ve bir satırın eski sürümünü ayrı bir version store'da değil tablonun içinde tutar; SQL Server bilen biri için farkların çoğu buradan çıkar. Gerçek çıktılarla postmaster ve backend'ler, 97. bağlantıdaki 53300 hatası, connection pool, shared_buffers, WAL ve checkpoint, xmin/xmax ile MVCC, kavram eşlemesi, lisans ve sürüm takvimi.

14 Kas 2026 17 dk 1
PostgreSQL Lab'ı: Docker'da PostgreSQL 18, psql, pgAdmin ve Bookstore'u Taşımak
Veritabanı SERİ 02

PostgreSQL Lab'ı: Docker'da PostgreSQL 18, psql, pgAdmin ve Bookstore'u Taşımak

PostgreSQL 18 image'ında volume artık /var/lib/postgresql'e bağlanır ve veri 18/docker alt klasöründe durur; eski /data yolundaki veriyle image hiç açılmaz. Bookstore için kalıcı bir lab: isimli volume, owner/uygulama/superuser rollerini ayırmak, ALTER DEFAULT PRIVILEGES, snake_case ve IDENTITY ile taşınmış 1 milyon siparişlik şema, psql meta komutları ve psqlrc, pg_hba.conf, ALTER SYSTEM ile reload/restart farkı ve EF Core'un tırnaklı "Books" tablosu tuzağı.

14 Kas 2026 16 dk 1
PostgreSQL Data Type'ları: text, numeric, timestamptz, uuid, IDENTITY, Enum, Array ve Range
Veritabanı SERİ 03

PostgreSQL Data Type'ları: text, numeric, timestamptz, uuid, IDENTITY, Enum, Array ve Range

timestamptz saat dilimi saklamaz, değeri UTC'ye çevirip bir zaman anı olarak tutar ve oturumun TimeZone ayarına göre gösterir; Bookstore'daki her an bu yüzden timestamptz. Gerçek çıktılarla text ve varchar(n) farkı, numeric ile kuruş hatası, serial yerine IDENTITY, uuidv7'nin B-tree index'te %90 doluluğu, enum'un silinemeyen değerleri, array ve daterange, ICU ile Türkçe İ/ı ve sıralama, nondeterministic collation ve casefold().

14 Kas 2026 17 dk 1
PostgreSQL'e Özgü SQL ve Constraint'ler: RETURNING, ON CONFLICT, DISTINCT ON, Writable CTE, EXCLUDE ve Generated Column
Veritabanı SERİ 04

PostgreSQL'e Özgü SQL ve Constraint'ler: RETURNING, ON CONFLICT, DISTINCT ON, Writable CTE, EXCLUDE ve Generated Column

PostgreSQL'de upsert tek statement'tır: INSERT ... ON CONFLICT eşzamanlılıkta da unique violation vermeden ekler ya da günceller, 18'in RETURNING OLD/NEW'u eski ve yeni değeri birlikte döndürür. Bookstore'da sepet ve stok rezervasyonu, MERGE ile farkı, DISTINCT ON, LATERAL, generate_series ve FILTER, tek statement'ta arşivleyip silen writable CTE, deferrable foreign key, EXCLUDE ile çakışmayan kampanyalar, 18'in temporal key'leri, NOT NULL NOT VALID ve virtual generated column.

14 Kas 2026 16 dk 1
PostgreSQL'de JSONB: Operator'ler, SQL/JSON Function'ları, GIN Index ve Ne Zaman Kullanmamalı?
Veritabanı SERİ 05

PostgreSQL'de JSONB: Operator'ler, SQL/JSON Function'ları, GIN Index ve Ne Zaman Kullanmamalı?

JSONB, JSON'ı yazarken bir kez ayrıştırıp binary yapıda saklar; disk kazandırmaz ama @>, ? ve jsonpath ile sorgulanabilir ve GIN ile index'lenebilir. Bookstore'un books.attributes kolonu üzerinde json/jsonb farkı, operator'ler, jsonb_set, 17'nin JSON_VALUE ve JSON_TABLE'ı, jsonb_ops ile jsonb_path_ops'un hangi sorguda index kullandığı, expression index, tek sayaç için 175 kB WAL üreten TOAST tuzağı, tahmin hataları ve EAV'nin JSON hâli.

14 Kas 2026 13 dk 1
PostgreSQL Index Türleri: B-tree, Hash, GIN, GiST, SP-GiST, BRIN ve Partial/Expression Index
Veritabanı SERİ 06

PostgreSQL Index Türleri: B-tree, Hash, GIN, GiST, SP-GiST, BRIN ve Partial/Expression Index

PostgreSQL'de index türünü kolonun tipi değil sorgunun biçimi belirler: eşitlik ve aralık için B-tree, array/JSONB ve ILIKE '%...%' için GIN, çakışma için GiST, zamana göre büyüyen tablolar için BRIN. 18'in skip scan'iyle 10.328 yerine 26 page okuyan sorgu, deduplication, INCLUDE ve index-only scan, 21 MB'lık B-tree yerine 24 kB'lık BRIN, hash, partial ve expression index, INVALID kalan CONCURRENTLY index'i ve HOT update'i bozan index.

14 Kas 2026 14 dk 1
PostgreSQL'de EXPLAIN Okumak: ANALYZE, BUFFERS, Scan ve Join Node'ları, Statistics ve pg_stat_statements
Veritabanı SERİ 07

PostgreSQL'de EXPLAIN Okumak: ANALYZE, BUFFERS, Scan ve Join Node'ları, Statistics ve pg_stat_statements

PostgreSQL'de bir planı okurken önce her node'un tahmini satır sayısını EXPLAIN ANALYZE'ın gerçek değeriyle karşılaştırırsın; planner'ın kararları o tahmine dayanır. Cost'un elle hesabı, 18'de varsayılan olan BUFFERS, loops ve ondalıklı rows, nested loop, hash ve merge join, 13 kat yanılan tahmini düzelten CREATE STATISTICS, pg_stat_statements, GENERIC_PLAN ve EF Core sorgusunun planını parametreleriyle yakalayan auto_explain.

14 Kas 2026 17 dk 1
MVCC, VACUUM ve Autovacuum: Dead Tuple, Bloat, HOT Update ve Transaction ID Wraparound
Veritabanı SERİ 08

MVCC, VACUUM ve Autovacuum: Dead Tuple, Bloat, HOT Update ve Transaction ID Wraparound

PostgreSQL'de UPDATE satırı yerinde değiştirmez, yeni sürüm yazar; eski sürümü VACUUM temizler ama dosyayı küçültmez, alanı yeniden kullanıma açar. 40.000 satırlık tabloyu iki katına çıkaran tek UPDATE, VACUUM FULL'un okumayı da durduran kilidi, fillfactor 80 ile %100 HOT update, tablo bazında autovacuum eşiği, açık kalan bir transaction'ın VACUUM'u durdurması ve transaction ID wraparound'a karşı freeze.

14 Kas 2026 12 dk 1
PostgreSQL'de Transaction, Isolation ve Locking: Serializable SSI, SELECT FOR UPDATE SKIP LOCKED ve Advisory Lock
Veritabanı SERİ 09

PostgreSQL'de Transaction, Isolation ve Locking: Serializable SSI, SELECT FOR UPDATE SKIP LOCKED ve Advisory Lock

PostgreSQL'de okuyan yazanı hiçbir isolation level'da beklemez; REPEATABLE READ ve SERIALIZABLE çakışmayı kilitle değil 40001 hatasıyla çözer, bu yüzden retry şarttır. Lost update ve write skew denemeleri, foreign key'i bekleten FOR UPDATE yerine FOR NO KEY UPDATE, SKIP LOCKED ile dört worker'lı outbox relay, advisory lock, deadlock, ALTER TABLE'ın lock kuyruğu ve EF Core execution strategy ile retry.

14 Kas 2026 12 dk 1
PostgreSQL Full-Text Search: tsvector, tsquery, Türkçe Configuration, unaccent ve pg_trgm
Veritabanı SERİ 10

PostgreSQL Full-Text Search: tsvector, tsquery, Türkçe Configuration, unaccent ve pg_trgm

PostgreSQL'de Türkçe arama için turkish configuration yeterli bir başlangıç ama stemmer'ı kusursuz değil: "kasabalar" bulunurken "kasaba" bulunamayabilir; prefix araması, unaccent ve pg_trgm bu boşlukları kapatır. tsvector/tsquery, websearch_to_tsquery, 18'de full-text'in collation provider'ı kullanması ve İ/ı, setweight'li STORED generated column ve GIN, ts_rank, ts_headline, typo toleransı ve Elasticsearch'e ne zaman geçileceği.

14 Kas 2026 10 dk 1
Npgsql ve Dapper ile PostgreSQL: NpgsqlDataSource, Type Mapping, COPY ve LISTEN/NOTIFY
Veritabanı SERİ 11

Npgsql ve Dapper ile PostgreSQL: NpgsqlDataSource, Type Mapping, COPY ve LISTEN/NOTIFY

.NET'ten PostgreSQL'e uygulama boyunca tek bir NpgsqlDataSource ile bağlanılır; timestamptz'ye yalnızca UTC değer yazılır, Dapper ise Kind'ı belirsiz DateTime'ı hata vermeden üç saat kaydırabilir. DI ve pool varsayılanları, = ANY(@ids), DateOnly ve jsonb, Dapper'ın enum'ı integer göndermesi, 100.000 satırda Execute, NpgsqlBatch ve binary COPY, otomatik prepare, LISTEN/NOTIFY ile cache invalidation ve OpenTelemetry.

14 Kas 2026 10 dk 1
EF Core ile PostgreSQL: Npgsql Provider, snake_case, Array/JSON Mapping, Enum, xmin Concurrency ve Migration Farkları
Veritabanı SERİ 12

EF Core ile PostgreSQL: Npgsql Provider, snake_case, Array/JSON Mapping, Enum, xmin Concurrency ve Migration Farkları

EF Core'u PostgreSQL'e taşımak UseNpgsql'den fazlası: karşılaştırma büyük/küçük harfe duyarlıdır ve SQL Server'da çalışan == araması sessizce boş döner. EFCore.NamingConventions ile snake_case, text[] ve @> çevirisi, jsonb'ye eşlenen complex type ve ExecuteUpdate ile jsonb_set, PostgreSQL enum, uuid v7, xmin ile concurrency token, generated tsvector ve CREATE INDEX CONCURRENTLY'nin migration'ı transaction dışına taşıması.

14 Kas 2026 10 dk 1
Blog Haritası