[{"data":1,"prerenderedAt":2420},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-database-postgresql-gioi-thieu-cai-dat":420,"-tu-hoc-database-postgresql-gioi-thieu-cai-dat-surround":2415},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":2408,"extension":2409,"links":2410,"meta":2411,"navigation":2412,"path":204,"seo":2413,"stem":205,"__hash__":2414},"docs\u002F2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat.md","Giới thiệu và Cài đặt PostgreSQL 19",{"type":424,"value":425,"toc":2380},"minimark",[426,431,448,453,618,622,683,687,763,767,774,840,844,855,933,945,949,953,1117,1135,1139,1143,1228,1232,1251,1255,1334,1338,1400,1404,1558,1574,1578,1647,1671,1731,1735,1739,1840,1844,1967,1971,1979,1991,1994,2003,2007,2056,2078,2082,2136,2150,2162,2166,2295,2299,2369,2376],[427,428,430],"h2",{"id":429},"_1-postgresql-19-bản-mới-nhất-2026","1. PostgreSQL 19 — bản mới nhất (2026)",[432,433,434,435,439,440,443,444,447],"p",{},"PostgreSQL 19 Beta 1 phát hành ",[436,437,438],"strong",{},"04\u002F06\u002F2026"," — đây là bản ",[436,441,442],{},"landmark release",", đánh dấu bước tiến lớn về SQL tiêu chuẩn với khả năng ",[436,445,446],{},"truy vấn đồ thị native"," theo chuẩn SQL:2023. Bên cạnh đó, PG 19 mang đến hàng loạt cải tiến về atomic operations, temporal data, developer experience, và performance.",[449,450,452],"h3",{"id":451},"tính-năng-mới-trong-postgresql-19","Tính năng mới trong PostgreSQL 19",[454,455,456,470,495,507,523,547,567,588,601],"card-group",{},[457,458,461,462,465,466,469],"card",{"icon":459,"title":460},"i-lucide-git-graph","SQL\u002FPGQ — Property Graph Query","Truy vấn đồ thị (property graph) theo chuẩn ",[436,463,464],{},"SQL:2023",". Định nghĩa graph view trên bảng có sẵn, dùng cú pháp ",[436,467,468],{},"MATCH"," pattern matching để truy vấn. Không cần storage engine mới — graph query hoạt động ngay trên relational data hiện có. Mở ra khả năng xử lý bài toán recommendation, fraud detection, network analysis ngay trong Postgres mà không cần Neo4j hay TigerGraph.",[457,471,473,474,478,479,482,483,486,487,490,491,494],{"icon":186,"title":472},"ON CONFLICT DO SELECT","Hành động thứ 3 sau ",[475,476,477],"code",{},"DO NOTHING"," và ",[475,480,481],{},"DO UPDATE",". Atomic ",[436,484,485],{},"get-or-create",": nếu row tồn tại thì trả về nguyên bản, nếu không thì insert và trả về. ",[436,488,489],{},"Nhanh hơn 4x"," so với ",[475,492,493],{},"DO UPDATE SET id=id ... RETURNING *"," workaround vì không tạo dead tuple, không cần HOT cleanup. Pattern cực kỳ phổ biến trong API idempotency và upsert logic.",[457,496,499,502,503,506],{"icon":497,"title":498},"i-lucide-clock","FOR PORTION OF — Temporal Data",[475,500,501],{},"UPDATE\u002FDELETE FOR PORTION OF"," cho phép thao tác dữ liệu trong ",[436,504,505],{},"khoảng thời gian chỉ định"," trên temporal table. Hệ thống tự động split row tại biên thời gian — ví dụ: cập nhật lương nhân viên chỉ trong Q2\u002F2026 mà không ảnh hưởng các khoảng thời gian khác. Chuẩn SQL:2011, nền tảng cho hệ thống lưu trữ lịch sử dữ liệu doanh nghiệp.",[457,508,511,512,515,516,519,520,522],{"icon":509,"title":510},"i-lucide-layers","GROUP BY ALL","Tự động ",[475,513,514],{},"GROUP BY"," tất cả cột không phải aggregate trong ",[475,517,518],{},"SELECT",". Thay vì phải liệt kê thủ công từng cột, chỉ cần viết ",[475,521,510],{}," — code gọn hơn, tránh lỗi thiếu cột khi thêm\u002Fsửa SELECT list. Đặc biệt hữu ích trong BI query có nhiều dimension column.",[457,524,526,529,530,529,533,529,536,529,539,542,543,546],{"icon":348,"title":525},"IGNORE NULLS — Window Functions",[475,527,528],{},"lead()",", ",[475,531,532],{},"lag()",[475,534,535],{},"first_value()",[475,537,538],{},"last_value()",[475,540,541],{},"nth_value()"," giờ hỗ trợ ",[436,544,545],{},"IGNORE NULLS"," — bỏ qua giá trị NULL khi duyệt window frame. Ví dụ: lấy ngày giao dịch gần nhất không NULL trong chuỗi thời gian, hay điền giá trị missing từ dòng trước\u002Fsau. Không cần subquery phức tạp để lọc NULL.",[457,548,551,554,555,558,559,562,563,566],{"icon":549,"title":550},"i-lucide-file-json","JSON COPY TO",[475,552,553],{},"COPY TO"," hỗ trợ xuất ",[436,556,557],{},"NDJSON"," (newline-delimited JSON) native. Tùy chọn ",[475,560,561],{},"FORCE_ARRAY"," để xuất JSON array thay vì từng dòng riêng lẻ. Export dữ liệu dạng JSON trực tiếp từ Postgres mà không cần ",[475,564,565],{},"json_agg()"," hay tool ETL bên ngoài — lý tưởng cho data pipeline và API feed.",[457,568,571,572,575,576,579,580,583,584,587],{"icon":569,"title":570},"i-lucide-package","REPACK — VACUUM FULL + CLUSTER","Kết hợp ",[475,573,574],{},"VACUUM FULL"," (thu hồi disk space) và ",[475,577,578],{},"CLUSTER"," (sắp xếp vật lý theo index) trong ",[436,581,582],{},"một lệnh duy nhất",". Chế độ ",[436,585,586],{},"CONCURRENTLY"," cho phép chạy online — không khóa bảng, không downtime. Giải pháp toàn diện cho bảng bị bloat nặng mà vẫn phục vụ traffic.",[457,589,592,593,596,597,600],{"icon":590,"title":591},"i-lucide-hard-drive","Parallel Autovacuum","Autovacuum có thể dùng ",[436,594,595],{},"nhiều worker"," để vacuum index đồng thời trên các bảng nhiều index. Trước đây vacuum index là single-threaded, dễ thành bottleneck trên bảng có 10+ index với write-heavy workload. Default: bật sẵn ",[475,598,599],{},"vacuum_uses_parallel_indexes",".",[457,602,605,606,609,610,613,614,617],{"icon":603,"title":604},"i-lucide-lightbulb","pg_plan_advice — Official Plan Hints","Contrib module chính thức cho ",[436,607,608],{},"query plan hints",". Cho phép tạo advice từ execution plan tốt và ",[436,611,612],{},"lock plan"," để đảm bảo query plan ổn định qua các lần upgrade\u002Fstatistics change. Thay thế extension ",[475,615,616],{},"pg_hint_plan"," — giờ đã có giải pháp chính chủ, được maintain cùng core.",[449,619,621],{"id":620},"những-cải-tiến-khác-trong-pg-19","Những cải tiến khác trong PG 19",[623,624,625,632,638,648,664,673],"ul",{},[626,627,628,631],"li",{},[436,629,630],{},"Online Data Checksums",": Bật\u002Ftắt data checksums trên cluster đang chạy — không cần restart, không cần pg_checksums offline.",[626,633,634,637],{},[436,635,636],{},"64-bit MultiXactOffset",": Loại bỏ giới hạn wraparound 4 tỷ member — hệ thống có transaction rate cực cao không còn lo MultiXactID exhaustion.",[626,639,640,643,644,647],{},[436,641,642],{},"Memoize estimates trong EXPLAIN",": ",[475,645,646],{},"EXPLAIN ANALYZE"," hiển thị ước lượng cache hit % cho Memoize node — dễ đánh giá hiệu quả cache parameterized query.",[626,649,650,653,654,529,657,529,660,663],{},[436,651,652],{},"pg_get_*_ddl() functions",": API chính thức để trích xuất DDL — ",[475,655,656],{},"pg_get_table_ddl()",[475,658,659],{},"pg_get_index_ddl()",[475,661,662],{},"pg_get_function_ddl()",", v.v.",[626,665,666,643,669,672],{},[436,667,668],{},"pg_dumpall non-text formats",[475,670,671],{},"pg_dumpall"," hỗ trợ custom, directory, tar format — backup toàn cluster nhanh và gọn hơn.",[626,674,675,678,679,682],{},[436,676,677],{},"Logical Replication cải tiến",": Đồng bộ sequence, ",[475,680,681],{},"EXCEPT TABLE"," trong publication, dynamic WAL level.",[449,684,686],{"id":685},"breaking-changes-lưu-ý-khi-nâng-cấp-lên-postgresql-19","Breaking changes — Lưu ý khi nâng cấp lên PostgreSQL 19",[688,689,692,697],"callout",{"color":690,"icon":691},"warning","i-lucide-alert-triangle",[432,693,694],{},[436,695,696],{},"Những thay đổi có thể ảnh hưởng khi upgrade từ PG 18 (hoặc cũ hơn):",[623,698,699,709,719,725,738,747,753],{},[626,700,701,704,705,708],{},[436,702,703],{},"JIT tắt mặc định"," (",[475,706,707],{},"jit = off",") — giảm overhead compilation cho OLTP. Nếu bạn dùng JIT cho analytical query phức tạp, cần enable lại thủ công.",[626,710,711,714,715,718],{},[436,712,713],{},"LZ4 TOAST compression mặc định"," thay pglz — ",[475,716,717],{},"default_toast_compression = lz4",". Nén nhanh hơn, ít CPU hơn. Cột TOAST cũ (pglz) vẫn đọc được bình thường, không cần migrate.",[626,720,721,724],{},[436,722,723],{},"RADIUS authentication bị loại bỏ"," — nếu đang dùng RADIUS, phải chuyển sang LDAP hoặc OAuth trước khi upgrade.",[626,726,727,730,731,734,735,737],{},[436,728,729],{},"standard_conforming_strings bắt buộc = on"," — ",[475,732,733],{},"\\t"," trong string literal là ký tự tab, không còn là ",[475,736,733],{}," text. Backslash trong string literal luôn là escape character.",[626,739,740,743,744,600],{},[436,741,742],{},"MD5 deprecated"," (warning, không error) — chuyển hẳn ",[475,745,746],{},"password_encryption = scram-sha-256",[626,748,749,752],{},[436,750,751],{},"max_locks_per_transaction tăng gấp đôi"," (64→128) — shared memory tăng tương ứng. Nếu đang chạy instance nhỏ (dưới 2GB shared_buffers), kiểm tra lại tổng memory.",[626,754,755,758,759,762],{},[436,756,757],{},"log_lock_waits bật mặc định"," — log tự động khi transaction chờ lock quá ",[475,760,761],{},"deadlock_timeout"," (thường 1s). Có thể gây nhiễu log nếu app thường xuyên chờ lock ngắn.",[449,764,766],{"id":765},"postgresql-18-nền-tảng-hiện-tại-092025","PostgreSQL 18 — nền tảng hiện tại (09\u002F2025)",[432,768,769,770,773],{},"PostgreSQL 18 phát hành ",[436,771,772],{},"25\u002F09\u002F2025"," vẫn là bản stable được dùng rộng rãi nhất. Những cải tiến cốt lõi từ PG 18 tạo nền tảng cho PG 19:",[454,775,776,788,801,813,828,833],{},[457,777,779,780,783,784,787],{"icon":191,"title":778},"Async I\u002FO subsystem","Subsystem AIO mới — đọc storage ",[436,781,782],{},"nhanh tới 3x",". Cải thiện sequential scan, bitmap heap scan, VACUUM, các operation IO-heavy. PG 19 kế thừa và mở rộng thêm ",[475,785,786],{},"io_method"," parameter.",[457,789,792,793,796,797,800],{"icon":790,"title":791},"i-lucide-fingerprint","uuidv7()","Function built-in sinh UUID ",[436,794,795],{},"theo timestamp"," — giải pháp tuyệt vời cho ID có sort được theo thời gian. Thay thế ",[475,798,799],{},"uuid_generate_v4()"," khi cần primary key time-ordered.",[457,802,805,806,809,810,600],{"icon":803,"title":804},"i-lucide-table-2","Virtual generated columns","Generated column tính khi đọc (không lưu vật lý) — giờ là ",[436,807,808],{},"default",". Tiết kiệm storage cho cột derived. Ví dụ: ",[475,811,812],{},"amount_with_tax NUMERIC GENERATED ALWAYS AS (amount * 1.1) VIRTUAL",[457,814,817,820,821,478,824,827],{"icon":815,"title":816},"i-lucide-arrow-up-down","OLD\u002FNEW trong RETURNING",[475,818,819],{},"INSERT\u002FUPDATE\u002FDELETE\u002FMERGE"," returning được cả ",[436,822,823],{},"OLD",[436,825,826],{},"NEW"," — audit log dễ hơn rất nhiều, không cần trigger để bắt giá trị trước\u002Fsau.",[457,829,832],{"icon":830,"title":831},"i-lucide-fast-forward","B-tree Skip Scan","Multicolumn B-tree index dùng được cho query không có cột đầu tiên — optimizer có thể skip-scan thay vì sequential scan. Giảm số lượng index cần tạo.",[457,834,836,837,600],{"icon":263,"title":835},"OAuth authentication","Native OAuth — login bằng Google, GitHub, Azure AD, custom OIDC provider mà không cần extension bên thứ ba. Tích hợp trực tiếp vào ",[475,838,839],{},"pg_hba.conf",[449,841,843],{"id":842},"version-policy","Version policy",[432,845,846,847,850,851,854],{},"Postgres release ",[436,848,849],{},"major version"," mỗi năm (tháng 9). Support ",[436,852,853],{},"5 năm"," mỗi version.",[856,857,858,874],"table",{},[859,860,861],"thead",{},[862,863,864,868,871],"tr",{},[865,866,867],"th",{},"Version",[865,869,870],{},"Release",[865,872,873],{},"EOL",[875,876,877,889,900,911,922],"tbody",{},[862,878,879,883,886],{},[880,881,882],"td",{},"19",[880,884,885],{},"09\u002F2026 (dự kiến)",[880,887,888],{},"11\u002F2031",[862,890,891,894,897],{},[880,892,893],{},"18",[880,895,896],{},"09\u002F2025",[880,898,899],{},"11\u002F2030",[862,901,902,905,908],{},[880,903,904],{},"17",[880,906,907],{},"09\u002F2024",[880,909,910],{},"11\u002F2029",[862,912,913,916,919],{},[880,914,915],{},"16",[880,917,918],{},"09\u002F2023",[880,920,921],{},"11\u002F2028",[862,923,924,927,930],{},[880,925,926],{},"15",[880,928,929],{},"10\u002F2022",[880,931,932],{},"11\u002F2027",[688,934,937,940,941,944],{"color":935,"icon":936},"primary","i-lucide-info",[436,938,939],{},"Học\u002Fdev:"," PG 19 là tương lai — học ngay các feature mới như SQL\u002FPGQ, ON CONFLICT DO SELECT, GROUP BY ALL. ",[436,942,943],{},"Production:"," PG 18 (stable, battle-tested). Nếu công ty đang dùng bản cũ (15\u002F16\u002F17), 90% kiến thức SQL, indexing, transaction như nhau — chỉ thiếu feature mới.",[427,946,948],{"id":947},"_2-cài-đặt-3-cách","2. Cài đặt — 3 cách",[449,950,952],{"id":951},"cách-1-khuyên-dùng-docker","Cách 1 (khuyên dùng) — Docker",[954,955,960],"pre",{"className":956,"code":957,"language":958,"meta":959,"style":959},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# PostgreSQL 19 (mới nhất, đang Beta)\ndocker run --name pg19 \\\n  -e POSTGRES_PASSWORD=mysecretpw \\\n  -e POSTGRES_DB=learnpg \\\n  -p 5432:5432 \\\n  -v pgdata19:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata \\\n  -d postgres:19-beta1\n\n# PostgreSQL 18 (stable cho production)\ndocker run --name pg18 \\\n  -e POSTGRES_PASSWORD=mysecretpw \\\n  -e POSTGRES_DB=learnpg \\\n  -p 5433:5432 \\\n  -v pgdata18:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata \\\n  -d postgres:18-alpine\n","bash","",[475,961,962,971,992,1003,1013,1024,1035,1044,1051,1057,1071,1080,1089,1099,1109],{"__ignoreMap":959},[963,964,967],"span",{"class":965,"line":966},"line",1,[963,968,970],{"class":969},"sHwdD","# PostgreSQL 19 (mới nhất, đang Beta)\n",[963,972,974,978,982,985,988],{"class":965,"line":973},2,[963,975,977],{"class":976},"sBMFI","docker",[963,979,981],{"class":980},"sfazB"," run",[963,983,984],{"class":980}," --name",[963,986,987],{"class":980}," pg19",[963,989,991],{"class":990},"sTEyZ"," \\\n",[963,993,995,998,1001],{"class":965,"line":994},3,[963,996,997],{"class":980},"  -e",[963,999,1000],{"class":980}," POSTGRES_PASSWORD=mysecretpw",[963,1002,991],{"class":990},[963,1004,1006,1008,1011],{"class":965,"line":1005},4,[963,1007,997],{"class":980},[963,1009,1010],{"class":980}," POSTGRES_DB=learnpg",[963,1012,991],{"class":990},[963,1014,1016,1019,1022],{"class":965,"line":1015},5,[963,1017,1018],{"class":980},"  -p",[963,1020,1021],{"class":980}," 5432:5432",[963,1023,991],{"class":990},[963,1025,1027,1030,1033],{"class":965,"line":1026},6,[963,1028,1029],{"class":980},"  -v",[963,1031,1032],{"class":980}," pgdata19:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata",[963,1034,991],{"class":990},[963,1036,1038,1041],{"class":965,"line":1037},7,[963,1039,1040],{"class":980},"  -d",[963,1042,1043],{"class":980}," postgres:19-beta1\n",[963,1045,1047],{"class":965,"line":1046},8,[963,1048,1050],{"emptyLinePlaceholder":1049},true,"\n",[963,1052,1054],{"class":965,"line":1053},9,[963,1055,1056],{"class":969},"# PostgreSQL 18 (stable cho production)\n",[963,1058,1060,1062,1064,1066,1069],{"class":965,"line":1059},10,[963,1061,977],{"class":976},[963,1063,981],{"class":980},[963,1065,984],{"class":980},[963,1067,1068],{"class":980}," pg18",[963,1070,991],{"class":990},[963,1072,1074,1076,1078],{"class":965,"line":1073},11,[963,1075,997],{"class":980},[963,1077,1000],{"class":980},[963,1079,991],{"class":990},[963,1081,1083,1085,1087],{"class":965,"line":1082},12,[963,1084,997],{"class":980},[963,1086,1010],{"class":980},[963,1088,991],{"class":990},[963,1090,1092,1094,1097],{"class":965,"line":1091},13,[963,1093,1018],{"class":980},[963,1095,1096],{"class":980}," 5433:5432",[963,1098,991],{"class":990},[963,1100,1102,1104,1107],{"class":965,"line":1101},14,[963,1103,1029],{"class":980},[963,1105,1106],{"class":980}," pgdata18:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata",[963,1108,991],{"class":990},[963,1110,1112,1114],{"class":965,"line":1111},15,[963,1113,1040],{"class":980},[963,1115,1116],{"class":980}," postgres:18-alpine\n",[432,1118,1119,1120,1123,1124,1127,1128,1131,1132,600],{},"Kết nối: ",[475,1121,1122],{},"localhost:5432"," (PG 19) hoặc ",[475,1125,1126],{},"localhost:5433"," (PG 18), user ",[475,1129,1130],{},"postgres",", password ",[475,1133,1134],{},"mysecretpw",[688,1136,1138],{"color":1137,"icon":936},"info","Nếu đang học, khuyên dùng PG 19 Beta để làm quen feature mới. Nếu làm project thực tế, dùng PG 18 stable. PG 19 GA dự kiến tháng 9\u002F2026.",[449,1140,1142],{"id":1141},"cách-2-native-install","Cách 2 — Native install",[623,1144,1145,1159,1172],{},[626,1146,1147,1150,1151,1158],{},[436,1148,1149],{},"Windows",": tải từ ",[1152,1153,1157],"a",{"href":1154,"rel":1155},"https:\u002F\u002Fwww.enterprisedb.com\u002Fdownloads\u002Fpostgres-postgresql-downloads",[1156],"nofollow","enterprisedb.com\u002Fdownloads\u002Fpostgres-postgresql-downloads",", installer kèm pgAdmin.",[626,1160,1161,643,1164,1167,1168,1171],{},[436,1162,1163],{},"macOS",[475,1165,1166],{},"brew install postgresql@18"," (hoặc ",[475,1169,1170],{},"postgresql@19"," khi GA).",[626,1173,1174,1177,1178],{},[436,1175,1176],{},"Ubuntu\u002FDebian",":\n",[954,1179,1181],{"className":956,"code":1180,"language":958,"meta":959,"style":959},"sudo apt install -y postgresql-common\nsudo \u002Fusr\u002Fshare\u002Fpostgresql-common\u002Fpgdg\u002Fapt.postgresql.org.sh\nsudo apt install -y postgresql-18   # Stable\n# sudo apt install -y postgresql-19 # Khi GA\n",[475,1182,1183,1200,1207,1223],{"__ignoreMap":959},[963,1184,1185,1188,1191,1194,1197],{"class":965,"line":966},[963,1186,1187],{"class":976},"sudo",[963,1189,1190],{"class":980}," apt",[963,1192,1193],{"class":980}," install",[963,1195,1196],{"class":980}," -y",[963,1198,1199],{"class":980}," postgresql-common\n",[963,1201,1202,1204],{"class":965,"line":973},[963,1203,1187],{"class":976},[963,1205,1206],{"class":980}," \u002Fusr\u002Fshare\u002Fpostgresql-common\u002Fpgdg\u002Fapt.postgresql.org.sh\n",[963,1208,1209,1211,1213,1215,1217,1220],{"class":965,"line":994},[963,1210,1187],{"class":976},[963,1212,1190],{"class":980},[963,1214,1193],{"class":980},[963,1216,1196],{"class":980},[963,1218,1219],{"class":980}," postgresql-18",[963,1221,1222],{"class":969},"   # Stable\n",[963,1224,1225],{"class":965,"line":1005},[963,1226,1227],{"class":969},"# sudo apt install -y postgresql-19 # Khi GA\n",[449,1229,1231],{"id":1230},"cách-3-managed-cloud","Cách 3 — Managed cloud",[623,1233,1234,1240,1246],{},[626,1235,1236,1239],{},[436,1237,1238],{},"Supabase"," (free tier hào phóng, có dashboard, hiện đang chạy PG 15\u002F17).",[626,1241,1242,1245],{},[436,1243,1244],{},"Neon"," (serverless Postgres, free tier, thường cập nhật version mới nhanh nhất).",[626,1247,1248,600],{},[436,1249,1250],{},"AWS RDS \u002F Azure Database for PostgreSQL \u002F Google Cloud SQL",[427,1252,1254],{"id":1253},"_3-tool-quản-lý","3. Tool quản lý",[856,1256,1257,1270],{},[859,1258,1259],{},[862,1260,1261,1264,1267],{},[865,1262,1263],{},"Tool",[865,1265,1266],{},"Platform",[865,1268,1269],{},"Ghi chú",[875,1271,1272,1285,1297,1310,1322],{},[862,1273,1274,1279,1282],{},[880,1275,1276],{},[436,1277,1278],{},"pgAdmin 4",[880,1280,1281],{},"All",[880,1283,1284],{},"Chính chủ, free, web\u002Fdesktop. Hỗ trợ PG 19.",[862,1286,1287,1292,1294],{},[880,1288,1289],{},[436,1290,1291],{},"DBeaver",[880,1293,1281],{},[880,1295,1296],{},"Free, đa DB, query plan visual.",[862,1298,1299,1304,1307],{},[880,1300,1301],{},[436,1302,1303],{},"TablePlus",[880,1305,1306],{},"Mac\u002FWin\u002FLinux",[880,1308,1309],{},"UI đẹp nhất, free version giới hạn tab.",[862,1311,1312,1317,1319],{},[880,1313,1314],{},[436,1315,1316],{},"DataGrip",[880,1318,1281],{},[880,1320,1321],{},"JetBrains, trả phí, smartest.",[862,1323,1324,1329,1331],{},[880,1325,1326],{},[436,1327,1328],{},"psql",[880,1330,1281],{},[880,1332,1333],{},"CLI chính thức — học tốt nó là điểm cộng PV.",[427,1335,1337],{"id":1336},"_4-psql-cli-phải-biết","4. psql CLI — phải biết",[954,1339,1341],{"className":956,"code":1340,"language":958,"meta":959,"style":959},"# Kết nối\npsql -h localhost -p 5432 -U postgres -d learnpg\n\n# Connection string\npsql \"postgresql:\u002F\u002Fpostgres:mysecretpw@localhost:5432\u002Flearnpg\"\n",[475,1342,1343,1348,1377,1381,1386],{"__ignoreMap":959},[963,1344,1345],{"class":965,"line":966},[963,1346,1347],{"class":969},"# Kết nối\n",[963,1349,1350,1352,1355,1358,1361,1365,1368,1371,1374],{"class":965,"line":973},[963,1351,1328],{"class":976},[963,1353,1354],{"class":980}," -h",[963,1356,1357],{"class":980}," localhost",[963,1359,1360],{"class":980}," -p",[963,1362,1364],{"class":1363},"sbssI"," 5432",[963,1366,1367],{"class":980}," -U",[963,1369,1370],{"class":980}," postgres",[963,1372,1373],{"class":980}," -d",[963,1375,1376],{"class":980}," learnpg\n",[963,1378,1379],{"class":965,"line":994},[963,1380,1050],{"emptyLinePlaceholder":1049},[963,1382,1383],{"class":965,"line":1005},[963,1384,1385],{"class":969},"# Connection string\n",[963,1387,1388,1390,1394,1397],{"class":965,"line":1015},[963,1389,1328],{"class":976},[963,1391,1393],{"class":1392},"sMK4o"," \"",[963,1395,1396],{"class":980},"postgresql:\u002F\u002Fpostgres:mysecretpw@localhost:5432\u002Flearnpg",[963,1398,1399],{"class":1392},"\"\n",[449,1401,1403],{"id":1402},"meta-command-chỉ-trong-psql","Meta-command (chỉ trong psql)",[856,1405,1406,1416],{},[859,1407,1408],{},[862,1409,1410,1413],{},[865,1411,1412],{},"Lệnh",[865,1414,1415],{},"Tác dụng",[875,1417,1418,1428,1438,1448,1458,1468,1478,1488,1498,1508,1518,1528,1538,1548],{},[862,1419,1420,1425],{},[880,1421,1422],{},[475,1423,1424],{},"\\l",[880,1426,1427],{},"List database",[862,1429,1430,1435],{},[880,1431,1432],{},[475,1433,1434],{},"\\c dbname",[880,1436,1437],{},"Connect db",[862,1439,1440,1445],{},[880,1441,1442],{},[475,1443,1444],{},"\\dt",[880,1446,1447],{},"List table",[862,1449,1450,1455],{},[880,1451,1452],{},[475,1453,1454],{},"\\d table",[880,1456,1457],{},"Describe table",[862,1459,1460,1465],{},[880,1461,1462],{},[475,1463,1464],{},"\\di",[880,1466,1467],{},"List index",[862,1469,1470,1475],{},[880,1471,1472],{},[475,1473,1474],{},"\\df",[880,1476,1477],{},"List function",[862,1479,1480,1485],{},[880,1481,1482],{},[475,1483,1484],{},"\\du",[880,1486,1487],{},"List user\u002Frole",[862,1489,1490,1495],{},[880,1491,1492],{},[475,1493,1494],{},"\\dn",[880,1496,1497],{},"List schema",[862,1499,1500,1505],{},[880,1501,1502],{},[475,1503,1504],{},"\\dx",[880,1506,1507],{},"List extension",[862,1509,1510,1515],{},[880,1511,1512],{},[475,1513,1514],{},"\\timing",[880,1516,1517],{},"Bật\u002Ftắt đo thời gian query",[862,1519,1520,1525],{},[880,1521,1522],{},[475,1523,1524],{},"\\x",[880,1526,1527],{},"Toggle expanded display",[862,1529,1530,1535],{},[880,1531,1532],{},[475,1533,1534],{},"\\q",[880,1536,1537],{},"Quit",[862,1539,1540,1545],{},[880,1541,1542],{},[475,1543,1544],{},"\\?",[880,1546,1547],{},"Help meta-commands",[862,1549,1550,1555],{},[880,1551,1552],{},[475,1553,1554],{},"\\h SELECT",[880,1556,1557],{},"Help SQL syntax",[688,1559,1561,1562,1565,1566,1570,1571,1573],{"color":935,"icon":1560},"i-lucide-star","⭐ ",[436,1563,1564],{},"Câu PV nhỏ nhưng hay:"," ",[1567,1568,1569],"em",{},"\"Trong psql, lệnh nào liệt kê bảng?\""," -> ",[475,1572,1444],{},". Biết được psql nâng tầm fresher lên junior+ trong mắt phỏng vấn.",[427,1575,1577],{"id":1576},"_5-tạo-database-đầu-tiên","5. Tạo database đầu tiên",[954,1579,1583],{"className":1580,"code":1581,"language":1582,"meta":959,"style":959},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Trong psql\nCREATE DATABASE learnpg WITH ENCODING 'UTF8';\n\\c learnpg\n\nCREATE TABLE greetings (\n    id BIGSERIAL PRIMARY KEY,\n    text TEXT NOT NULL,\n    created_at TIMESTAMPTZ DEFAULT NOW()\n);\n\nINSERT INTO greetings (text) VALUES ('Xin chào PostgreSQL 19!');\n\nSELECT * FROM greetings;\n","sql",[475,1584,1585,1590,1595,1600,1604,1609,1614,1619,1624,1629,1633,1638,1642],{"__ignoreMap":959},[963,1586,1587],{"class":965,"line":966},[963,1588,1589],{},"-- Trong psql\n",[963,1591,1592],{"class":965,"line":973},[963,1593,1594],{},"CREATE DATABASE learnpg WITH ENCODING 'UTF8';\n",[963,1596,1597],{"class":965,"line":994},[963,1598,1599],{},"\\c learnpg\n",[963,1601,1602],{"class":965,"line":1005},[963,1603,1050],{"emptyLinePlaceholder":1049},[963,1605,1606],{"class":965,"line":1015},[963,1607,1608],{},"CREATE TABLE greetings (\n",[963,1610,1611],{"class":965,"line":1026},[963,1612,1613],{},"    id BIGSERIAL PRIMARY KEY,\n",[963,1615,1616],{"class":965,"line":1037},[963,1617,1618],{},"    text TEXT NOT NULL,\n",[963,1620,1621],{"class":965,"line":1046},[963,1622,1623],{},"    created_at TIMESTAMPTZ DEFAULT NOW()\n",[963,1625,1626],{"class":965,"line":1053},[963,1627,1628],{},");\n",[963,1630,1631],{"class":965,"line":1059},[963,1632,1050],{"emptyLinePlaceholder":1049},[963,1634,1635],{"class":965,"line":1073},[963,1636,1637],{},"INSERT INTO greetings (text) VALUES ('Xin chào PostgreSQL 19!');\n",[963,1639,1640],{"class":965,"line":1082},[963,1641,1050],{"emptyLinePlaceholder":1049},[963,1643,1644],{"class":965,"line":1091},[963,1645,1646],{},"SELECT * FROM greetings;\n",[688,1648,1649,1657],{"color":935,"icon":1560},[432,1650,1561,1651,1565,1654],{},[436,1652,1653],{},"Câu PV:",[1567,1655,1656],{},"\"Làm sao để atomic get-or-create trong Postgres?\"",[1658,1659,1660],"blockquote",{},[432,1661,1662,1663,1666,1667,1670],{},"Trước PG 19, pattern phổ biến là ",[475,1664,1665],{},"INSERT ... ON CONFLICT DO UPDATE SET id = id RETURNING *"," — nhưng cách này tạo dead tuple và chậm. Từ PG 19, dùng ",[475,1668,1669],{},"INSERT ... ON CONFLICT DO SELECT"," — nhanh hơn 4x, không dead tuple, là giải pháp chính thức cho idempotency.",[688,1672,1673,1679],{"color":1137,"icon":268},[432,1674,1675,1678],{},[436,1676,1677],{},"Postgres conventions"," khác SQL Server:",[623,1680,1681,1684,1697,1707,1713,1721],{},[626,1682,1683],{},"Lower snake_case cho table\u002Fcolumn (chuẩn cộng đồng).",[626,1685,1686,1689,1690,1693,1694,600],{},[475,1687,1688],{},"TEXT"," thay vì ",[475,1691,1692],{},"VARCHAR(MAX)"," — không có giới hạn, perf giống ",[475,1695,1696],{},"VARCHAR(n)",[626,1698,1699,1702,1703,1706],{},[475,1700,1701],{},"BIGSERIAL"," = ",[475,1704,1705],{},"BIGINT GENERATED BY DEFAULT AS IDENTITY"," (cú pháp ngắn).",[626,1708,1709,1712],{},[475,1710,1711],{},"TIMESTAMPTZ"," — luôn có timezone, lưu UTC.",[626,1714,1715,1689,1718,600],{},[475,1716,1717],{},"NOW()",[475,1719,1720],{},"GETDATE()",[626,1722,1723,1724,1727,1728,600],{},"Identifier với ",[475,1725,1726],{},"\"\"",", không ",[475,1729,1730],{},"[]",[427,1732,1734],{"id":1733},"_6-cấu-hình-ban-đầu","6. Cấu hình ban đầu",[449,1736,1738],{"id":1737},"postgresqlconf-tham-số-quan-trọng","postgresql.conf — tham số quan trọng",[856,1740,1741,1754],{},[859,1742,1743],{},[862,1744,1745,1748,1751],{},[865,1746,1747],{},"Tham số",[865,1749,1750],{},"Ý nghĩa",[865,1752,1753],{},"Khởi điểm (8GB RAM)",[875,1755,1756,1769,1782,1795,1808,1821],{},[862,1757,1758,1763,1766],{},[880,1759,1760],{},[475,1761,1762],{},"shared_buffers",[880,1764,1765],{},"Memory cho data cache",[880,1767,1768],{},"2GB (25% RAM)",[862,1770,1771,1776,1779],{},[880,1772,1773],{},[475,1774,1775],{},"effective_cache_size",[880,1777,1778],{},"Hint planner về OS cache",[880,1780,1781],{},"6GB (75% RAM)",[862,1783,1784,1789,1792],{},[880,1785,1786],{},[475,1787,1788],{},"work_mem",[880,1790,1791],{},"Memory mỗi query\u002Fsort",[880,1793,1794],{},"32MB–64MB",[862,1796,1797,1802,1805],{},[880,1798,1799],{},[475,1800,1801],{},"maintenance_work_mem",[880,1803,1804],{},"Cho VACUUM, INDEX, ALTER",[880,1806,1807],{},"512MB",[862,1809,1810,1815,1818],{},[880,1811,1812],{},[475,1813,1814],{},"max_connections",[880,1816,1817],{},"Số connection đồng thời",[880,1819,1820],{},"100 (dev), tăng cẩn thận",[862,1822,1823,1828,1831],{},[880,1824,1825],{},[475,1826,1827],{},"wal_level",[880,1829,1830],{},"Mức WAL log",[880,1832,1833,1836,1837],{},[475,1834,1835],{},"replica"," hoặc ",[475,1838,1839],{},"logical",[449,1841,1843],{"id":1842},"tham-số-mới-hoặc-thay-đổi-mặc-định-trong-pg-19","Tham số mới hoặc thay đổi mặc định trong PG 19",[856,1845,1846,1860],{},[859,1847,1848],{},[862,1849,1850,1852,1855,1858],{},[865,1851,1747],{},[865,1853,1854],{},"Mặc định PG 18",[865,1856,1857],{},"Mặc định PG 19",[865,1859,1750],{},[875,1861,1862,1884,1906,1925,1947],{},[862,1863,1864,1869,1874,1881],{},[880,1865,1866],{},[475,1867,1868],{},"jit",[880,1870,1871],{},[475,1872,1873],{},"on",[880,1875,1876],{},[436,1877,1878],{},[475,1879,1880],{},"off",[880,1882,1883],{},"JIT compilation tắt mặc định — giảm overhead OLTP",[862,1885,1886,1891,1896,1903],{},[880,1887,1888],{},[475,1889,1890],{},"default_toast_compression",[880,1892,1893],{},[475,1894,1895],{},"pglz",[880,1897,1898],{},[436,1899,1900],{},[475,1901,1902],{},"lz4",[880,1904,1905],{},"TOAST nén LZ4 nhanh hơn, ít CPU hơn",[862,1907,1908,1912,1915,1922],{},[880,1909,1910],{},[475,1911,786],{},[880,1913,1914],{},"(không có)",[880,1916,1917],{},[436,1918,1919],{},[475,1920,1921],{},"worker",[880,1923,1924],{},"Phương thức async I\u002FO từ PG 18 AIO subsystem",[862,1926,1927,1932,1937,1944],{},[880,1928,1929],{},[475,1930,1931],{},"max_locks_per_transaction",[880,1933,1934],{},[475,1935,1936],{},"64",[880,1938,1939],{},[436,1940,1941],{},[475,1942,1943],{},"128",[880,1945,1946],{},"Tăng gấp đôi — giảm lỗi \"out of shared memory\"",[862,1948,1949,1954,1958,1964],{},[880,1950,1951],{},[475,1952,1953],{},"log_lock_waits",[880,1955,1956],{},[475,1957,1880],{},[880,1959,1960],{},[436,1961,1962],{},[475,1963,1873],{},[880,1965,1966],{},"Tự động log khi transaction chờ lock > deadlock_timeout",[449,1968,1970],{"id":1969},"pg_hbaconf-authentication","pg_hba.conf — authentication",[954,1972,1977],{"className":1973,"code":1975,"language":1976},[1974],"language-text","# TYPE  DATABASE  USER  ADDRESS         METHOD\nhost    all       all   0.0.0.0\u002F0       scram-sha-256\n","text",[475,1978,1975],{"__ignoreMap":959},[688,1980,1981,1982,1984,1985,1988,1989,600],{"color":1137,"icon":936},"Từ PG 19, ",[436,1983,742],{}," — dùng ",[475,1986,1987],{},"scram-sha-256"," cho tất cả connection mới. Nếu đang migrate từ bản cũ, cập nhật ",[475,1990,746],{},[432,1992,1993],{},"Reload sau khi sửa:",[954,1995,1997],{"className":1580,"code":1996,"language":1582,"meta":959,"style":959},"SELECT pg_reload_conf();\n",[475,1998,1999],{"__ignoreMap":959},[963,2000,2001],{"class":965,"line":966},[963,2002,1996],{},[427,2004,2006],{"id":2005},"_7-schema-role","7. Schema & role",[954,2008,2010],{"className":1580,"code":2009,"language":1582,"meta":959,"style":959},"-- Postgres database có nhiều schema (mặc định: public)\nCREATE SCHEMA shop;\nSET search_path TO shop, public;\n\n-- Tạo role + grant\nCREATE ROLE app_user WITH LOGIN PASSWORD 'apppwd';\nGRANT CONNECT ON DATABASE learnpg TO app_user;\nGRANT USAGE ON SCHEMA shop TO app_user;\nGRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA shop TO app_user;\n",[475,2011,2012,2017,2022,2027,2031,2036,2041,2046,2051],{"__ignoreMap":959},[963,2013,2014],{"class":965,"line":966},[963,2015,2016],{},"-- Postgres database có nhiều schema (mặc định: public)\n",[963,2018,2019],{"class":965,"line":973},[963,2020,2021],{},"CREATE SCHEMA shop;\n",[963,2023,2024],{"class":965,"line":994},[963,2025,2026],{},"SET search_path TO shop, public;\n",[963,2028,2029],{"class":965,"line":1005},[963,2030,1050],{"emptyLinePlaceholder":1049},[963,2032,2033],{"class":965,"line":1015},[963,2034,2035],{},"-- Tạo role + grant\n",[963,2037,2038],{"class":965,"line":1026},[963,2039,2040],{},"CREATE ROLE app_user WITH LOGIN PASSWORD 'apppwd';\n",[963,2042,2043],{"class":965,"line":1037},[963,2044,2045],{},"GRANT CONNECT ON DATABASE learnpg TO app_user;\n",[963,2047,2048],{"class":965,"line":1046},[963,2049,2050],{},"GRANT USAGE ON SCHEMA shop TO app_user;\n",[963,2052,2053],{"class":965,"line":1053},[963,2054,2055],{},"GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA shop TO app_user;\n",[688,2057,2058,2065],{"color":690,"icon":1560},[432,2059,1561,2060,1565,2062],{},[436,2061,1653],{},[1567,2063,2064],{},"\"Schema khác Database thế nào trong Postgres?\"",[1658,2066,2067],{},[432,2068,2069,2070,2073,2074,2077],{},"\"Postgres có ",[436,2071,2072],{},"cluster -> database -> schema -> table",". Mỗi database hoàn toàn tách biệt (không JOIN cross-database trực tiếp được). Schema giống namespace bên trong database. ",[475,2075,2076],{},"public"," là default schema. SQL Server thì DB = schema container, không có khái niệm cluster.\"",[427,2079,2081],{"id":2080},"_8-extensions-sức-mạnh-thực-sự-của-postgres","8. Extensions — sức mạnh thực sự của Postgres",[954,2083,2085],{"className":1580,"code":2084,"language":1582,"meta":959,"style":959},"-- Xem extension có sẵn\nSELECT * FROM pg_available_extensions ORDER BY name;\n\n-- Install\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";           -- UUID generator (uuid_generate_v4)\nCREATE EXTENSION IF NOT EXISTS pg_trgm;               -- fuzzy search, similarity\nCREATE EXTENSION IF NOT EXISTS pgcrypto;              -- crypto, hash, gen_random_uuid\nCREATE EXTENSION IF NOT EXISTS postgis;               -- GIS, geometry, geography\nCREATE EXTENSION IF NOT EXISTS pg_stat_statements;    -- query monitoring\nCREATE EXTENSION IF NOT EXISTS vector;                -- pgvector cho AI embedding (cần install riêng)\n",[475,2086,2087,2092,2097,2101,2106,2111,2116,2121,2126,2131],{"__ignoreMap":959},[963,2088,2089],{"class":965,"line":966},[963,2090,2091],{},"-- Xem extension có sẵn\n",[963,2093,2094],{"class":965,"line":973},[963,2095,2096],{},"SELECT * FROM pg_available_extensions ORDER BY name;\n",[963,2098,2099],{"class":965,"line":994},[963,2100,1050],{"emptyLinePlaceholder":1049},[963,2102,2103],{"class":965,"line":1005},[963,2104,2105],{},"-- Install\n",[963,2107,2108],{"class":965,"line":1015},[963,2109,2110],{},"CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";           -- UUID generator (uuid_generate_v4)\n",[963,2112,2113],{"class":965,"line":1026},[963,2114,2115],{},"CREATE EXTENSION IF NOT EXISTS pg_trgm;               -- fuzzy search, similarity\n",[963,2117,2118],{"class":965,"line":1037},[963,2119,2120],{},"CREATE EXTENSION IF NOT EXISTS pgcrypto;              -- crypto, hash, gen_random_uuid\n",[963,2122,2123],{"class":965,"line":1046},[963,2124,2125],{},"CREATE EXTENSION IF NOT EXISTS postgis;               -- GIS, geometry, geography\n",[963,2127,2128],{"class":965,"line":1053},[963,2129,2130],{},"CREATE EXTENSION IF NOT EXISTS pg_stat_statements;    -- query monitoring\n",[963,2132,2133],{"class":965,"line":1059},[963,2134,2135],{},"CREATE EXTENSION IF NOT EXISTS vector;                -- pgvector cho AI embedding (cần install riêng)\n",[688,2137,2138,2145],{"color":935,"icon":1560},[432,2139,1561,2140,1565,2142],{},[436,2141,1653],{},[1567,2143,2144],{},"\"Postgres có gì hơn MySQL?\"",[1658,2146,2147],{},[432,2148,2149],{},"\"Extension system + JSONB + array type + window function đầy đủ + MVCC native. Đặc biệt: PostGIS cho GIS, pgvector cho AI embedding, pg_trgm cho fuzzy search. PG 19 thêm SQL\u002FPGQ graph query native — không cần graph database riêng.\"",[688,2151,2152,1565,2155,2158,2159,2161],{"color":1137,"icon":936},[436,2153,2154],{},"PG 19 có thêm contrib module mới:",[475,2156,2157],{},"pg_plan_advice"," (official plan hints) — tạo và lock query plan ổn định. Nếu đang dùng ",[475,2160,616],{}," extension, cân nhắc chuyển sang giải pháp chính thức này.",[427,2163,2165],{"id":2164},"_9-đặc-thù-postgres-cần-biết-ngay","9. Đặc thù Postgres cần biết ngay",[688,2167,2168],{"color":935,"icon":936},[623,2169,2170,2184,2197,2210,2220,2230,2238,2248,2255,2268,2280,2288],{},[626,2171,2172,2175,2176,2179,2180,2183],{},[436,2173,2174],{},"String quote",": chỉ ",[475,2177,2178],{},"'"," cho string, ",[475,2181,2182],{},"\""," cho identifier.",[626,2185,2186,643,2189,2192,2193,2196],{},[436,2187,2188],{},"Concat",[475,2190,2191],{},"||"," (vs ",[475,2194,2195],{},"+"," của SQL Server).",[626,2198,2199,643,2202,2205,2206,2209],{},[436,2200,2201],{},"Cast",[475,2203,2204],{},"value::type"," (gọn) hoặc ",[475,2207,2208],{},"CAST(value AS type)"," (chuẩn ANSI).",[626,2211,2212,2215,2216,2219],{},[436,2213,2214],{},"Boolean",": kiểu ",[475,2217,2218],{},"BOOLEAN"," thật (TRUE\u002FFALSE\u002FNULL), không phải BIT.",[626,2221,2222,643,2225,1836,2227,600],{},[436,2223,2224],{},"Auto-increment",[475,2226,1701],{},[475,2228,2229],{},"BIGINT GENERATED ALWAYS AS IDENTITY",[626,2231,2232,643,2235,600],{},[436,2233,2234],{},"Limit",[475,2236,2237],{},"LIMIT N OFFSET M",[626,2239,2240,643,2243,529,2245,600],{},[436,2241,2242],{},"Now",[475,2244,1717],{},[475,2246,2247],{},"CURRENT_TIMESTAMP",[626,2249,2250,643,2253,600],{},[436,2251,2252],{},"Default schema",[475,2254,2076],{},[626,2256,2257,2260,2261,2264,2265,600],{},[436,2258,2259],{},"Case sensitivity",": identifier KHÔNG quote -> lowercase. ",[475,2262,2263],{},"\"User\""," khác ",[475,2266,2267],{},"User",[626,2269,2270,643,2273,2276,2277,600],{},[436,2271,2272],{},"Lệnh kết thúc",[475,2274,2275],{},";",". Không có ",[475,2278,2279],{},"GO",[626,2281,2282,643,2285,2287],{},[436,2283,2284],{},"PG 19",[475,2286,510],{}," thay cho liệt kê cột thủ công.",[626,2289,2290,643,2292,2294],{},[436,2291,2284],{},[475,2293,472],{}," cho atomic get-or-create thay DO UPDATE workaround.",[427,2296,2298],{"id":2297},"_10-nâng-cấp-từ-postgresql-18-lên-19","10. Nâng cấp từ PostgreSQL 18 lên 19",[688,2300,2302,2307,2366],{"color":935,"icon":2301},"i-lucide-arrow-up-circle",[432,2303,2304],{},[436,2305,2306],{},"Lộ trình nâng cấp khuyên dùng:",[2308,2309,2310,2319,2329,2338,2350,2360],"ol",{},[626,2311,2312,2315,2316,2318],{},[436,2313,2314],{},"Audit extension"," — kiểm tra extension nào chưa tương thích PG 19 (đặc biệt ",[475,2317,616],{},", RADIUS auth module).",[626,2320,2321,2324,2325,2328],{},[436,2322,2323],{},"Kiểm tra MD5"," — đổi tất cả password sang SCRAM-SHA-256: ",[475,2326,2327],{},"ALTER ROLE ... PASSWORD '...'"," trước khi upgrade.",[626,2330,2331,2334,2335],{},[436,2332,2333],{},"Test pg_upgrade"," trên bản sao: ",[475,2336,2337],{},"pg_upgrade --old-bindir \u002Fusr\u002Flib\u002Fpostgresql\u002F18\u002Fbin --new-bindir \u002Fusr\u002Flib\u002Fpostgresql\u002F19\u002Fbin --old-datadir ... --new-datadir ...",[626,2339,2340,2343,2344,2346,2347,600],{},[436,2341,2342],{},"JIT plan"," — nếu OLTP, để ",[475,2345,707],{}," (default mới). Nếu analytical workload, bật lại ",[475,2348,2349],{},"jit = on",[626,2351,2352,2355,2356,2359],{},[436,2353,2354],{},"LZ4 TOAST"," — cột TOAST cũ vẫn đọc được. Dùng ",[475,2357,2358],{},"ALTER TABLE ... ALTER COLUMN ... SET COMPRESSION lz4"," để chuyển đổi dần.",[626,2361,2362,2365],{},[436,2363,2364],{},"Theo dõi log_lock_waits"," — nay bật mặc định, review log để phát hiện lock contention tiềm ẩn.",[432,2367,2368],{},"Thời gian nâng cấp: pg_upgrade thường \u003C 5 phút với database \u003C 100GB (không tính thời gian backup trước upgrade).",[688,2370,2372,2373],{"color":935,"icon":2371},"i-lucide-arrow-right","Tiếp theo: ",[1152,2374,2375],{"href":207},"Cú pháp PostgreSQL cơ bản",[2377,2378,2379],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":959,"searchDepth":973,"depth":973,"links":2381},[2382,2389,2394,2395,2398,2399,2404,2405,2406,2407],{"id":429,"depth":973,"text":430,"children":2383},[2384,2385,2386,2387,2388],{"id":451,"depth":994,"text":452},{"id":620,"depth":994,"text":621},{"id":685,"depth":994,"text":686},{"id":765,"depth":994,"text":766},{"id":842,"depth":994,"text":843},{"id":947,"depth":973,"text":948,"children":2390},[2391,2392,2393],{"id":951,"depth":994,"text":952},{"id":1141,"depth":994,"text":1142},{"id":1230,"depth":994,"text":1231},{"id":1253,"depth":973,"text":1254},{"id":1336,"depth":973,"text":1337,"children":2396},[2397],{"id":1402,"depth":994,"text":1403},{"id":1576,"depth":973,"text":1577},{"id":1733,"depth":973,"text":1734,"children":2400},[2401,2402,2403],{"id":1737,"depth":994,"text":1738},{"id":1842,"depth":994,"text":1843},{"id":1969,"depth":994,"text":1970},{"id":2005,"depth":973,"text":2006},{"id":2080,"depth":973,"text":2081},{"id":2164,"depth":973,"text":2165},{"id":2297,"depth":973,"text":2298},"PostgreSQL 19 (Beta 1 — 04\u002F06\u002F2026) — landmark release với SQL\u002FPGQ graph queries, ON CONFLICT DO SELECT, GROUP BY ALL, temporal data, cùng nền tảng vững chắc từ PG 18.","md",null,{},{"title":173,"icon":176},{"title":422,"description":2408},"FwtgWuYBXsmP94mCfCmOCr0AzhIxT-0EIUrXnt7NRHw",[2416,2418],{"title":193,"path":194,"stem":195,"description":2417,"icon":196,"children":-1},"90+ câu hỏi phỏng vấn SQL Server — đáp án chi tiết, code mẫu, SQL Server 2025 (17.x), Azure SQL Hyperscale, Fabric, Linux.",{"title":178,"path":207,"stem":208,"description":2419,"icon":181,"children":-1},"Kiểu dữ liệu, DDL, DML, UPSERT (ON CONFLICT), RETURNING, GROUP BY ALL, FOR PORTION OF — gốc cho PostgreSQL 18 & 19.",1783490365065]