[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"me":3,"catalog:en: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","Database","","pg-mvcc-vacuum","Pg Mvcc Vacuum","en",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,"Given: `CREATE TABLE t(id int, v int); INSERT INTO t VALUES (1,10); UPDATE t SET v = 20 WHERE id = 1;` What actually happens to the original row version on disk when the UPDATE runs?",[135,138,141,144],{"key":136,"text":137},"a","A new row version is inserted and the original is marked as a dead tuple.",{"key":139,"text":140},"b","The original row bytes are overwritten with the new value in place.",{"key":142,"text":143},"c","The original row is deleted immediately and its disk space is freed.",{"key":145,"text":146},"d","The change is only applied in the WAL and never in the table.","PostgreSQL's MVCC never overwrites a heap row in place. An UPDATE inserts a brand-new row version and marks the old version's xmax, turning it into a dead tuple that stays in the table until a later VACUUM reclaims its space.",{"id":149,"topic":9,"difficulty":132,"body":150,"options":151,"correct_key":139,"explanation":160},"019f5d67-ff82-7788-9c07-540e36afae2e","Real output from a fresh table right after two inserts:\n```\n xmin  | xmax | ctid  | id \n-------+------+-------+----\n 12260 |    0 | (0,1) |  1 \n 12260 |    0 | (0,2) |  2 \n```\nWhat does `xmax = 0` indicate for these rows?",[152,154,156,158],{"key":136,"text":153},"The rows were deleted but the deleting transaction has not committed yet.",{"key":139,"text":155},"The rows have never been deleted or updated by any transaction.",{"key":142,"text":157},"The rows are corrupted and need a REINDEX.",{"key":145,"text":159},"The table has no primary key defined.","`xmax` stores the id of the transaction that deleted or updated away a row version. A value of 0 means it was never set, so the row is still the current, live version — it has not been touched by any DELETE or UPDATE.",{"id":162,"topic":9,"difficulty":163,"body":164,"options":165,"correct_key":142,"explanation":174},"019f5d67-ff83-72ad-8cba-23d859608753",2,"Real, verified before\u002Fafter from the same row:\nBefore: `xmin=12260, ctid=(0,1)`. After `UPDATE accounts SET balance = balance + 50 WHERE id = 1;`: `xmin=12261, ctid=(0,3)`. Why did `ctid` change even though only the `balance` column was touched?",[166,168,170,172],{"key":136,"text":167},"ctid is a random value PostgreSQL reassigns on every SELECT for security.",{"key":139,"text":169},"ctid only changes when a column referenced by a foreign key is updated.",{"key":142,"text":171},"ctid is the row's physical address; UPDATE always writes it to a new location.",{"key":145,"text":173},"ctid is derived from the primary key value, so it changes whenever id-related columns update.","ctid is the physical (page, offset) address of a row version, not a stable logical identifier. Since UPDATE always creates a brand-new tuple rather than editing in place, that new tuple lands at a new physical location, so its ctid necessarily differs from the old one, regardless of which column changed.",{"id":176,"topic":9,"difficulty":163,"body":177,"options":178,"correct_key":145,"explanation":187},"019f5d67-ff83-7afc-856c-83bb37e597f7","In PostgreSQL, what is generally meant by \"table bloat\"?",[179,181,183,185],{"key":136,"text":180},"The extra space PostgreSQL reserves upfront when a table is created.",{"key":139,"text":182},"The compressed size difference between TOAST and inline storage.",{"key":142,"text":184},"The memory used by shared_buffers to cache a table's pages.",{"key":145,"text":186},"Disk space from dead tuples and page space VACUUM hasn't reclaimed yet.","Bloat is the accumulation of dead tuples (from UPDATEs and DELETEs) and leftover free space inside a table's pages that has not yet been reclaimed or reused, making the table's on-disk size larger than the amount of live data it holds would otherwise require.",{"id":189,"topic":9,"difficulty":163,"body":190,"options":191,"correct_key":136,"explanation":200},"019f5d67-ff84-72c3-9e60-ebb994d0ad50","What is the key practical difference between `VACUUM` and `VACUUM FULL` regarding disk usage?",[192,194,196,198],{"key":136,"text":193},"VACUUM reuses freed space inside the file; VACUUM FULL rewrites the table and shrinks the file.",{"key":139,"text":195},"VACUUM only works on indexes, while VACUUM FULL only works on the table heap.",{"key":142,"text":197},"VACUUM requires a full table rewrite while VACUUM FULL just updates statistics.",{"key":145,"text":199},"VACUUM FULL is a synonym for VACUUM; the FULL keyword only changes log verbosity.","Plain VACUUM frees dead tuples' space for reuse by future inserts\u002Fupdates within the same table file, but it typically leaves the file's size on disk unchanged. VACUUM FULL instead builds a fresh, compact copy of the table, so it can actually shrink the on-disk file and return space to the OS.",{"id":202,"topic":9,"difficulty":203,"body":204,"options":205,"correct_key":139,"explanation":214},"019f5d67-ff84-79bd-8278-1f22bdabf793",3,"You run `VACUUM FULL accounts;` on a busy production table. While it's running, another session runs a plain `SELECT * FROM accounts;`. A real `pg_locks` check during a `VACUUM FULL` on a similar table showed `mode = AccessExclusiveLock, granted = t`. What happens to the concurrent SELECT?",[206,208,210,212],{"key":136,"text":207},"The SELECT runs immediately, because VACUUM FULL only takes a lock on the table's indexes, not the heap.",{"key":139,"text":209},"The SELECT blocks and waits, since VACUUM FULL holds an ACCESS EXCLUSIVE lock.",{"key":142,"text":211},"The SELECT runs immediately using the old data, because MVCC lets readers bypass any lock held by VACUUM FULL.",{"key":145,"text":213},"The SELECT fails immediately with an error instead of waiting.","AccessExclusiveLock is the strongest lock mode in PostgreSQL and conflicts with every other lock mode, including the AccessShareLock a plain SELECT needs. So while VACUUM FULL is rewriting the table, any concurrent SELECT simply waits until the lock is released.",{"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":316,"name_en":6,"sort":317,"specializations":318},"Veritabanı",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},[398,10],"tr",[400,401],"google","github",21750,true]