[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:tr:database\u002Fpg-query-planning":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-query-planning","Pg Query Planning","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,75,78,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":73,"name":74,"count":11},"pg-mvcc-vacuum","Pg Mvcc Vacuum",{"key":76,"name":77,"count":11},"pg-operations","Pg Operations",{"key":8,"name":9,"count":11},{"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,162,176,189,202],{"id":131,"topic":9,"difficulty":132,"body":133,"options":134,"correct_key":136,"explanation":147},"019f5d67-ffb1-7727-81b8-6f27bcca0b8f",1,"Bir geliştirici bir `SELECT` sorgusuna `EXPLAIN`, sonra aynı sorguya `EXPLAIN ANALYZE` çalıştırıyor. İkisi arasındaki temel fark nedir?",[135,138,141,144],{"key":136,"text":137},"a","EXPLAIN yalnızca tahmini planı gösterir; EXPLAIN ANALYZE sorguyu gerçekten çalıştırır ve gerçek süreleri ekler",{"key":139,"text":140},"b","EXPLAIN ANALYZE aynı planı yalnızca daha okunaklı biçimlendirir; ikisi de sorguyu çalıştırmaz",{"key":142,"text":143},"c","EXPLAIN sorguyu çalıştırıp sonuç satırlarını döner, EXPLAIN ANALYZE ise yalnızca tahmini planı gösterir",{"key":145,"text":146},"d","İkisi de sorguyu aynı şekilde çalıştırır; tek fark çıktının JSON mı düz metin mi olduğudur","`EXPLAIN` planner'dan bir plan ister ve hiçbir şey çalıştırmadan maliyet\u002Fsatır tahminlerini gösterir. `EXPLAIN ANALYZE` ise ifadeyi gerçekten çalıştırır, sonra her node'a tahminlerin yanına gerçek geçen süreyi ve gerçek satır sayısını ekler; böylece tahmin ile gerçeği kıyaslayabilirsin. (b) ve (c) buna uymuyor, (d) ise EXPLAIN'in tek başına sorguyu hiç çalıştırmadığını göz ardı ediyor.",{"id":149,"topic":9,"difficulty":150,"body":151,"options":152,"correct_key":139,"explanation":161},"019f5d67-ffb2-7413-8cf9-f459e2bc4e16",2,"Bir takım arkadaşı `UPDATE orders SET status = 'paid' WHERE customer_id = 42;` sorgusunun gerçek execution planını görmek istiyor ve canlı veritabanında doğrudan `EXPLAIN ANALYZE` çalıştırıyor. Gerçekte ne olur?",[153,155,157,159],{"key":136,"text":154},"PostgreSQL ifadenin bir yazma olduğunu algılar ve sessizce salt-okunur bir tahmin planına düşürür",{"key":139,"text":156},"UPDATE gerçekten çalışır ve her zamanki gibi commit edilir; EXPLAIN ANALYZE bunu kendiliğinden geri almaz",{"key":142,"text":158},"PostgreSQL sözdizimi hatası verir, çünkü EXPLAIN ANALYZE yalnızca SELECT ifadelerini kabul eder",{"key":145,"text":160},"Satırlar EXPLAIN süresince kilitlenir ama tabloya hiçbir yazma asla uygulanmaz","`EXPLAIN ANALYZE` gerçek zamanlama ve satır sayısı toplamak için ifadeyi gerçekten çalıştırır — `UPDATE`\u002F`DELETE`\u002F`INSERT` için bu, verinin gerçekten değiştiği ve açık bir transaction yoksa hemen commit edildiği anlamına gelir. Salt-okunur değildir (a), DML için geçerli bir sözdizimidir (c), yalnızca kilitleyen bir prova da değildir (d). Bir yazmanın planını güvenle incelemek için `BEGIN; ... ROLLBACK;` içine sarmalısın.",{"id":163,"topic":9,"difficulty":164,"body":165,"options":166,"correct_key":142,"explanation":175},"019f5d67-ffb2-7e3e-b33d-37bee141a157",3,"Gerçek veri içeren bir tabloda `DELETE FROM orders WHERE status = 'cancelled';` için gerçek `EXPLAIN ANALYZE` planını görmen gerekiyor, ama o satırları kalıcı olarak kaybetmeden. Gerçek çalıştırma: DELETE'ten önce `status = 'cancelled'` olan 50000 satır vardı; `EXPLAIN ANALYZE DELETE ...` çalıştıktan hemen sonra 0 oldu; `ROLLBACK` verilince tekrar 50000'e döndü. Hangi yaklaşım kullanıldı?",[167,169,171,173],{"key":136,"text":168},"EXPLAIN ANALYZE yerine yalnızca `EXPLAIN` çalıştırmak, çünkü tek başına EXPLAIN veriye hiç dokunmaz",{"key":139,"text":170},"Önce tablonun tam yedeğini almak, DELETE'i çalıştırmak, sonra yedeği geri yüklemek",{"key":142,"text":172},"Bir transaction açıp içinde `EXPLAIN ANALYZE DELETE ...` çalıştırmak, sonra COMMIT yerine ROLLBACK vermek",{"key":145,"text":174},"DELETE'i bir read replica üzerinde çalıştırmak, çünkü replica'larda EXPLAIN ANALYZE yıkıcı olmaz","Bir `DELETE` üzerinde `EXPLAIN ANALYZE` satırları gerçekten siler; değişikliği kalıcı hale getirmeden gerçek planı incelemenin tek güvenli yolu `BEGIN; EXPLAIN ANALYZE DELETE ...; ROLLBACK;`dir — ifade transaction içinde gerçekten çalışır (böylece plan ve süreler gerçektir) ve rollback etkiyi geri alır. (a) gerçek süre\u002Factual rows hiç vermez. (b) işe yarar ama transaction'a kıyasla gereksiz ağır bir dolambaçtır. (d) yanlıştır çünkü bir read replica yazma ifadelerini kabul etmez.",{"id":177,"topic":9,"difficulty":132,"body":178,"options":179,"correct_key":145,"explanation":188},"019f5d67-ffb3-77b7-ba8f-372d34e156bd","`Seq Scan on orders  (cost=0.00..3627.00 rows=200000 width=32)` gibi bir EXPLAIN satırında `cost=0.00..3627.00` kısmı neyi ifade eder?",[180,182,184,186],{"key":136,"text":181},"Sorgunun çalışması gerçekte kaç milisaniye sürdüğünün minimum ve maksimum değeri",{"key":139,"text":183},"Bu node'un sorgunun toplam CPU süresinden yüzde kaç tükettiğinin tahmini",{"key":142,"text":185},"Bu node için okunacak ve yazılacak tahmini disk bloğu sayısı",{"key":145,"text":187},"Planner'ın başlangıç ve toplam maliyetini gösteren, süre ölçümü olmayan keyfi birimler","`cost=başlangıç..toplam`, planner'ın kendi keyfi maliyet birimleriyle (`seq_page_cost`\u002F`cpu_tuple_cost` gibi ayarlardan türetilir) ifade edilir ve yalnızca aday planları birbiriyle kıyaslamak için kullanılır. Asla milisaniye değeri (a), CPU yüzdesi (b) ya da blok okuma\u002Fyazma sayısı (c) değildir — bunlar için `EXPLAIN ANALYZE` ile `BUFFERS`\u002Fgerçek süreler gerekir.",{"id":190,"topic":9,"difficulty":150,"body":191,"options":192,"correct_key":139,"explanation":201},"019f5d67-ffb4-71a1-baca-7b6485ba3cef","`pgscratch`'ten gerçek plan:\n```\nIndex Scan using orders_pkey on orders  (cost=0.42..8.44 rows=1 width=32)\n  Index Cond: (id = 42)\n```\n`cost=0.42..8.44` içindeki `0.42` ve `8.44` sayıları sırasıyla neyi ifade eder?",[193,195,197,199],{"key":136,"text":194},"8.44 ilk satırı bulma maliyeti, 0.42 ise tüm satırları döndürme maliyetidir",{"key":139,"text":196},"0.42 ilk satıra ulaşmanın tahmini maliyeti; 8.44 ise tüm satırların tahmini maliyetidir",{"key":142,"text":198},"0.42 okunan index sayfası sayısı, 8.44 ise okunan heap sayfası sayısıdır",{"key":145,"text":200},"0.42 ANALYZE çalıştırılmadan önceki maliyet, 8.44 ise ANALYZE çalıştırıldıktan sonraki maliyettir","`cost=X..Y` her zaman `başlangıç_maliyeti..toplam_maliyet`tir: X, node ilk çıktı satırını üretebilmeden önceki tahmini maliyet; Y ise node'un TÜM çıktısını üretmesinin tahmini maliyetidir. Bu tek-satırlık `Index Cond` arama için iki sayı da doğal olarak küçüktür. (a) sırayı ters çeviriyor, (c) maliyet birimlerini sayfa sayısıyla karıştırıyor, (d) ise cost='ın taşımadığı bir ANALYZE-öncesi\u002Fsonrası anlamı uyduruyor.",{"id":203,"topic":9,"difficulty":150,"body":204,"options":205,"correct_key":136,"explanation":214},"019f5d67-ffb4-79c9-aa05-ac445db6b02f","200,000 satırlık `orders` tablosunda `SELECT * FROM orders WHERE status = 'paid';` için gerçek plan (`status` üzerinde `orders_status_idx` index'i var):\n```\nBitmap Heap Scan on orders  (cost=556.13..2802.22 rows=49527 width=32)\n  Recheck Cond: (status = 'paid'::text)\n  ->  Bitmap Index Scan on orders_status_idx  (cost=0.00..543.75 rows=49527 width=0)\n        Index Cond: (status = 'paid'::text)\n```\n`EXPLAIN ANALYZE` çalıştırmadan, `Bitmap Heap Scan` satırındaki `rows=49527` neyi ifade eder?",[206,208,210,212],{"key":136,"text":207},"Tablo istatistiklerinden planner'ın tahmini eşleşen satır sayısı — ölçülmüş bir sayı değil",{"key":139,"text":209},"Bu EXPLAIN üretildiğinde eşleşen satırların zaten ölçülmüş, kesin sayısı",{"key":142,"text":211},"WHERE koşulundan bağımsız olarak `orders` tablosundaki toplam satır sayısı",{"key":145,"text":213},"PostgreSQL'in örtük bir LIMIT uygulamadan önce döndüreceği maksimum satır sayısı","Düz `EXPLAIN` (ANALYZE'siz) sorguyu asla çalıştırmaz, bu yüzden her node'daki her `rows=` değeri — bu dahil — kolon istatistiklerinden (en-sık-değerler, histogram, vb.) türetilen saf bir planner tahminidir, ölçülmüş bir değer değildir. Gerçek, çalıştırılmış satır sayısını görmek için `EXPLAIN ANALYZE` gerekir; orada `actual rows=...` olarak görünür. (b) bunu ölçülmüş diye yanlış etiketliyor, (c) tablonun toplam satır sayısıyla (200,000) karıştırıyor, (d) ise sorguda olmayan bir LIMIT uyduruyor.",{"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":150,"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":164,"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]