[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:database\u002Fpg-mvcc-vacuum":4,"config":215},null,{"field_key":5,"field_name":6,"seniority":7,"topic_key":8,"topic_name":9,"spec_key":7,"spec_name":7,"locale":10,"cell_total":11,"field_total":12,"seniorities":13,"topics":17,"specs":115,"samples":129},"database","Veritabanı","","pg-mvcc-vacuum","Pg Mvcc Vacuum","tr",75,2475,[14,15,16],"junior","mid","senior",[18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,73,76,79,82,85,88,91,94,97,100,103,106,109,112],{"key":19,"name":20,"count":11},"backup-recovery","Backup Recovery",{"key":22,"name":23,"count":11},"data-modeling","Data Modeling",{"key":25,"name":26,"count":11},"indexing","Indexing",{"key":28,"name":29,"count":11},"mongodb-aggregation","Mongodb Aggregation",{"key":31,"name":32,"count":11},"mongodb-indexes-queries","Mongodb Indexes Queries",{"key":34,"name":35,"count":11},"mongodb-operations","Mongodb Operations",{"key":37,"name":38,"count":11},"mongodb-replication-sharding","Mongodb Replication Sharding",{"key":40,"name":41,"count":11},"mongodb-schema-modeling","Mongodb Schema Modeling",{"key":43,"name":44,"count":11},"mongodb-transactions-consistency","Mongodb Transactions Consistency",{"key":46,"name":47,"count":11},"mysql-indexes","Mysql Indexes",{"key":49,"name":50,"count":11},"mysql-innodb-transactions","Mysql Innodb Transactions",{"key":52,"name":53,"count":11},"mysql-operations","Mysql Operations",{"key":55,"name":56,"count":11},"mysql-query-optimization","Mysql Query Optimization",{"key":58,"name":59,"count":11},"mysql-replication-scaling","Mysql Replication Scaling",{"key":61,"name":62,"count":11},"mysql-types-constraints","Mysql Types Constraints",{"key":64,"name":65,"count":11},"nosql-models","Nosql Models",{"key":67,"name":68,"count":11},"performance-tuning","Performance Tuning",{"key":70,"name":71,"count":11},"pg-indexes","Pg Indexes",{"key":8,"name":9,"count":11},{"key":74,"name":75,"count":11},"pg-operations","Pg Operations",{"key":77,"name":78,"count":11},"pg-query-planning","Pg Query Planning",{"key":80,"name":81,"count":11},"pg-transactions-locking","Pg Transactions Locking",{"key":83,"name":84,"count":11},"pg-types-constraints","Pg Types Constraints",{"key":86,"name":87,"count":11},"query-optimization","Query Optimization",{"key":89,"name":90,"count":11},"redis-cluster-sharding","Redis Cluster Sharding",{"key":92,"name":93,"count":11},"redis-data-structures","Redis Data Structures",{"key":95,"name":96,"count":11},"redis-expiration-eviction","Redis Expiration Eviction",{"key":98,"name":99,"count":11},"redis-persistence","Redis Persistence",{"key":101,"name":102,"count":11},"redis-replication-sentinel","Redis Replication Sentinel",{"key":104,"name":105,"count":11},"redis-transactions-scripting","Redis Transactions Scripting",{"key":107,"name":108,"count":11},"replication-scaling","Replication Scaling",{"key":110,"name":111,"count":11},"security-access","Security Access",{"key":113,"name":114,"count":11},"transactions-isolation","Transactions Isolation",[116,120,123,126],{"key":117,"name":118,"count":119},"mongodb","MongoDB",450,{"key":121,"name":122,"count":119},"mysql","MySQL",{"key":124,"name":125,"count":119},"postgresql","PostgreSQL",{"key":127,"name":128,"count":119},"redis","Redis",[130,148,161,175,188,201],{"id":131,"topic":9,"difficulty":132,"body":133,"options":134,"correct_key":136,"explanation":147},"019f5d67-ff81-7d17-8689-cec68e26be19",1,"Verilen: `CREATE TABLE t(id int, v int); INSERT INTO t VALUES (1,10); UPDATE t SET v = 20 WHERE id = 1;` UPDATE çalıştığında disk üzerindeki orijinal satır sürümüne gerçekte ne olur?",[135,138,141,144],{"key":136,"text":137},"a","Yeni bir satır sürümü eklenir ve orijinal satır ölü tuple olarak işaretlenir.",{"key":139,"text":140},"b","Orijinal satırın baytları yeni değerle yerinde üzerine yazılır.",{"key":142,"text":143},"c","Orijinal satır hemen silinir ve disk alanı serbest bırakılır.",{"key":145,"text":146},"d","Değişiklik yalnızca WAL'a uygulanır, tabloya hiç yazılmaz.","PostgreSQL'in MVCC modeli heap satırının yerinde üzerine yazılmasına asla izin vermez. UPDATE tamamen yeni bir satır sürümü ekler ve eski sürümün xmax'ını işaretleyerek onu, sonraki bir VACUUM alanını geri kazanana kadar tabloda kalan bir ölü tuple'a çevirir.",{"id":149,"topic":9,"difficulty":132,"body":150,"options":151,"correct_key":139,"explanation":160},"019f5d67-ff82-7788-9c07-540e36afae2e","İki INSERT'ten hemen sonra taze bir tablodan alınan gerçek çıktı:\n```\n xmin  | xmax | ctid  | id \n-------+------+-------+----\n 12260 |    0 | (0,1) |  1 \n 12260 |    0 | (0,2) |  2 \n```\nBu satırlar için `xmax = 0` olması neyi gösterir?",[152,154,156,158],{"key":136,"text":153},"Satırlar silindi ama silen transaction henüz commit olmadı.",{"key":139,"text":155},"Satırlar hiçbir transaction tarafından silinmemiş veya güncellenmemiş.",{"key":142,"text":157},"Satırlar bozulmuş ve REINDEX gerektiriyor.",{"key":145,"text":159},"Tabloda primary key tanımlı değil.","`xmax`, bir satır sürümünü silen ya da güncelleyerek geçersiz kılan transaction'ın id'sini tutar. 0 değeri hiç ayarlanmadığı anlamına gelir; yani satır hâlâ güncel ve canlı sürümdür — herhangi bir DELETE veya UPDATE tarafından dokunulmamıştır.",{"id":162,"topic":9,"difficulty":163,"body":164,"options":165,"correct_key":142,"explanation":174},"019f5d67-ff83-72ad-8cba-23d859608753",2,"Aynı satırdan gerçek, doğrulanmış önce\u002Fsonra durumu:\nÖnce: `xmin=12260, ctid=(0,1)`. `UPDATE accounts SET balance = balance + 50 WHERE id = 1;` sonrası: `xmin=12261, ctid=(0,3)`. Sadece `balance` sütunu değiştiği hâlde `ctid` neden değişti?",[166,168,170,172],{"key":136,"text":167},"ctid, PostgreSQL'in güvenlik için her SELECT'te yeniden atadığı rastgele bir değerdir.",{"key":139,"text":169},"ctid yalnızca bir foreign key'in referans verdiği sütun güncellendiğinde değişir.",{"key":142,"text":171},"ctid satırın fiziksel adresidir; UPDATE onu her zaman yeni bir konuma yazar.",{"key":145,"text":173},"ctid primary key değerinden türetilir, bu yüzden id ile ilgili sütunlar güncellenince değişir.","ctid, bir satır sürümünün fiziksel (sayfa, offset) adresidir; kararlı bir mantıksal tanımlayıcı değildir. UPDATE yerinde düzenleme yapmak yerine her zaman tamamen yeni bir tuple oluşturduğu için, bu yeni tuple yeni bir fiziksel konuma yerleşir; dolayısıyla hangi sütun değişmiş olursa olsun ctid eskisinden farklı olmak zorundadır.",{"id":176,"topic":9,"difficulty":163,"body":177,"options":178,"correct_key":145,"explanation":187},"019f5d67-ff83-7afc-856c-83bb37e597f7","PostgreSQL'de genel olarak \"tablo bloat'ı (şişmesi)\" ne anlama gelir?",[179,181,183,185],{"key":136,"text":180},"PostgreSQL'in tablo oluşturulurken önceden ayırdığı ekstra alan.",{"key":139,"text":182},"TOAST ile satır-içi (inline) depolama arasındaki sıkıştırılmış boyut farkı.",{"key":142,"text":184},"shared_buffers'ın bir tablonun sayfalarını önbelleklemek için kullandığı bellek.",{"key":145,"text":186},"VACUUM'un henüz geri kazanmadığı ölü tuple ve sayfa alanının kapladığı disk alanı.","Bloat, UPDATE ve DELETE'lerden kaynaklanan ölü tuple'ların ve tablonun sayfaları içinde henüz geri kazanılmamış\u002Fyeniden kullanılmamış boş alanın birikmesidir; bu da tablonun disk üzerindeki boyutunu, içerdiği canlı verinin normalde gerektireceğinden daha büyük hâle getirir.",{"id":189,"topic":9,"difficulty":163,"body":190,"options":191,"correct_key":136,"explanation":200},"019f5d67-ff84-72c3-9e60-ebb994d0ad50","`VACUUM` ile `VACUUM FULL` arasında disk kullanımı açısından temel pratik fark nedir?",[192,194,196,198],{"key":136,"text":193},"VACUUM, boşalan alanı dosya içinde yeniden kullanır; VACUUM FULL tabloyu yeniden yazıp dosyayı küçültür.",{"key":139,"text":195},"VACUUM yalnızca index'ler üzerinde çalışır, VACUUM FULL ise yalnızca tablo heap'i üzerinde çalışır.",{"key":142,"text":197},"VACUUM tablonun tamamen yeniden yazılmasını gerektirir, VACUUM FULL ise yalnızca istatistikleri günceller.",{"key":145,"text":199},"VACUUM FULL, VACUUM'un eş anlamlısıdır; FULL anahtar kelimesi yalnızca log ayrıntı düzeyini değiştirir.","Düz VACUUM, ölü tuple'ların alanını aynı tablo dosyası içinde gelecekteki insert\u002Fupdate'ler tarafından yeniden kullanılabilir hâle getirir ama genelde dosyanın disk üzerindeki boyutunu değiştirmez. VACUUM FULL ise tablonun yeni, derli toplu bir kopyasını oluşturur; bu sayede disk üzerindeki dosyayı gerçekten küçültüp alanı OS'a iade edebilir.",{"id":202,"topic":9,"difficulty":203,"body":204,"options":205,"correct_key":139,"explanation":214},"019f5d67-ff84-79bd-8278-1f22bdabf793",3,"Yoğun bir production tablosunda `VACUUM FULL accounts;` çalıştırıyorsun. O çalışırken başka bir session düz bir `SELECT * FROM accounts;` çalıştırıyor. Benzer bir tabloda `VACUUM FULL` sırasında yapılan gerçek bir `pg_locks` kontrolü `mode = AccessExclusiveLock, granted = t` gösterdi. Eş zamanlı SELECT'e ne olur?",[206,208,210,212],{"key":136,"text":207},"SELECT hemen çalışır, çünkü VACUUM FULL yalnızca tablonun index'leri üzerinde kilit alır, heap üzerinde değil.",{"key":139,"text":209},"SELECT bloklanır ve bekler, çünkü VACUUM FULL bir ACCESS EXCLUSIVE kilit tutar.",{"key":142,"text":211},"SELECT eski veriyi kullanarak hemen çalışır, çünkü MVCC okuyucuların VACUUM FULL'un tuttuğu kilidi atlamasına izin verir.",{"key":145,"text":213},"SELECT beklemek yerine hemen bir hatayla başarısız olur.","AccessExclusiveLock, PostgreSQL'deki en güçlü kilit modudur ve düz bir SELECT'in ihtiyaç duyduğu AccessShareLock dahil diğer tüm kilit modlarıyla çakışır. Bu yüzden VACUUM FULL tabloyu yeniden yazarken, eş zamanlı herhangi bir SELECT kilit serbest kalana kadar bekler.",{"fields":216,"seniorities":391,"interview_shapes":392,"locales":397,"oauth":399,"question_count":402,"coach_enabled":403,"jd_match_enabled":403},[217,242,262,278,302,315,324,343,365,372,378,385],{"key":218,"name_tr":219,"name_en":219,"sort":132,"specializations":220},"backend","Backend",[221,224,227,230,233,236,239],{"key":222,"name":223,"field":218},"general","Genel",{"key":225,"name":226,"field":218},"go","Go",{"key":228,"name":229,"field":218},"python","Python",{"key":231,"name":232,"field":218},"java","Java",{"key":234,"name":235,"field":218},"csharp","C#\u002F.NET",{"key":237,"name":238,"field":218},"nodejs","Node.js",{"key":240,"name":241,"field":218},"php","PHP",{"key":243,"name_tr":244,"name_en":244,"sort":163,"specializations":245},"frontend","Frontend",[246,247,250,253,256,259],{"key":222,"name":223,"field":243},{"key":248,"name":249,"field":243},"javascript","JavaScript",{"key":251,"name":252,"field":243},"typescript","TypeScript",{"key":254,"name":255,"field":243},"react","React",{"key":257,"name":258,"field":243},"vue","Vue",{"key":260,"name":261,"field":243},"angular","Angular",{"key":263,"name_tr":264,"name_en":264,"sort":203,"specializations":265},"fullstack","Fullstack",[266,267,268,269,270,271,272,273,274,275,276,277],{"key":222,"name":223,"field":263},{"key":225,"name":226,"field":218},{"key":228,"name":229,"field":218},{"key":231,"name":232,"field":218},{"key":234,"name":235,"field":218},{"key":237,"name":238,"field":218},{"key":240,"name":241,"field":218},{"key":248,"name":249,"field":243},{"key":251,"name":252,"field":243},{"key":254,"name":255,"field":243},{"key":257,"name":258,"field":243},{"key":260,"name":261,"field":243},{"key":279,"name_tr":280,"name_en":280,"sort":281,"specializations":282},"devops-cloud","DevOps \u002F Cloud",4,[283,284,287,290,293,296,299],{"key":222,"name":223,"field":279},{"key":285,"name":286,"field":279},"aws","AWS",{"key":288,"name":289,"field":279},"gcp","GCP",{"key":291,"name":292,"field":279},"azure","Azure",{"key":294,"name":295,"field":279},"kubernetes","Kubernetes",{"key":297,"name":298,"field":279},"terraform","Terraform",{"key":300,"name":301,"field":279},"linux","Linux",{"key":303,"name_tr":304,"name_en":304,"sort":305,"specializations":306},"ai-engineer","AI Engineer",5,[307,308,309,312],{"key":222,"name":223,"field":303},{"key":228,"name":229,"field":303},{"key":310,"name":311,"field":303},"llm-rag","LLM\u002FRAG",{"key":313,"name":314,"field":303},"mlops","MLOps",{"key":5,"name_tr":6,"name_en":316,"sort":317,"specializations":318},"Database",6,[319,320,321,322,323],{"key":222,"name":223,"field":5},{"key":124,"name":125,"field":5},{"key":121,"name":122,"field":5},{"key":117,"name":118,"field":5},{"key":127,"name":128,"field":5},{"key":325,"name_tr":326,"name_en":327,"sort":328,"specializations":329},"mobile","Mobil","Mobile",7,[330,331,334,337,340],{"key":222,"name":223,"field":325},{"key":332,"name":333,"field":325},"ios-swift","iOS (Swift)",{"key":335,"name":336,"field":325},"android-kotlin","Android (Kotlin)",{"key":338,"name":339,"field":325},"flutter","Flutter",{"key":341,"name":342,"field":325},"react-native","React Native",{"key":344,"name_tr":345,"name_en":346,"sort":347,"specializations":348},"security","Güvenlik","Security",8,[349,350,353,356,359,362],{"key":222,"name":223,"field":344},{"key":351,"name":352,"field":344},"appsec","AppSec",{"key":354,"name":355,"field":344},"offensive-pentest","Offensive \u002F Pentest",{"key":357,"name":358,"field":344},"cloud-security","Cloud Security",{"key":360,"name":361,"field":344},"devsecops","DevSecOps",{"key":363,"name":364,"field":344},"blue-team-incident","Blue Team \u002F Incident",{"key":366,"name_tr":367,"name_en":368,"sort":369,"specializations":370},"qa-test-automation","QA \u002F Test Otomasyonu","QA \u002F Test Automation",9,[371],{"key":222,"name":223,"field":366},{"key":373,"name_tr":374,"name_en":374,"sort":375,"specializations":376},"data-engineer","Data Engineer",10,[377],{"key":222,"name":223,"field":373},{"key":379,"name_tr":380,"name_en":381,"sort":382,"specializations":383},"game-dev","Oyun Geliştirme","Game Development",11,[384],{"key":222,"name":223,"field":379},{"key":386,"name_tr":387,"name_en":387,"sort":388,"specializations":389},"ml-engineer","ML Engineer",12,[390],{"key":222,"name":223,"field":386},[14,15,16],{"junior":393,"mid":395,"senior":396},{"questions":394,"median_sec":3},20,{"questions":394,"median_sec":3},{"questions":394,"median_sec":3},[10,398],"en",[400,401],"google","github",21750,true]