[{"data":1,"prerenderedAt":4357},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-database-sql-server-dac-thu-performance":420,"-tu-hoc-database-sql-server-dac-thu-performance-surround":4352},[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":4345,"extension":4346,"links":4347,"meta":4348,"navigation":4349,"path":189,"seo":4350,"stem":190,"__hash__":4351},"docs\u002F2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance.md","Đặc thù SQL Server và Performance",{"type":424,"value":425,"toc":4267},"minimark",[426,431,436,463,603,607,649,680,701,705,763,767,825,841,845,859,863,1006,1029,1033,1076,1082,1086,1142,1146,1208,1212,1227,1232,1298,1304,1308,1312,1351,1355,1462,1466,1509,1513,1611,1614,1618,1647,1654,1658,1711,1714,1718,1919,1923,1934,1938,1945,2029,2033,2144,2148,2158,2162,2185,2190,2216,2220,2229,2233,2298,2360,2374,2378,2388,2392,2395,2410,2418,2422,2502,2575,2579,2608,2643,2666,2670,2674,2681,2719,2723,2791,2811,2815,2822,2917,2921,2925,2932,2985,3010,3014,3024,3052,3056,3063,3078,3082,3086,3165,3169,3253,3257,3264,3326,3330,3340,3349,3353,3357,3367,3373,3379,3383,3444,3448,3454,3458,3461,3467,3471,3481,3485,3491,3494,3557,3561,3637,3641,3683,3687,3740,3761,3765,3769,3933,3937,3940,3963,3967,4026,4039,4043,4047,4145,4149,4155,4159,4238,4255,4263],[427,428,430],"h2",{"id":429},"_1-index-kiến-thức-cốt-lõi","1. Index — kiến thức cốt lõi",[432,433,435],"h3",{"id":434},"hai-loại-chính","Hai loại chính",[437,438,439,454],"field-group",{},[440,441,444,445,449,450,453],"field",{"name":442,"type":443},"Clustered","1 cái \u002F bảng","Sắp xếp ",[446,447,448],"strong",{},"vật lý"," dữ liệu theo key. Bảng có clustered = ",[446,451,452],{},"B-tree"," với leaf chứa luôn data. Mặc định PRIMARY KEY = clustered.",[440,455,458,459,462],{"name":456,"type":457},"Non-clustered","Nhiều cái \u002F bảng","Cấu trúc B-tree riêng, leaf trỏ về row gốc qua ",[446,460,461],{},"row locator"," (clustered key hoặc RID nếu heap).",[464,465,470],"pre",{"className":466,"code":467,"language":468,"meta":469,"style":469},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Clustered (chỉ 1 cái — thường là PK)\nCREATE CLUSTERED INDEX IX_Orders_Date ON Orders(OrderDate);\n\n-- Non-clustered\nCREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);\n\n-- Composite — thứ tự cột RẤT QUAN TRỌNG (left-most prefix)\nCREATE INDEX IX_Orders_Cust_Date ON Orders(CustomerId, OrderDate);\n\n-- Covering — INCLUDE thêm cột để query không cần seek về bảng\nCREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\nINCLUDE (OrderDate, Total, Status);\n\n-- Filtered — chỉ index 1 phần dữ liệu\nCREATE INDEX IX_Orders_Active ON Orders(CustomerId)\nWHERE Status \u003C> 'Cancelled';\n\n-- Unique\nCREATE UNIQUE INDEX IX_Users_Email ON Users(Email);\n\n-- Drop\nDROP INDEX IX_Orders_CustomerId ON Orders;\n","sql","",[471,472,473,481,487,494,500,506,511,517,523,528,534,540,546,551,557,563,569,574,580,586,591,597],"code",{"__ignoreMap":469},[474,475,478],"span",{"class":476,"line":477},"line",1,[474,479,480],{},"-- Clustered (chỉ 1 cái — thường là PK)\n",[474,482,484],{"class":476,"line":483},2,[474,485,486],{},"CREATE CLUSTERED INDEX IX_Orders_Date ON Orders(OrderDate);\n",[474,488,490],{"class":476,"line":489},3,[474,491,493],{"emptyLinePlaceholder":492},true,"\n",[474,495,497],{"class":476,"line":496},4,[474,498,499],{},"-- Non-clustered\n",[474,501,503],{"class":476,"line":502},5,[474,504,505],{},"CREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);\n",[474,507,509],{"class":476,"line":508},6,[474,510,493],{"emptyLinePlaceholder":492},[474,512,514],{"class":476,"line":513},7,[474,515,516],{},"-- Composite — thứ tự cột RẤT QUAN TRỌNG (left-most prefix)\n",[474,518,520],{"class":476,"line":519},8,[474,521,522],{},"CREATE INDEX IX_Orders_Cust_Date ON Orders(CustomerId, OrderDate);\n",[474,524,526],{"class":476,"line":525},9,[474,527,493],{"emptyLinePlaceholder":492},[474,529,531],{"class":476,"line":530},10,[474,532,533],{},"-- Covering — INCLUDE thêm cột để query không cần seek về bảng\n",[474,535,537],{"class":476,"line":536},11,[474,538,539],{},"CREATE INDEX IX_Orders_Cover ON Orders(CustomerId)\n",[474,541,543],{"class":476,"line":542},12,[474,544,545],{},"INCLUDE (OrderDate, Total, Status);\n",[474,547,549],{"class":476,"line":548},13,[474,550,493],{"emptyLinePlaceholder":492},[474,552,554],{"class":476,"line":553},14,[474,555,556],{},"-- Filtered — chỉ index 1 phần dữ liệu\n",[474,558,560],{"class":476,"line":559},15,[474,561,562],{},"CREATE INDEX IX_Orders_Active ON Orders(CustomerId)\n",[474,564,566],{"class":476,"line":565},16,[474,567,568],{},"WHERE Status \u003C> 'Cancelled';\n",[474,570,572],{"class":476,"line":571},17,[474,573,493],{"emptyLinePlaceholder":492},[474,575,577],{"class":476,"line":576},18,[474,578,579],{},"-- Unique\n",[474,581,583],{"class":476,"line":582},19,[474,584,585],{},"CREATE UNIQUE INDEX IX_Users_Email ON Users(Email);\n",[474,587,589],{"class":476,"line":588},20,[474,590,493],{"emptyLinePlaceholder":492},[474,592,594],{"class":476,"line":593},21,[474,595,596],{},"-- Drop\n",[474,598,600],{"class":476,"line":599},22,[474,601,602],{},"DROP INDEX IX_Orders_CustomerId ON Orders;\n",[432,604,606],{"id":605},"khi-nào-tạo-khi-nào-tránh","Khi nào tạo \u002F khi nào tránh",[608,609,612,618],"callout",{"color":610,"icon":611},"success","i-lucide-check-circle-2",[613,614,615],"p",{},[446,616,617],{},"Nên index:",[619,620,621,639,646],"ul",{},[622,623,624,625,628,629,628,632,628,635,638],"li",{},"Cột thường ở ",[471,626,627],{},"WHERE",", ",[471,630,631],{},"JOIN",[471,633,634],{},"ORDER BY",[471,636,637],{},"GROUP BY",".",[622,640,641,642,645],{},"Cột có ",[446,643,644],{},"selectivity cao"," (nhiều giá trị distinct).",[622,647,648],{},"Foreign key columns (SQL Server không tự tạo!).",[608,650,653,658],{"color":651,"icon":652},"error","i-lucide-x-circle",[613,654,655],{},[446,656,657],{},"KHÔNG nên index:",[619,659,660,663,666,677],{},[622,661,662],{},"Bảng nhỏ (vài nghìn row) — scan đầy bảng có khi nhanh hơn.",[622,664,665],{},"Cột thay đổi rất thường xuyên (UPDATE phải cập nhật cả index).",[622,667,668,669,672,673,676],{},"Selectivity thấp (",[471,670,671],{},"Gender"," 2 giá trị, ",[471,674,675],{},"Status"," 3 giá trị).",[622,678,679],{},"Bảng heavy INSERT (mỗi insert tăng index maintenance).",[608,681,684,695],{"color":682,"icon":683},"warning","i-lucide-star",[613,685,686,687,690,691],{},"⭐ ",[446,688,689],{},"Câu PV cốt lõi:"," ",[692,693,694],"em",{},"\"Index hoạt động ra sao?\"",[696,697,698],"blockquote",{},[613,699,700],{},"\"Index là cấu trúc B-tree với key sorted. Khi WHERE\u002FJOIN trên cột có index, engine seek qua B-tree để tìm row, độ phức tạp O(log n) thay vì O(n) full scan. Trade-off: index tốn space và làm chậm INSERT\u002FUPDATE\u002FDELETE vì phải maintain B-tree.\"",[432,702,704],{"id":703},"composite-index-quy-tắc-left-most-prefix","Composite index — quy tắc left-most prefix",[464,706,708],{"className":466,"code":707,"language":468,"meta":469,"style":469},"CREATE INDEX IX_Orders_ABC ON Orders(A, B, C);\n\n-- Index dùng được:\nWHERE A = ?\nWHERE A = ? AND B = ?\nWHERE A = ? AND B = ? AND C = ?\n\n-- Index KHÔNG dùng được (hoặc dùng không hiệu quả):\nWHERE B = ?               -- bỏ qua A\nWHERE A = ? AND C = ?     -- skip B\nWHERE C = ?               -- chỉ có cột cuối\n",[471,709,710,715,719,724,729,734,739,743,748,753,758],{"__ignoreMap":469},[474,711,712],{"class":476,"line":477},[474,713,714],{},"CREATE INDEX IX_Orders_ABC ON Orders(A, B, C);\n",[474,716,717],{"class":476,"line":483},[474,718,493],{"emptyLinePlaceholder":492},[474,720,721],{"class":476,"line":489},[474,722,723],{},"-- Index dùng được:\n",[474,725,726],{"class":476,"line":496},[474,727,728],{},"WHERE A = ?\n",[474,730,731],{"class":476,"line":502},[474,732,733],{},"WHERE A = ? AND B = ?\n",[474,735,736],{"class":476,"line":508},[474,737,738],{},"WHERE A = ? AND B = ? AND C = ?\n",[474,740,741],{"class":476,"line":513},[474,742,493],{"emptyLinePlaceholder":492},[474,744,745],{"class":476,"line":519},[474,746,747],{},"-- Index KHÔNG dùng được (hoặc dùng không hiệu quả):\n",[474,749,750],{"class":476,"line":525},[474,751,752],{},"WHERE B = ?               -- bỏ qua A\n",[474,754,755],{"class":476,"line":530},[474,756,757],{},"WHERE A = ? AND C = ?     -- skip B\n",[474,759,760],{"class":476,"line":536},[474,761,762],{},"WHERE C = ?               -- chỉ có cột cuối\n",[432,764,766],{"id":765},"sargable-vs-non-sargable","Sargable vs Non-sargable",[608,768,770,776],{"color":682,"icon":769},"i-lucide-alert-triangle",[613,771,772,775],{},[446,773,774],{},"Non-sargable"," = query mà engine không dùng được index dù có. Vì áp hàm\u002Fbiểu thức lên cột:",[464,777,779],{"className":466,"code":778,"language":468,"meta":469,"style":469},"-- ❌ Function lên cột → full scan\nWHERE YEAR(OrderDate) = 2026\nWHERE UPPER(Email) = 'A@B.COM'\nWHERE Total + Tax > 100\n\n-- ✅ Sargable — engine dùng được index\nWHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\nWHERE Email = 'a@b.com'        -- nếu collation CI thì không cần UPPER\nWHERE Total > 100 - Tax\n",[471,780,781,786,791,796,801,805,810,815,820],{"__ignoreMap":469},[474,782,783],{"class":476,"line":477},[474,784,785],{},"-- ❌ Function lên cột → full scan\n",[474,787,788],{"class":476,"line":483},[474,789,790],{},"WHERE YEAR(OrderDate) = 2026\n",[474,792,793],{"class":476,"line":489},[474,794,795],{},"WHERE UPPER(Email) = 'A@B.COM'\n",[474,797,798],{"class":476,"line":496},[474,799,800],{},"WHERE Total + Tax > 100\n",[474,802,803],{"class":476,"line":502},[474,804,493],{"emptyLinePlaceholder":492},[474,806,807],{"class":476,"line":508},[474,808,809],{},"-- ✅ Sargable — engine dùng được index\n",[474,811,812],{"class":476,"line":513},[474,813,814],{},"WHERE OrderDate >= '2026-01-01' AND OrderDate \u003C '2027-01-01'\n",[474,816,817],{"class":476,"line":519},[474,818,819],{},"WHERE Email = 'a@b.com'        -- nếu collation CI thì không cần UPPER\n",[474,821,822],{"class":476,"line":525},[474,823,824],{},"WHERE Total > 100 - Tax\n",[613,826,686,827,690,830,837,838,638],{},[446,828,829],{},"Bẫy phỏng vấn rất hay:",[692,831,832,833,836],{},"\"Tại sao ",[471,834,835],{},"WHERE YEAR(OrderDate) = 2026"," chậm dù có index?\""," — câu trả lời là ",[446,839,840],{},"non-sargable",[427,842,844],{"id":843},"_2-execution-plan-đọc-cách-nào","2. Execution Plan — đọc cách nào?",[613,846,847,848,851,852,855,856,638],{},"Trong SSMS, bật ",[446,849,850],{},"Actual Execution Plan"," (",[471,853,854],{},"Ctrl+M",") trước khi chạy query. Hoặc dùng ",[471,857,858],{},"SET STATISTICS IO ON; SET STATISTICS TIME ON;",[432,860,862],{"id":861},"các-operator-quan-trọng","Các operator quan trọng",[864,865,866,882],"table",{},[867,868,869],"thead",{},[870,871,872,876,879],"tr",{},[873,874,875],"th",{},"Operator",[873,877,878],{},"Ý nghĩa",[873,880,881],{},"Khi gặp thì sao",[883,884,885,899,912,925,938,954,967,980,993],"tbody",{},[870,886,887,893,896],{},[888,889,890],"td",{},[446,891,892],{},"Table Scan",[888,894,895],{},"Đọc toàn bộ bảng",[888,897,898],{},"Thiếu index? Hoặc bảng nhỏ.",[870,900,901,906,909],{},[888,902,903],{},[446,904,905],{},"Clustered Index Scan",[888,907,908],{},"Đọc toàn bộ clustered",[888,910,911],{},"Tương tự — full scan",[870,913,914,919,922],{},[888,915,916],{},[446,917,918],{},"Clustered Index Seek",[888,920,921],{},"Tra cứu qua index ✅",[888,923,924],{},"Tốt",[870,926,927,933,936],{},[888,928,929,932],{},[446,930,931],{},"Index Seek"," (non-clustered)",[888,934,935],{},"Tra non-clustered ✅",[888,937,924],{},[870,939,940,945,948],{},[888,941,942],{},[446,943,944],{},"Key Lookup",[888,946,947],{},"Sau seek, lookup về clustered để lấy thêm cột",[888,949,950,951],{},"Dấu hiệu cần ",[446,952,953],{},"covering index",[870,955,956,961,964],{},[888,957,958],{},[446,959,960],{},"Hash Match",[888,962,963],{},"JOIN bằng hash",[888,965,966],{},"OK cho dataset lớn, nóng RAM.",[870,968,969,974,977],{},[888,970,971],{},[446,972,973],{},"Nested Loops",[888,975,976],{},"JOIN row-by-row",[888,978,979],{},"Tốt cho outer nhỏ + inner indexed",[870,981,982,987,990],{},[888,983,984],{},[446,985,986],{},"Merge Join",[888,988,989],{},"JOIN 2 nguồn đã sort",[888,991,992],{},"Tốt khi cả 2 đã sorted.",[870,994,995,1000,1003],{},[888,996,997],{},[446,998,999],{},"Sort",[888,1001,1002],{},"Sắp xếp",[888,1004,1005],{},"Đắt với data lớn — xem có thể tránh?",[608,1007,1009,1017],{"color":1008,"icon":268},"primary",[613,1010,686,1011,690,1014],{},[446,1012,1013],{},"Câu PV:",[692,1015,1016],{},"\"Key Lookup là gì? Khi nào xuất hiện?\"",[696,1018,1019],{},[613,1020,1021,1022,1024,1025,1028],{},"\"Khi non-clustered index không bao phủ đủ cột query cần, engine sau seek phải nhảy về clustered để lấy cột thêm. Nhiều Key Lookup = chậm. Fix bằng ",[446,1023,953],{}," (thêm ",[471,1026,1027],{},"INCLUDE",").\"",[432,1030,1032],{"id":1031},"statistics-cost","Statistics & cost",[464,1034,1036],{"className":466,"code":1035,"language":468,"meta":469,"style":469},"SET STATISTICS IO ON;\nSET STATISTICS TIME ON;\n\nSELECT * FROM Orders WHERE CustomerId = 1;\n\n-- Output:\n-- Table 'Orders'. Scan count 1, logical reads 8, physical reads 2, ...\n-- CPU time = 0 ms,  elapsed time = 12 ms.\n",[471,1037,1038,1043,1048,1052,1057,1061,1066,1071],{"__ignoreMap":469},[474,1039,1040],{"class":476,"line":477},[474,1041,1042],{},"SET STATISTICS IO ON;\n",[474,1044,1045],{"class":476,"line":483},[474,1046,1047],{},"SET STATISTICS TIME ON;\n",[474,1049,1050],{"class":476,"line":489},[474,1051,493],{"emptyLinePlaceholder":492},[474,1053,1054],{"class":476,"line":496},[474,1055,1056],{},"SELECT * FROM Orders WHERE CustomerId = 1;\n",[474,1058,1059],{"class":476,"line":502},[474,1060,493],{"emptyLinePlaceholder":492},[474,1062,1063],{"class":476,"line":508},[474,1064,1065],{},"-- Output:\n",[474,1067,1068],{"class":476,"line":513},[474,1069,1070],{},"-- Table 'Orders'. Scan count 1, logical reads 8, physical reads 2, ...\n",[474,1072,1073],{"class":476,"line":519},[474,1074,1075],{},"-- CPU time = 0 ms,  elapsed time = 12 ms.\n",[613,1077,1078,1081],{},[471,1079,1080],{},"logical reads"," = số page (8KB) phải đọc — chỉ số quan trọng nhất để so sánh trước\u002Fsau optimize.",[427,1083,1085],{"id":1084},"_3-query-optimization-checklist","3. Query optimization checklist",[608,1087,1088],{"color":610,"icon":383},[1089,1090,1091,1094,1101,1104,1107,1118,1127,1130,1133,1136],"ol",{},[622,1092,1093],{},"✅ Có index trên cột WHERE\u002FJOIN\u002FORDER BY?",[622,1095,1096,1097,1100],{},"✅ Tránh ",[471,1098,1099],{},"SELECT *"," — chỉ chọn cột cần (phá covering, tốn băng thông).",[622,1102,1103],{},"✅ WHERE sargable (không function lên cột)?",[622,1105,1106],{},"✅ JOIN trên cột cùng kiểu dữ liệu (tránh implicit conversion).",[622,1108,1109,1110,1113,1114,1117],{},"✅ Dùng ",[471,1111,1112],{},"EXISTS"," thay ",[471,1115,1116],{},"IN"," với subquery lớn.",[622,1119,1109,1120,1113,1123,1126],{},[471,1121,1122],{},"UNION ALL",[471,1124,1125],{},"UNION"," nếu không cần dedupe.",[622,1128,1129],{},"✅ Pagination dùng OFFSET\u002FFETCH thay vì lấy tất rồi cắt.",[622,1131,1132],{},"✅ Update statistics định kỳ.",[622,1134,1135],{},"✅ Defrag\u002Frebuild index khi fragmentation > 30%.",[622,1137,1109,1138,1141],{},[471,1139,1140],{},"AsNoTracking()"," từ EF Core khi chỉ đọc.",[432,1143,1145],{"id":1144},"defrag-index","Defrag index",[464,1147,1149],{"className":466,"code":1148,"language":468,"meta":469,"style":469},"-- Xem fragmentation\nSELECT * FROM sys.dm_db_index_physical_stats(\n    DB_ID('LearnSqlServer'), NULL, NULL, NULL, 'DETAILED');\n\n-- Reorganize (5–30%)\nALTER INDEX IX_Orders_CustomerId ON Orders REORGANIZE;\n\n-- Rebuild (> 30% — lock dài)\nALTER INDEX IX_Orders_CustomerId ON Orders REBUILD;\n\n-- Update statistics\nUPDATE STATISTICS Orders WITH FULLSCAN;\n",[471,1150,1151,1156,1161,1166,1170,1175,1180,1184,1189,1194,1198,1203],{"__ignoreMap":469},[474,1152,1153],{"class":476,"line":477},[474,1154,1155],{},"-- Xem fragmentation\n",[474,1157,1158],{"class":476,"line":483},[474,1159,1160],{},"SELECT * FROM sys.dm_db_index_physical_stats(\n",[474,1162,1163],{"class":476,"line":489},[474,1164,1165],{},"    DB_ID('LearnSqlServer'), NULL, NULL, NULL, 'DETAILED');\n",[474,1167,1168],{"class":476,"line":496},[474,1169,493],{"emptyLinePlaceholder":492},[474,1171,1172],{"class":476,"line":502},[474,1173,1174],{},"-- Reorganize (5–30%)\n",[474,1176,1177],{"class":476,"line":508},[474,1178,1179],{},"ALTER INDEX IX_Orders_CustomerId ON Orders REORGANIZE;\n",[474,1181,1182],{"class":476,"line":513},[474,1183,493],{"emptyLinePlaceholder":492},[474,1185,1186],{"class":476,"line":519},[474,1187,1188],{},"-- Rebuild (> 30% — lock dài)\n",[474,1190,1191],{"class":476,"line":525},[474,1192,1193],{},"ALTER INDEX IX_Orders_CustomerId ON Orders REBUILD;\n",[474,1195,1196],{"class":476,"line":530},[474,1197,493],{"emptyLinePlaceholder":492},[474,1199,1200],{"class":476,"line":536},[474,1201,1202],{},"-- Update statistics\n",[474,1204,1205],{"class":476,"line":542},[474,1206,1207],{},"UPDATE STATISTICS Orders WITH FULLSCAN;\n",[427,1209,1211],{"id":1210},"_4-parameter-sniffing-bug-kinh-điển","4. Parameter sniffing — bug kinh điển",[608,1213,1215,1221],{"color":651,"icon":1214},"i-lucide-alert-octagon",[613,1216,1217,1220],{},[446,1218,1219],{},"Parameter sniffing"," = lần đầu chạy stored proc, engine cache plan dựa trên parameter đó. Lần sau với parameter khác, plan có thể bị tệ.",[613,1222,1223,1226],{},[446,1224,1225],{},"Triệu chứng:"," proc lúc nhanh lúc chậm bất thường.",[613,1228,1229],{},[446,1230,1231],{},"Cách fix:",[464,1233,1235],{"className":466,"code":1234,"language":468,"meta":469,"style":469},"-- 1. OPTIMIZE FOR\nSELECT * FROM Orders\nWHERE CustomerId = @CustomerId\nOPTION (OPTIMIZE FOR (@CustomerId UNKNOWN));\n\n-- 2. RECOMPILE — sinh plan mới mỗi lần gọi\nSELECT * FROM Orders\nWHERE CustomerId = @CustomerId\nOPTION (RECOMPILE);\n\n-- 3. SQL Server 2025: OPPO (Optional Parameter Plan Optimization) tự xử lý\nALTER DATABASE SCOPED CONFIGURATION\n    SET OPTIONAL_PARAMETER_PLAN_OPTIMIZATION = ON;   -- 2025 only\n",[471,1236,1237,1242,1247,1252,1257,1261,1266,1270,1274,1279,1283,1288,1293],{"__ignoreMap":469},[474,1238,1239],{"class":476,"line":477},[474,1240,1241],{},"-- 1. OPTIMIZE FOR\n",[474,1243,1244],{"class":476,"line":483},[474,1245,1246],{},"SELECT * FROM Orders\n",[474,1248,1249],{"class":476,"line":489},[474,1250,1251],{},"WHERE CustomerId = @CustomerId\n",[474,1253,1254],{"class":476,"line":496},[474,1255,1256],{},"OPTION (OPTIMIZE FOR (@CustomerId UNKNOWN));\n",[474,1258,1259],{"class":476,"line":502},[474,1260,493],{"emptyLinePlaceholder":492},[474,1262,1263],{"class":476,"line":508},[474,1264,1265],{},"-- 2. RECOMPILE — sinh plan mới mỗi lần gọi\n",[474,1267,1268],{"class":476,"line":513},[474,1269,1246],{},[474,1271,1272],{"class":476,"line":519},[474,1273,1251],{},[474,1275,1276],{"class":476,"line":525},[474,1277,1278],{},"OPTION (RECOMPILE);\n",[474,1280,1281],{"class":476,"line":530},[474,1282,493],{"emptyLinePlaceholder":492},[474,1284,1285],{"class":476,"line":536},[474,1286,1287],{},"-- 3. SQL Server 2025: OPPO (Optional Parameter Plan Optimization) tự xử lý\n",[474,1289,1290],{"class":476,"line":542},[474,1291,1292],{},"ALTER DATABASE SCOPED CONFIGURATION\n",[474,1294,1295],{"class":476,"line":548},[474,1296,1297],{},"    SET OPTIONAL_PARAMETER_PLAN_OPTIMIZATION = ON;   -- 2025 only\n",[613,1299,686,1300,1303],{},[446,1301,1302],{},"Câu PV nâng cao (Junior+):"," giải thích được parameter sniffing là điểm cộng lớn.",[427,1305,1307],{"id":1306},"_5-json-trong-sql-server-2025-nâng-cấp","5. JSON trong SQL Server (2025 nâng cấp)",[432,1309,1311],{"id":1310},"kiểu-json-first-class-2025-mới","Kiểu JSON first-class (2025 mới)",[464,1313,1315],{"className":466,"code":1314,"language":468,"meta":469,"style":469},"CREATE TABLE Events (\n    Id INT IDENTITY PRIMARY KEY,\n    Payload JSON                       -- 2025 mới\n);\n\nINSERT INTO Events (Payload)\nVALUES (N'{ \"type\": \"click\", \"user\": \"alice\", \"tags\": [\"promo\", \"email\"] }');\n",[471,1316,1317,1322,1327,1332,1337,1341,1346],{"__ignoreMap":469},[474,1318,1319],{"class":476,"line":477},[474,1320,1321],{},"CREATE TABLE Events (\n",[474,1323,1324],{"class":476,"line":483},[474,1325,1326],{},"    Id INT IDENTITY PRIMARY KEY,\n",[474,1328,1329],{"class":476,"line":489},[474,1330,1331],{},"    Payload JSON                       -- 2025 mới\n",[474,1333,1334],{"class":476,"line":496},[474,1335,1336],{},");\n",[474,1338,1339],{"class":476,"line":502},[474,1340,493],{"emptyLinePlaceholder":492},[474,1342,1343],{"class":476,"line":508},[474,1344,1345],{},"INSERT INTO Events (Payload)\n",[474,1347,1348],{"class":476,"line":513},[474,1349,1350],{},"VALUES (N'{ \"type\": \"click\", \"user\": \"alice\", \"tags\": [\"promo\", \"email\"] }');\n",[432,1352,1354],{"id":1353},"query-json","Query JSON",[464,1356,1358],{"className":466,"code":1357,"language":468,"meta":469,"style":469},"-- Path\nSELECT\n    JSON_VALUE(Payload, '$.type') AS EventType,\n    JSON_VALUE(Payload, '$.user') AS Username,\n    JSON_QUERY(Payload, '$.tags') AS Tags\nFROM Events;\n\n-- OPENJSON — biến JSON thành table\nSELECT *\nFROM OPENJSON(\n    N'[{\"id\":1,\"name\":\"A\"},{\"id\":2,\"name\":\"B\"}]'\n)\nWITH (\n    id INT '$.id',\n    name NVARCHAR(50) '$.name'\n);\n\n-- Modify\nUPDATE Events\nSET Payload = JSON_MODIFY(Payload, '$.processed', 1)\nWHERE Id = 1;\n",[471,1359,1360,1365,1370,1375,1380,1385,1390,1394,1399,1404,1409,1414,1419,1424,1429,1434,1438,1442,1447,1452,1457],{"__ignoreMap":469},[474,1361,1362],{"class":476,"line":477},[474,1363,1364],{},"-- Path\n",[474,1366,1367],{"class":476,"line":483},[474,1368,1369],{},"SELECT\n",[474,1371,1372],{"class":476,"line":489},[474,1373,1374],{},"    JSON_VALUE(Payload, '$.type') AS EventType,\n",[474,1376,1377],{"class":476,"line":496},[474,1378,1379],{},"    JSON_VALUE(Payload, '$.user') AS Username,\n",[474,1381,1382],{"class":476,"line":502},[474,1383,1384],{},"    JSON_QUERY(Payload, '$.tags') AS Tags\n",[474,1386,1387],{"class":476,"line":508},[474,1388,1389],{},"FROM Events;\n",[474,1391,1392],{"class":476,"line":513},[474,1393,493],{"emptyLinePlaceholder":492},[474,1395,1396],{"class":476,"line":519},[474,1397,1398],{},"-- OPENJSON — biến JSON thành table\n",[474,1400,1401],{"class":476,"line":525},[474,1402,1403],{},"SELECT *\n",[474,1405,1406],{"class":476,"line":530},[474,1407,1408],{},"FROM OPENJSON(\n",[474,1410,1411],{"class":476,"line":536},[474,1412,1413],{},"    N'[{\"id\":1,\"name\":\"A\"},{\"id\":2,\"name\":\"B\"}]'\n",[474,1415,1416],{"class":476,"line":542},[474,1417,1418],{},")\n",[474,1420,1421],{"class":476,"line":548},[474,1422,1423],{},"WITH (\n",[474,1425,1426],{"class":476,"line":553},[474,1427,1428],{},"    id INT '$.id',\n",[474,1430,1431],{"class":476,"line":559},[474,1432,1433],{},"    name NVARCHAR(50) '$.name'\n",[474,1435,1436],{"class":476,"line":565},[474,1437,1336],{},[474,1439,1440],{"class":476,"line":571},[474,1441,493],{"emptyLinePlaceholder":492},[474,1443,1444],{"class":476,"line":576},[474,1445,1446],{},"-- Modify\n",[474,1448,1449],{"class":476,"line":582},[474,1450,1451],{},"UPDATE Events\n",[474,1453,1454],{"class":476,"line":588},[474,1455,1456],{},"SET Payload = JSON_MODIFY(Payload, '$.processed', 1)\n",[474,1458,1459],{"class":476,"line":593},[474,1460,1461],{},"WHERE Id = 1;\n",[427,1463,1465],{"id":1464},"_6-native-regex-2025-mới","6. Native RegEx (2025 mới)",[464,1467,1469],{"className":466,"code":1468,"language":468,"meta":469,"style":469},"-- Trước 2025 phải dùng CLR. Giờ built-in.\nSELECT Email FROM Users\nWHERE REGEXP_LIKE(Email, '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$');\n\nSELECT REGEXP_REPLACE('Hello World 2026', '\\d+', 'XXXX');\n-- 'Hello World XXXX'\n\nSELECT REGEXP_SUBSTR(Description, '[A-Z]{2,}') FROM Articles;\n",[471,1470,1471,1476,1481,1486,1490,1495,1500,1504],{"__ignoreMap":469},[474,1472,1473],{"class":476,"line":477},[474,1474,1475],{},"-- Trước 2025 phải dùng CLR. Giờ built-in.\n",[474,1477,1478],{"class":476,"line":483},[474,1479,1480],{},"SELECT Email FROM Users\n",[474,1482,1483],{"class":476,"line":489},[474,1484,1485],{},"WHERE REGEXP_LIKE(Email, '^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$');\n",[474,1487,1488],{"class":476,"line":496},[474,1489,493],{"emptyLinePlaceholder":492},[474,1491,1492],{"class":476,"line":502},[474,1493,1494],{},"SELECT REGEXP_REPLACE('Hello World 2026', '\\d+', 'XXXX');\n",[474,1496,1497],{"class":476,"line":508},[474,1498,1499],{},"-- 'Hello World XXXX'\n",[474,1501,1502],{"class":476,"line":513},[474,1503,493],{"emptyLinePlaceholder":492},[474,1505,1506],{"class":476,"line":519},[474,1507,1508],{},"SELECT REGEXP_SUBSTR(Description, '[A-Z]{2,}') FROM Articles;\n",[427,1510,1512],{"id":1511},"_7-temporal-table-versioning-tự-động","7. Temporal Table — versioning tự động",[464,1514,1516],{"className":466,"code":1515,"language":468,"meta":469,"style":469},"CREATE TABLE Products (\n    Id INT IDENTITY PRIMARY KEY,\n    Name NVARCHAR(200) NOT NULL,\n    Price DECIMAL(18, 2),\n    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,\n    ValidTo   DATETIME2 GENERATED ALWAYS AS ROW END   NOT NULL,\n    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)\n)\nWITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductsHistory));\n\n-- Mỗi UPDATE tự động lưu version cũ vào ProductsHistory\n\n-- Query data ngày 2026-01-01\nSELECT * FROM Products\n    FOR SYSTEM_TIME AS OF '2026-01-01';\n\n-- Tất cả version từng tồn tại\nSELECT * FROM Products\n    FOR SYSTEM_TIME ALL\nWHERE Id = 1;\n",[471,1517,1518,1523,1527,1532,1537,1542,1547,1552,1556,1561,1565,1570,1574,1579,1584,1589,1593,1598,1602,1607],{"__ignoreMap":469},[474,1519,1520],{"class":476,"line":477},[474,1521,1522],{},"CREATE TABLE Products (\n",[474,1524,1525],{"class":476,"line":483},[474,1526,1326],{},[474,1528,1529],{"class":476,"line":489},[474,1530,1531],{},"    Name NVARCHAR(200) NOT NULL,\n",[474,1533,1534],{"class":476,"line":496},[474,1535,1536],{},"    Price DECIMAL(18, 2),\n",[474,1538,1539],{"class":476,"line":502},[474,1540,1541],{},"    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,\n",[474,1543,1544],{"class":476,"line":508},[474,1545,1546],{},"    ValidTo   DATETIME2 GENERATED ALWAYS AS ROW END   NOT NULL,\n",[474,1548,1549],{"class":476,"line":513},[474,1550,1551],{},"    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)\n",[474,1553,1554],{"class":476,"line":519},[474,1555,1418],{},[474,1557,1558],{"class":476,"line":525},[474,1559,1560],{},"WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductsHistory));\n",[474,1562,1563],{"class":476,"line":530},[474,1564,493],{"emptyLinePlaceholder":492},[474,1566,1567],{"class":476,"line":536},[474,1568,1569],{},"-- Mỗi UPDATE tự động lưu version cũ vào ProductsHistory\n",[474,1571,1572],{"class":476,"line":542},[474,1573,493],{"emptyLinePlaceholder":492},[474,1575,1576],{"class":476,"line":548},[474,1577,1578],{},"-- Query data ngày 2026-01-01\n",[474,1580,1581],{"class":476,"line":553},[474,1582,1583],{},"SELECT * FROM Products\n",[474,1585,1586],{"class":476,"line":559},[474,1587,1588],{},"    FOR SYSTEM_TIME AS OF '2026-01-01';\n",[474,1590,1591],{"class":476,"line":565},[474,1592,493],{"emptyLinePlaceholder":492},[474,1594,1595],{"class":476,"line":571},[474,1596,1597],{},"-- Tất cả version từng tồn tại\n",[474,1599,1600],{"class":476,"line":576},[474,1601,1583],{},[474,1603,1604],{"class":476,"line":582},[474,1605,1606],{},"    FOR SYSTEM_TIME ALL\n",[474,1608,1609],{"class":476,"line":588},[474,1610,1461],{},[608,1612,1613],{"color":1008,"icon":683},"⭐ Temporal Table cực mạnh cho audit log, undo, compliance. Đáng học cho fresher muốn nổi bật.",[427,1615,1617],{"id":1616},"_8-columnstore-index-cho-analytics","8. Columnstore Index — cho analytics",[464,1619,1621],{"className":466,"code":1620,"language":468,"meta":469,"style":469},"-- Cho bảng analytics rất lớn, query aggregate\nCREATE CLUSTERED COLUMNSTORE INDEX CCI_Sales ON Sales;\n\n-- Hoặc non-clustered columnstore (OLTP có lẫn analytics)\nCREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_Sales ON Sales(Year, Month, Total);\n",[471,1622,1623,1628,1633,1637,1642],{"__ignoreMap":469},[474,1624,1625],{"class":476,"line":477},[474,1626,1627],{},"-- Cho bảng analytics rất lớn, query aggregate\n",[474,1629,1630],{"class":476,"line":483},[474,1631,1632],{},"CREATE CLUSTERED COLUMNSTORE INDEX CCI_Sales ON Sales;\n",[474,1634,1635],{"class":476,"line":489},[474,1636,493],{"emptyLinePlaceholder":492},[474,1638,1639],{"class":476,"line":496},[474,1640,1641],{},"-- Hoặc non-clustered columnstore (OLTP có lẫn analytics)\n",[474,1643,1644],{"class":476,"line":502},[474,1645,1646],{},"CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_Sales ON Sales(Year, Month, Total);\n",[613,1648,1649,1650,1653],{},"Compress ~10x, query aggregate ",[446,1651,1652],{},"nhanh 10–100x"," so với rowstore. Trade-off: chậm cho single-row lookup.",[427,1655,1657],{"id":1656},"_9-partitioning","9. Partitioning",[464,1659,1661],{"className":466,"code":1660,"language":468,"meta":469,"style":469},"-- Partition function chia theo year\nCREATE PARTITION FUNCTION pf_OrderYear (INT)\nAS RANGE LEFT FOR VALUES (2023, 2024, 2025);\n\nCREATE PARTITION SCHEME ps_OrderYear\nAS PARTITION pf_OrderYear ALL TO ([PRIMARY]);\n\nCREATE TABLE Orders (\n    Id INT, Year INT, ...\n) ON ps_OrderYear(Year);\n",[471,1662,1663,1668,1673,1678,1682,1687,1692,1696,1701,1706],{"__ignoreMap":469},[474,1664,1665],{"class":476,"line":477},[474,1666,1667],{},"-- Partition function chia theo year\n",[474,1669,1670],{"class":476,"line":483},[474,1671,1672],{},"CREATE PARTITION FUNCTION pf_OrderYear (INT)\n",[474,1674,1675],{"class":476,"line":489},[474,1676,1677],{},"AS RANGE LEFT FOR VALUES (2023, 2024, 2025);\n",[474,1679,1680],{"class":476,"line":496},[474,1681,493],{"emptyLinePlaceholder":492},[474,1683,1684],{"class":476,"line":502},[474,1685,1686],{},"CREATE PARTITION SCHEME ps_OrderYear\n",[474,1688,1689],{"class":476,"line":508},[474,1690,1691],{},"AS PARTITION pf_OrderYear ALL TO ([PRIMARY]);\n",[474,1693,1694],{"class":476,"line":513},[474,1695,493],{"emptyLinePlaceholder":492},[474,1697,1698],{"class":476,"line":519},[474,1699,1700],{},"CREATE TABLE Orders (\n",[474,1702,1703],{"class":476,"line":525},[474,1704,1705],{},"    Id INT, Year INT, ...\n",[474,1707,1708],{"class":476,"line":530},[474,1709,1710],{},") ON ps_OrderYear(Year);\n",[613,1712,1713],{},"Dùng khi bảng cực lớn (> 100M row) cần archive theo thời gian, hoặc query luôn filter theo partition key.",[427,1715,1717],{"id":1716},"_10-sql-server-đặc-thù-nhớ-để-khỏi-confused-khi-sang-postgresmysql","10. SQL Server đặc thù — nhớ để khỏi confused khi sang Postgres\u002FMySQL",[864,1719,1720,1731],{},[867,1721,1722],{},[870,1723,1724,1726,1728],{},[873,1725],{},[873,1727,168],{},[873,1729,1730],{},"Postgres \u002F MySQL",[883,1732,1733,1748,1768,1788,1806,1827,1844,1860,1876,1893,1908],{},[870,1734,1735,1738,1743],{},[888,1736,1737],{},"Identifier quote",[888,1739,1740],{},[471,1741,1742],{},"[Name]",[888,1744,1745],{},[471,1746,1747],{},"\"Name\"",[870,1749,1750,1753,1758],{},[888,1751,1752],{},"Auto-increment",[888,1754,1755],{},[471,1756,1757],{},"IDENTITY(1,1)",[888,1759,1760,1763,1764,1767],{},[471,1761,1762],{},"SERIAL"," (PG), ",[471,1765,1766],{},"AUTO_INCREMENT"," (MySQL)",[870,1769,1770,1773,1782],{},[888,1771,1772],{},"String",[888,1774,1775,1778,1779],{},[471,1776,1777],{},"N'text'"," (Unicode), ",[471,1780,1781],{},"'ascii'",[888,1783,1784,1787],{},[471,1785,1786],{},"'text'"," (UTF-8 default)",[870,1789,1790,1793,1801],{},[888,1791,1792],{},"Limit",[888,1794,1795,628,1798],{},[471,1796,1797],{},"TOP N",[471,1799,1800],{},"OFFSET ... FETCH",[888,1802,1803],{},[471,1804,1805],{},"LIMIT N OFFSET M",[870,1807,1808,1811,1819],{},[888,1809,1810],{},"Now",[888,1812,1813,628,1816],{},[471,1814,1815],{},"SYSUTCDATETIME()",[471,1817,1818],{},"GETDATE()",[888,1820,1821,628,1824],{},[471,1822,1823],{},"NOW()",[471,1825,1826],{},"CURRENT_TIMESTAMP",[870,1828,1829,1832,1841],{},[888,1830,1831],{},"Concat",[888,1833,1834,1837,1838],{},[471,1835,1836],{},"+"," hoặc ",[471,1839,1840],{},"CONCAT()",[888,1842,1843],{},"`",[870,1845,1846,1849,1855],{},[888,1847,1848],{},"Boolean",[888,1850,1851,1854],{},[471,1852,1853],{},"BIT"," (0\u002F1)",[888,1856,1857],{},[471,1858,1859],{},"BOOLEAN",[870,1861,1862,1865,1870],{},[888,1863,1864],{},"Default schema",[888,1866,1867],{},[471,1868,1869],{},"dbo.",[888,1871,1872,1875],{},[471,1873,1874],{},"public."," (PG), không có (MySQL)",[870,1877,1878,1881,1887],{},[888,1879,1880],{},"Batch sep",[888,1882,1883,1886],{},[471,1884,1885],{},"GO"," (SSMS only)",[888,1888,1889,1892],{},[471,1890,1891],{},";"," thường",[870,1894,1895,1898,1903],{},[888,1896,1897],{},"IF",[888,1899,1900],{},[471,1901,1902],{},"IF ... BEGIN ... END",[888,1904,1905],{},[471,1906,1907],{},"CASE WHEN",[870,1909,1910,1913,1916],{},[888,1911,1912],{},"Schema in DB",[888,1914,1915],{},"DB có nhiều schema",[888,1917,1918],{},"DB ≈ schema",[427,1920,1922],{"id":1921},"_11-vector-index-diskann-tìm-kiếm-vector-sql-server-2025","11. Vector Index & DiskANN — tìm kiếm vector (SQL Server 2025)",[613,1924,1925,1926,1929,1930,1933],{},"SQL Server 2025 giới thiệu ",[446,1927,1928],{},"Vector Index"," dùng thuật toán ",[446,1931,1932],{},"DiskANN"," (Disk-based Approximate Nearest Neighbor) của Microsoft — cho phép tìm kiếm similarity search trên dữ liệu vector ngay trong SQL Server, không cần vector database riêng.",[432,1935,1937],{"id":1936},"diskann-là-gì","DiskANN là gì?",[613,1939,1940,1941,1944],{},"DiskANN là thuật toán ANN do Microsoft Research phát triển, tối ưu cho ",[446,1942,1943],{},"SSD-based storage",". Khác với HNSW (Hierarchical Navigable Small World) phải giữ toàn bộ index trong RAM, DiskANN lưu graph trên disk và chỉ load phần cần thiết vào memory khi query.",[864,1946,1947,1960],{},[867,1948,1949],{},[870,1950,1951,1954,1957],{},[873,1952,1953],{},"Tiêu chí",[873,1955,1956],{},"HNSW (in-memory)",[873,1958,1959],{},"DiskANN (SQL Server 2025)",[883,1961,1962,1976,1990,2004,2018],{},[870,1963,1964,1967,1970],{},[888,1965,1966],{},"Bộ nhớ",[888,1968,1969],{},"Giữ toàn bộ graph trong RAM",[888,1971,1972,1975],{},[446,1973,1974],{},"Ít hơn ~90% RAM"," so với HNSW",[870,1977,1978,1981,1984],{},[888,1979,1980],{},"Lưu trữ",[888,1982,1983],{},"Không tối ưu cho disk",[888,1985,1986,1987],{},"Tối ưu cho ",[446,1988,1989],{},"SSD NVMe",[870,1991,1992,1995,1998],{},[888,1993,1994],{},"Quy mô",[888,1996,1997],{},"Giới hạn bởi RAM",[888,1999,2000,2003],{},[446,2001,2002],{},"Tỷ vector"," (billion-scale)",[870,2005,2006,2009,2012],{},[888,2007,2008],{},"Độ trễ",[888,2010,2011],{},"Microseconds",[888,2013,2014,2017],{},[446,2015,2016],{},"Milliseconds"," (vẫn cực nhanh)",[870,2019,2020,2023,2026],{},[888,2021,2022],{},"Chi phí hạ tầng",[888,2024,2025],{},"RAM đắt",[888,2027,2028],{},"SSD rẻ hơn nhiều",[432,2030,2032],{"id":2031},"cú-pháp-tạo-vector-index","Cú pháp tạo Vector Index",[464,2034,2036],{"className":466,"code":2035,"language":468,"meta":469,"style":469},"-- Bước 1: Tạo bảng với cột vector\n-- Dùng kiểu VECTOR(n) — n là số dimensions (vd: OpenAI ada-002 = 1536)\nCREATE TABLE ProductEmbeddings (\n    ProductId INT PRIMARY KEY,\n    ProductName NVARCHAR(200),\n    Embedding VECTOR(1536)\n);\n\n-- Bước 2: Tạo vector index\nCREATE VECTOR INDEX IX_Product_Vector\nON ProductEmbeddings(Embedding)\nWITH (DISTANCE_METRIC = 'cosine');   -- cosine | euclidean | dot\n\n-- Bước 3: Query similarity search\nDECLARE @QueryEmbedding VECTOR(1536) = 0x...;\n\nSELECT TOP 5\n    ProductName,\n    VECTOR_DISTANCE(Embedding, @QueryEmbedding, 'cosine') AS Similarity\nFROM ProductEmbeddings\nORDER BY Similarity\nOFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;\n",[471,2037,2038,2043,2048,2053,2058,2063,2068,2072,2076,2081,2086,2091,2096,2100,2105,2110,2114,2119,2124,2129,2134,2139],{"__ignoreMap":469},[474,2039,2040],{"class":476,"line":477},[474,2041,2042],{},"-- Bước 1: Tạo bảng với cột vector\n",[474,2044,2045],{"class":476,"line":483},[474,2046,2047],{},"-- Dùng kiểu VECTOR(n) — n là số dimensions (vd: OpenAI ada-002 = 1536)\n",[474,2049,2050],{"class":476,"line":489},[474,2051,2052],{},"CREATE TABLE ProductEmbeddings (\n",[474,2054,2055],{"class":476,"line":496},[474,2056,2057],{},"    ProductId INT PRIMARY KEY,\n",[474,2059,2060],{"class":476,"line":502},[474,2061,2062],{},"    ProductName NVARCHAR(200),\n",[474,2064,2065],{"class":476,"line":508},[474,2066,2067],{},"    Embedding VECTOR(1536)\n",[474,2069,2070],{"class":476,"line":513},[474,2071,1336],{},[474,2073,2074],{"class":476,"line":519},[474,2075,493],{"emptyLinePlaceholder":492},[474,2077,2078],{"class":476,"line":525},[474,2079,2080],{},"-- Bước 2: Tạo vector index\n",[474,2082,2083],{"class":476,"line":530},[474,2084,2085],{},"CREATE VECTOR INDEX IX_Product_Vector\n",[474,2087,2088],{"class":476,"line":536},[474,2089,2090],{},"ON ProductEmbeddings(Embedding)\n",[474,2092,2093],{"class":476,"line":542},[474,2094,2095],{},"WITH (DISTANCE_METRIC = 'cosine');   -- cosine | euclidean | dot\n",[474,2097,2098],{"class":476,"line":548},[474,2099,493],{"emptyLinePlaceholder":492},[474,2101,2102],{"class":476,"line":553},[474,2103,2104],{},"-- Bước 3: Query similarity search\n",[474,2106,2107],{"class":476,"line":559},[474,2108,2109],{},"DECLARE @QueryEmbedding VECTOR(1536) = 0x...;\n",[474,2111,2112],{"class":476,"line":565},[474,2113,493],{"emptyLinePlaceholder":492},[474,2115,2116],{"class":476,"line":571},[474,2117,2118],{},"SELECT TOP 5\n",[474,2120,2121],{"class":476,"line":576},[474,2122,2123],{},"    ProductName,\n",[474,2125,2126],{"class":476,"line":582},[474,2127,2128],{},"    VECTOR_DISTANCE(Embedding, @QueryEmbedding, 'cosine') AS Similarity\n",[474,2130,2131],{"class":476,"line":588},[474,2132,2133],{},"FROM ProductEmbeddings\n",[474,2135,2136],{"class":476,"line":593},[474,2137,2138],{},"ORDER BY Similarity\n",[474,2140,2141],{"class":476,"line":599},[474,2142,2143],{},"OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY;\n",[432,2145,2147],{"id":2146},"hạn-chế-hiện-tại-và-lưu-ý","Hạn chế hiện tại và lưu ý",[608,2149,2150,2153,2154,2157],{"color":682,"icon":769},[446,2151,2152],{},"Hạn chế quan trọng:"," Sau khi tạo vector index, bảng trở thành ",[446,2155,2156],{},"read-only",". Microsoft đang có bản fix trong Cumulative Update sắp tới. Khi phỏng vấn cần nêu được điểm này — thể hiện bạn đã thực sự dùng thử và cập nhật.",[432,2159,2161],{"id":2160},"use-case-thực-tế","Use-case thực tế",[608,2163,2164,2172],{"color":1008,"icon":683},[613,2165,686,2166,690,2169],{},[446,2167,2168],{},"Câu PV 2026:",[692,2170,2171],{},"\"Làm semantic search trong SQL Server thì dùng gì?\"",[696,2173,2174],{},[613,2175,2176,2177,2180,2181,2184],{},"\"SQL Server 2025 có Vector Index với DiskANN. Lưu embedding vào cột ",[471,2178,2179],{},"VECTOR(n)",", tạo index với distance metric phù hợp (cosine\u002Feuclidean\u002Fdot), query bằng ",[471,2182,2183],{},"VECTOR_DISTANCE",". DiskANN tiết kiệm ~90% RAM so với in-memory HNSW, chạy được billion-scale trên SSD với millisecond latency. Hạn chế hiện tại là bảng read-only sau khi tạo index — cần lưu ý trong thiết kế.\"",[613,2186,2187],{},[446,2188,2189],{},"Các use-case chính:",[619,2191,2192,2198,2204,2210],{},[622,2193,2194,2197],{},[446,2195,2196],{},"Semantic Search:"," Tìm sản phẩm\u002Fbài viết theo ý nghĩa, không phải keyword.",[622,2199,2200,2203],{},[446,2201,2202],{},"Image Similarity:"," Tìm ảnh tương tự dựa trên embedding từ model vision.",[622,2205,2206,2209],{},[446,2207,2208],{},"Recommendation:"," Gợi ý sản phẩm dựa trên vector similarity.",[622,2211,2212,2215],{},[446,2213,2214],{},"RAG (Retrieval-Augmented Generation):"," Hybrid search kết hợp full-text + vector trong cùng một query.",[427,2217,2219],{"id":2218},"_12-json-index-index-chuyên-biệt-cho-cột-json-sql-server-2025-preview","12. JSON Index — index chuyên biệt cho cột JSON (SQL Server 2025 Preview)",[613,2221,1925,2222,2225,2226,638],{},[446,2223,2224],{},"JSON Index"," — loại index mới được thiết kế riêng cho cột JSON, cho phép đánh index trên các path cụ thể bên trong JSON document. Hiện đang trong giai đoạn ",[446,2227,2228],{},"Preview",[432,2230,2232],{"id":2231},"so-sánh-với-cách-cũ","So sánh với cách cũ",[864,2234,2235,2248],{},[867,2236,2237],{},[870,2238,2239,2242,2245],{},[873,2240,2241],{},"Cách làm",[873,2243,2244],{},"Trước 2025",[873,2246,2247],{},"SQL Server 2025",[883,2249,2250,2263,2274,2287],{},[870,2251,2252,2255,2258],{},[888,2253,2254],{},"Index JSON path",[888,2256,2257],{},"Computed column + regular index",[888,2259,2260,2262],{},[446,2261,2224],{}," trực tiếp",[870,2264,2265,2268,2271],{},[888,2266,2267],{},"Maintenance",[888,2269,2270],{},"Phải maintain computed column",[888,2272,2273],{},"Tự động — index hiểu JSON structure",[870,2275,2276,2279,2282],{},[888,2277,2278],{},"Performance",[888,2280,2281],{},"Phải parse JSON lúc query",[888,2283,2284],{},[446,2285,2286],{},"Index đã chứa giá trị tại path",[870,2288,2289,2292,2295],{},[888,2290,2291],{},"Flexibility",[888,2293,2294],{},"Mỗi path = 1 computed column",[888,2296,2297],{},"1 index cover nhiều path",[464,2299,2301],{"className":466,"code":2300,"language":468,"meta":469,"style":469},"-- Cách cũ: computed column + index thường (vẫn hoạt động)\nALTER TABLE Events ADD EventType AS JSON_VALUE(Payload, '$.type');\nCREATE INDEX IX_EventType ON Events(EventType);\n\n-- SQL Server 2025: JSON Index (Preview)\nCREATE JSON INDEX IX_Events_Payload\nON Events(Payload)\nWITH (\n    JSON_PATH '$.type',\n    JSON_PATH '$.user',\n    JSON_PATH '$.timestamp'\n);\n",[471,2302,2303,2308,2313,2318,2322,2327,2332,2337,2341,2346,2351,2356],{"__ignoreMap":469},[474,2304,2305],{"class":476,"line":477},[474,2306,2307],{},"-- Cách cũ: computed column + index thường (vẫn hoạt động)\n",[474,2309,2310],{"class":476,"line":483},[474,2311,2312],{},"ALTER TABLE Events ADD EventType AS JSON_VALUE(Payload, '$.type');\n",[474,2314,2315],{"class":476,"line":489},[474,2316,2317],{},"CREATE INDEX IX_EventType ON Events(EventType);\n",[474,2319,2320],{"class":476,"line":496},[474,2321,493],{"emptyLinePlaceholder":492},[474,2323,2324],{"class":476,"line":502},[474,2325,2326],{},"-- SQL Server 2025: JSON Index (Preview)\n",[474,2328,2329],{"class":476,"line":508},[474,2330,2331],{},"CREATE JSON INDEX IX_Events_Payload\n",[474,2333,2334],{"class":476,"line":513},[474,2335,2336],{},"ON Events(Payload)\n",[474,2338,2339],{"class":476,"line":519},[474,2340,1423],{},[474,2342,2343],{"class":476,"line":525},[474,2344,2345],{},"    JSON_PATH '$.type',\n",[474,2347,2348],{"class":476,"line":530},[474,2349,2350],{},"    JSON_PATH '$.user',\n",[474,2352,2353],{"class":476,"line":536},[474,2354,2355],{},"    JSON_PATH '$.timestamp'\n",[474,2357,2358],{"class":476,"line":542},[474,2359,1336],{},[608,2361,2362,2369],{"color":682,"icon":683},[613,2363,686,2364,690,2366],{},[446,2365,1013],{},[692,2367,2368],{},"\"JSON Index khác gì computed column + regular index?\"",[696,2370,2371],{},[613,2372,2373],{},"\"JSON Index hiểu cấu trúc JSON natively — engine không cần parse lại document mỗi lần query. Một index có thể cover nhiều path, không cần tạo riêng computed column cho từng path. Nhược điểm duy nhất: đang trong giai đoạn Preview, chưa khuyến khích cho production.\"",[427,2375,2377],{"id":2376},"_13-optimized-locking-tính-năng-performance-quan-trọng-nhất-sql-server-2025","13. Optimized Locking — tính năng performance quan trọng nhất SQL Server 2025",[613,2379,2380,2381,2384,2385,638],{},"Đây có lẽ là ",[446,2382,2383],{},"tính năng performance quan trọng nhất"," cho OLTP workload trong SQL Server 2025, với throughput cải thiện ",[446,2386,2387],{},"15-25%",[432,2389,2391],{"id":2390},"vấn-đề-truyền-thống","Vấn đề truyền thống",[613,2393,2394],{},"Trong SQL Server trước 2025:",[1089,2396,2397,2400,2407],{},[622,2398,2399],{},"Mỗi row lock chiếm một lượng memory nhất định trong Lock Manager.",[622,2401,2402,2403,2406],{},"Khi memory pressure cao (nhiều lock cùng lúc), engine ",[446,2404,2405],{},"escalate"," row locks thanh page lock, th?m chi table lock.",[622,2408,2409],{},"Lock escalation = gi?m concurrency, tang blocking, gi?m throughput.",[464,2411,2416],{"className":2412,"code":2414,"language":2415,"meta":469},[2413],"language-text","Row locks (chi tiết, nhiều concurrency)\n       |\n       | Lock escalation khi memory pressure\n       v\nPage locks (thô hơn, ít concurrency hơn)\n       |\n       v\nTable lock (chặn tất cả transaction khác)\n","text",[471,2417,2414],{"__ignoreMap":469},[432,2419,2421],{"id":2420},"sql-server-2025-thay-đổi-gì","SQL Server 2025 thay đổi gì",[864,2423,2424,2435],{},[867,2425,2426],{},[870,2427,2428,2431,2433],{},[873,2429,2430],{},"Khía cạnh",[873,2432,2244],{},[873,2434,2247],{},[883,2436,2437,2452,2465,2478,2491],{},[870,2438,2439,2442,2447],{},[888,2440,2441],{},"Lock escalation",[888,2443,2444],{},[446,2445,2446],{},"Bật mặc định",[888,2448,2449],{},[446,2450,2451],{},"Tắt mặc định",[870,2453,2454,2457,2460],{},[888,2455,2456],{},"Memory \u002F lock",[888,2458,2459],{},"~64 bytes",[888,2461,2462],{},[446,2463,2464],{},"~32 bytes (giảm ~50%)",[870,2466,2467,2470,2473],{},[888,2468,2469],{},"Row lock → table lock",[888,2471,2472],{},"Xảy ra thường xuyên",[888,2474,2475],{},[446,2476,2477],{},"Hầu như không xảy ra",[870,2479,2480,2483,2486],{},[888,2481,2482],{},"Concurrency",[888,2484,2485],{},"Bị giới hạn",[888,2487,2488],{},[446,2489,2490],{},"Cao hơn đáng kể",[870,2492,2493,2496,2499],{},[888,2494,2495],{},"Blocking chain",[888,2497,2498],{},"Dài, khó debug",[888,2500,2501],{},"Ngắn hơn nhiều",[464,2503,2505],{"className":466,"code":2504,"language":468,"meta":469,"style":469},"-- Kiểm tra lock escalation setting trên bảng (2025: thường đã OFF)\nSELECT name, is_lock_escalation_disabled\nFROM sys.tables\nWHERE name = 'Orders';\n\n-- Monitor locks hiện tại\nSELECT\n    request_session_id AS SPID,\n    resource_type,\n    resource_description,\n    request_mode,\n    request_status\nFROM sys.dm_tran_locks\nWHERE resource_database_id = DB_ID('LearnSqlServer');\n",[471,2506,2507,2512,2517,2522,2527,2531,2536,2540,2545,2550,2555,2560,2565,2570],{"__ignoreMap":469},[474,2508,2509],{"class":476,"line":477},[474,2510,2511],{},"-- Kiểm tra lock escalation setting trên bảng (2025: thường đã OFF)\n",[474,2513,2514],{"class":476,"line":483},[474,2515,2516],{},"SELECT name, is_lock_escalation_disabled\n",[474,2518,2519],{"class":476,"line":489},[474,2520,2521],{},"FROM sys.tables\n",[474,2523,2524],{"class":476,"line":496},[474,2525,2526],{},"WHERE name = 'Orders';\n",[474,2528,2529],{"class":476,"line":502},[474,2530,493],{"emptyLinePlaceholder":492},[474,2532,2533],{"class":476,"line":508},[474,2534,2535],{},"-- Monitor locks hiện tại\n",[474,2537,2538],{"class":476,"line":513},[474,2539,1369],{},[474,2541,2542],{"class":476,"line":519},[474,2543,2544],{},"    request_session_id AS SPID,\n",[474,2546,2547],{"class":476,"line":525},[474,2548,2549],{},"    resource_type,\n",[474,2551,2552],{"class":476,"line":530},[474,2553,2554],{},"    resource_description,\n",[474,2556,2557],{"class":476,"line":536},[474,2558,2559],{},"    request_mode,\n",[474,2561,2562],{"class":476,"line":542},[474,2563,2564],{},"    request_status\n",[474,2566,2567],{"class":476,"line":548},[474,2568,2569],{},"FROM sys.dm_tran_locks\n",[474,2571,2572],{"class":476,"line":553},[474,2573,2574],{},"WHERE resource_database_id = DB_ID('LearnSqlServer');\n",[432,2576,2578],{"id":2577},"laq-lock-after-qualification","LAQ — Lock After Qualification",[608,2580,2581,2591,2605],{"color":1008,"icon":268},[613,2582,686,2583,2586,2587,2590],{},[446,2584,2585],{},"LAQ (Lock After Qualification)"," là cải tiến lớn nhất trong Optimized Locking. Engine ",[446,2588,2589],{},"áp WHERE filter trước, lock sau"," — thay vì lock tất cả row trong range rồi mới filter.",[613,2592,2593,2596,2597,2600,2601,2604],{},[446,2594,2595],{},"Trước 2025:"," Scan range -> Lock tất cả row trong range -> Apply WHERE -> Trả kết quả\n",[446,2598,2599],{},"2025 với LAQ:"," Scan range -> Apply WHERE -> ",[446,2602,2603],{},"Chỉ lock row qualify"," -> Trả kết quả",[613,2606,2607],{},"Kết quả: giảm lock contentions đáng kể, đặc biệt với query có WHERE chọn lọc cao trên bảng lớn.",[464,2609,2611],{"className":466,"code":2610,"language":468,"meta":469,"style":469},"-- Query này trong 2025 với LAQ:\n-- Chỉ lock những row có Status = 'Pending' AND Amount > 1000\n-- Thay vì lock toàn bộ range scan như trước đây\nUPDATE Orders\nSET Processed = 1\nWHERE Status = 'Pending' AND Amount > 1000;\n",[471,2612,2613,2618,2623,2628,2633,2638],{"__ignoreMap":469},[474,2614,2615],{"class":476,"line":477},[474,2616,2617],{},"-- Query này trong 2025 với LAQ:\n",[474,2619,2620],{"class":476,"line":483},[474,2621,2622],{},"-- Chỉ lock những row có Status = 'Pending' AND Amount > 1000\n",[474,2624,2625],{"class":476,"line":489},[474,2626,2627],{},"-- Thay vì lock toàn bộ range scan như trước đây\n",[474,2629,2630],{"class":476,"line":496},[474,2631,2632],{},"UPDATE Orders\n",[474,2634,2635],{"class":476,"line":502},[474,2636,2637],{},"SET Processed = 1\n",[474,2639,2640],{"class":476,"line":508},[474,2641,2642],{},"WHERE Status = 'Pending' AND Amount > 1000;\n",[608,2644,2645,2653],{"color":682,"icon":683},[613,2646,686,2647,690,2650],{},[446,2648,2649],{},"Câu PV Senior:",[692,2651,2652],{},"\"Optimized Locking trong SQL Server 2025 hoạt động thế nào?\"",[696,2654,2655],{},[613,2656,2657,2658,2661,2662,2665],{},"\"Ba thay đổi chính: (1) Lock escalation ",[446,2659,2660],{},"tắt mặc định",", giảm table-level blocking. (2) Memory mỗi lock giảm ~50%, cho phép nhiều row lock đồng thời hơn. (3) ",[446,2663,2664],{},"LAQ"," — lock chỉ áp dụng sau WHERE filter, giảm lock contentions. Tổng thể: OLTP throughput tăng 15-25%, đặc biệt với workload nhiều concurrent transactions.\"",[427,2667,2669],{"id":2668},"_14-tempdb-cải-tiến-sql-server-2025","14. TempDB cải tiến (SQL Server 2025)",[432,2671,2673],{"id":2672},"resource-governance-cho-tempdb","Resource Governance cho TempDB",[613,2675,2676,2677,2680],{},"SQL Server 2025 cho phép giới hạn dung lượng TempDB ",[446,2678,2679],{},"theo từng workload group"," — ngăn một query \"đói\" TempDB làm ảnh hưởng toàn bộ instance. Đây là tính năng quan trọng cho môi trường multi-tenant hoặc có nhiều workload khác nhau.",[464,2682,2684],{"className":466,"code":2683,"language":468,"meta":469,"style":469},"-- Giới hạn TempDB space cho workload group \"ReportUsers\"\nALTER WORKLOAD GROUP ReportUsers\nWITH (\n    REQUEST_MAX_MEMORY_GRANT_PERCENT = 25,\n    REQUEST_MAX_CPU_TIME_SEC = 300,\n    GROUP_MAX_TEMPDB_SPACE_MB = 20480   -- 2025 mới: giới hạn 20GB\n);\n",[471,2685,2686,2691,2696,2700,2705,2710,2715],{"__ignoreMap":469},[474,2687,2688],{"class":476,"line":477},[474,2689,2690],{},"-- Giới hạn TempDB space cho workload group \"ReportUsers\"\n",[474,2692,2693],{"class":476,"line":483},[474,2694,2695],{},"ALTER WORKLOAD GROUP ReportUsers\n",[474,2697,2698],{"class":476,"line":489},[474,2699,1423],{},[474,2701,2702],{"class":476,"line":496},[474,2703,2704],{},"    REQUEST_MAX_MEMORY_GRANT_PERCENT = 25,\n",[474,2706,2707],{"class":476,"line":502},[474,2708,2709],{},"    REQUEST_MAX_CPU_TIME_SEC = 300,\n",[474,2711,2712],{"class":476,"line":508},[474,2713,2714],{},"    GROUP_MAX_TEMPDB_SPACE_MB = 20480   -- 2025 mới: giới hạn 20GB\n",[474,2716,2717],{"class":476,"line":513},[474,2718,1336],{},[432,2720,2722],{"id":2721},"adr-cho-tempdb-accelerated-database-recovery","ADR cho TempDB (Accelerated Database Recovery)",[864,2724,2725,2737],{},[867,2726,2727],{},[870,2728,2729,2731,2734],{},[873,2730,1953],{},[873,2732,2733],{},"Không ADR",[873,2735,2736],{},"Có ADR (2025)",[883,2738,2739,2752,2765,2778],{},[870,2740,2741,2744,2747],{},[888,2742,2743],{},"Crash recovery",[888,2745,2746],{},"Vài giờ với TempDB lớn",[888,2748,2749],{},[446,2750,2751],{},"Vài phút",[870,2753,2754,2757,2760],{},[888,2755,2756],{},"Rollback transaction lớn",[888,2758,2759],{},"Tốn thời gian bằng thời gian chạy",[888,2761,2762],{},[446,2763,2764],{},"Gần như tức thì",[870,2766,2767,2770,2773],{},[888,2768,2769],{},"TempDB contention",[888,2771,2772],{},"Cao",[888,2774,2775],{},[446,2776,2777],{},"Giảm đáng kể",[870,2779,2780,2783,2786],{},[888,2781,2782],{},"Availability",[888,2784,2785],{},"Chờ recovery xong mới online",[888,2787,2788],{},[446,2789,2790],{},"Online nhanh hơn",[464,2792,2794],{"className":466,"code":2793,"language":468,"meta":469,"style":469},"-- Bật ADR cho database (ảnh hưởng cả TempDB behavior)\nALTER DATABASE LearnSqlServer\nSET ACCELERATED_DATABASE_RECOVERY = ON;\n",[471,2795,2796,2801,2806],{"__ignoreMap":469},[474,2797,2798],{"class":476,"line":477},[474,2799,2800],{},"-- Bật ADR cho database (ảnh hưởng cả TempDB behavior)\n",[474,2802,2803],{"class":476,"line":483},[474,2804,2805],{},"ALTER DATABASE LearnSqlServer\n",[474,2807,2808],{"class":476,"line":489},[474,2809,2810],{},"SET ACCELERATED_DATABASE_RECOVERY = ON;\n",[432,2812,2814],{"id":2813},"tmpfs-trên-linux-containers","tmpfs trên Linux containers",[608,2816,2817,2818,2821],{"color":610,"icon":683},"⭐ Trên Linux containers, SQL Server 2025 hỗ trợ đặt TempDB trên ",[446,2819,2820],{},"tmpfs"," (RAM disk). Kết hợp với ADR, TempDB không còn là bottleneck cho containerized workloads. Đây là điểm cộng khi phỏng vấn vị trí DevOps\u002FCloud Engineer.",[464,2823,2827],{"className":2824,"code":2825,"language":2826,"meta":469,"style":469},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Docker run với tmpfs cho TempDB\ndocker run -d \\\n  --name sql2025 \\\n  -e 'ACCEPT_EULA=Y' \\\n  -e 'MSSQL_SA_PASSWORD=YourStr0ngP@ss' \\\n  --tmpfs \u002Fvar\u002Fopt\u002Fmssql\u002Ftempdb:rw,noexec,nosuid,size=4g \\\n  -p 1433:1433 \\\n  mcr.microsoft.com\u002Fmssql\u002Fserver:2025-latest\n","bash",[471,2828,2829,2835,2852,2862,2879,2892,2902,2912],{"__ignoreMap":469},[474,2830,2831],{"class":476,"line":477},[474,2832,2834],{"class":2833},"sHwdD","# Docker run với tmpfs cho TempDB\n",[474,2836,2837,2841,2845,2848],{"class":476,"line":483},[474,2838,2840],{"class":2839},"sBMFI","docker",[474,2842,2844],{"class":2843},"sfazB"," run",[474,2846,2847],{"class":2843}," -d",[474,2849,2851],{"class":2850},"sTEyZ"," \\\n",[474,2853,2854,2857,2860],{"class":476,"line":489},[474,2855,2856],{"class":2843},"  --name",[474,2858,2859],{"class":2843}," sql2025",[474,2861,2851],{"class":2850},[474,2863,2864,2867,2871,2874,2877],{"class":476,"line":496},[474,2865,2866],{"class":2843},"  -e",[474,2868,2870],{"class":2869},"sMK4o"," '",[474,2872,2873],{"class":2843},"ACCEPT_EULA=Y",[474,2875,2876],{"class":2869},"'",[474,2878,2851],{"class":2850},[474,2880,2881,2883,2885,2888,2890],{"class":476,"line":502},[474,2882,2866],{"class":2843},[474,2884,2870],{"class":2869},[474,2886,2887],{"class":2843},"MSSQL_SA_PASSWORD=YourStr0ngP@ss",[474,2889,2876],{"class":2869},[474,2891,2851],{"class":2850},[474,2893,2894,2897,2900],{"class":476,"line":508},[474,2895,2896],{"class":2843},"  --tmpfs",[474,2898,2899],{"class":2843}," \u002Fvar\u002Fopt\u002Fmssql\u002Ftempdb:rw,noexec,nosuid,size=4g",[474,2901,2851],{"class":2850},[474,2903,2904,2907,2910],{"class":476,"line":513},[474,2905,2906],{"class":2843},"  -p",[474,2908,2909],{"class":2843}," 1433:1433",[474,2911,2851],{"class":2850},[474,2913,2914],{"class":476,"line":519},[474,2915,2916],{"class":2843},"  mcr.microsoft.com\u002Fmssql\u002Fserver:2025-latest\n",[427,2918,2920],{"id":2919},"_15-backup-restore-cải-tiến-sql-server-2025","15. Backup & Restore cải tiến (SQL Server 2025)",[432,2922,2924],{"id":2923},"zstd-compression-nén-nhanh-hơn-nhỏ-hơn","ZSTD Compression — nén nhanh hơn, nhỏ hơn",[613,2926,2927,2928,2931],{},"SQL Server 2025 thêm thuật toán nén ",[446,2929,2930],{},"ZSTD"," (Zstandard) bên cạnh MS_XPRESS truyền thống.",[864,2933,2934,2950],{},[867,2935,2936],{},[870,2937,2938,2941,2944,2947],{},[873,2939,2940],{},"Thuật toán",[873,2942,2943],{},"Tỉ lệ nén",[873,2945,2946],{},"Tốc độ nén",[873,2948,2949],{},"CPU usage",[883,2951,2952,2966],{},[870,2953,2954,2957,2960,2963],{},[888,2955,2956],{},"MS_XPRESS",[888,2958,2959],{},"Trung bình",[888,2961,2962],{},"Nhanh",[888,2964,2965],{},"Thấp",[870,2967,2968,2973,2978,2983],{},[888,2969,2970],{},[446,2971,2972],{},"ZSTD (2025)",[888,2974,2975],{},[446,2976,2977],{},"Tốt hơn 20-30%",[888,2979,2980],{},[446,2981,2982],{},"Nhanh hơn",[888,2984,2959],{},[464,2986,2988],{"className":466,"code":2987,"language":468,"meta":469,"style":469},"-- Backup với ZSTD compression (2025)\nBACKUP DATABASE LearnSqlServer\nTO DISK = N'D:\\Backups\\LearnSqlServer_2025.bak'\nWITH COMPRESSION, COMPRESSION_ALGORITHM = ZSTD;\n",[471,2989,2990,2995,3000,3005],{"__ignoreMap":469},[474,2991,2992],{"class":476,"line":477},[474,2993,2994],{},"-- Backup với ZSTD compression (2025)\n",[474,2996,2997],{"class":476,"line":483},[474,2998,2999],{},"BACKUP DATABASE LearnSqlServer\n",[474,3001,3002],{"class":476,"line":489},[474,3003,3004],{},"TO DISK = N'D:\\Backups\\LearnSqlServer_2025.bak'\n",[474,3006,3007],{"class":476,"line":496},[474,3008,3009],{},"WITH COMPRESSION, COMPRESSION_ALGORITHM = ZSTD;\n",[432,3011,3013],{"id":3012},"backup-trên-secondary-ag-replica","Backup trên Secondary AG Replica",[608,3015,686,3016,3019,3020,3023],{"color":1008,"icon":683},[446,3017,3018],{},"2025 mới:"," Có thể chạy ",[446,3021,3022],{},"FULL và DIFFERENTIAL backup trên secondary replica"," của Availability Group — offload hoàn toàn backup workload khỏi primary. Trước 2025 chỉ hỗ trợ COPY_ONLY backup trên secondary.",[464,3025,3027],{"className":466,"code":3026,"language":468,"meta":469,"style":469},"-- Chạy full backup trên secondary replica (2025)\n-- Không còn bị giới hạn COPY_ONLY\nBACKUP DATABASE LearnSqlServer\nTO DISK = N'\\\\BackupServer\\Share\\LearnSqlServer_Full.bak'\nWITH COMPRESSION, COMPRESSION_ALGORITHM = ZSTD;\n",[471,3028,3029,3034,3039,3043,3048],{"__ignoreMap":469},[474,3030,3031],{"class":476,"line":477},[474,3032,3033],{},"-- Chạy full backup trên secondary replica (2025)\n",[474,3035,3036],{"class":476,"line":483},[474,3037,3038],{},"-- Không còn bị giới hạn COPY_ONLY\n",[474,3040,3041],{"class":476,"line":489},[474,3042,2999],{},[474,3044,3045],{"class":476,"line":496},[474,3046,3047],{},"TO DISK = N'\\\\BackupServer\\Share\\LearnSqlServer_Full.bak'\n",[474,3049,3050],{"class":476,"line":502},[474,3051,3009],{},[432,3053,3055],{"id":3054},"abort_query_execution","ABORT_QUERY_EXECUTION",[613,3057,3058,3059,3062],{},"Khi kill một session đang chạy query nặng, SQL Server 2025 có option mới để dừng query execution ",[446,3060,3061],{},"ngay lập tức"," thay vì phải chờ rollback toàn bộ transaction.",[464,3064,3066],{"className":466,"code":3065,"language":468,"meta":469,"style":469},"-- Kill với abort query execution (2025)\nKILL 54 WITH ABORT_QUERY_EXECUTION;\n",[471,3067,3068,3073],{"__ignoreMap":469},[474,3069,3070],{"class":476,"line":477},[474,3071,3072],{},"-- Kill với abort query execution (2025)\n",[474,3074,3075],{"class":476,"line":483},[474,3076,3077],{},"KILL 54 WITH ABORT_QUERY_EXECUTION;\n",[427,3079,3081],{"id":3080},"_16-sql-server-on-linux-2025","16. SQL Server on Linux 2025",[432,3083,3085],{"id":3084},"hỗ-trợ-os-mở-rộng","Hỗ trợ OS mở rộng",[864,3087,3088,3100],{},[867,3089,3090],{},[870,3091,3092,3095,3098],{},[873,3093,3094],{},"OS",[873,3096,3097],{},"SQL Server 2022",[873,3099,2247],{},[883,3101,3102,3112,3124,3133,3142,3153],{},[870,3103,3104,3107,3110],{},[888,3105,3106],{},"Red Hat 8.x",[888,3108,3109],{},"Co",[888,3111,3109],{},[870,3113,3114,3117,3120],{},[888,3115,3116],{},"Red Hat 9.x",[888,3118,3119],{},"Khong",[888,3121,3122],{},[446,3123,3109],{},[870,3125,3126,3129,3131],{},[888,3127,3128],{},"Ubuntu 20.04",[888,3130,3109],{},[888,3132,3109],{},[870,3134,3135,3138,3140],{},[888,3136,3137],{},"Ubuntu 22.04",[888,3139,3109],{},[888,3141,3109],{},[870,3143,3144,3147,3149],{},[888,3145,3146],{},"Ubuntu 24.04",[888,3148,3119],{},[888,3150,3151],{},[446,3152,3109],{},[870,3154,3155,3158,3160],{},[888,3156,3157],{},"Container",[888,3159,3109],{},[888,3161,3162],{},[446,3163,3164],{},"Co + tmpfs tempdb",[432,3166,3168],{"id":3167},"container-optimization","Container optimization",[464,3170,3172],{"className":2824,"code":3171,"language":2826,"meta":469,"style":469},"# SQL Server 2025 container: cgroup v2 + tmpfs tempdb\ndocker run -d \\\n  --name sql2025 \\\n  --cgroup-parent=\u002Fsqlserver.slice \\     # cgroup v2 support\n  --tmpfs \u002Fvar\u002Fopt\u002Fmssql\u002Ftempdb:size=8g \\\n  -e 'ACCEPT_EULA=Y' \\\n  -e 'MSSQL_SA_PASSWORD=YourStr0ngP@ss' \\\n  -p 1433:1433 \\\n  mcr.microsoft.com\u002Fmssql\u002Fserver:2025-latest\n",[471,3173,3174,3179,3189,3197,3208,3217,3229,3241,3249],{"__ignoreMap":469},[474,3175,3176],{"class":476,"line":477},[474,3177,3178],{"class":2833},"# SQL Server 2025 container: cgroup v2 + tmpfs tempdb\n",[474,3180,3181,3183,3185,3187],{"class":476,"line":483},[474,3182,2840],{"class":2839},[474,3184,2844],{"class":2843},[474,3186,2847],{"class":2843},[474,3188,2851],{"class":2850},[474,3190,3191,3193,3195],{"class":476,"line":489},[474,3192,2856],{"class":2843},[474,3194,2859],{"class":2843},[474,3196,2851],{"class":2850},[474,3198,3199,3202,3205],{"class":476,"line":496},[474,3200,3201],{"class":2843},"  --cgroup-parent=\u002Fsqlserver.slice",[474,3203,3204],{"class":2850}," \\     ",[474,3206,3207],{"class":2833},"# cgroup v2 support\n",[474,3209,3210,3212,3215],{"class":476,"line":502},[474,3211,2896],{"class":2839},[474,3213,3214],{"class":2843}," \u002Fvar\u002Fopt\u002Fmssql\u002Ftempdb:size=8g",[474,3216,2851],{"class":2850},[474,3218,3219,3221,3223,3225,3227],{"class":476,"line":508},[474,3220,2866],{"class":2843},[474,3222,2870],{"class":2869},[474,3224,2873],{"class":2843},[474,3226,2876],{"class":2869},[474,3228,2851],{"class":2850},[474,3230,3231,3233,3235,3237,3239],{"class":476,"line":513},[474,3232,2866],{"class":2843},[474,3234,2870],{"class":2869},[474,3236,2887],{"class":2843},[474,3238,2876],{"class":2869},[474,3240,2851],{"class":2850},[474,3242,3243,3245,3247],{"class":476,"line":519},[474,3244,2906],{"class":2843},[474,3246,2909],{"class":2843},[474,3248,2851],{"class":2850},[474,3250,3251],{"class":476,"line":525},[474,3252,2916],{"class":2843},[432,3254,3256],{"id":3255},"polybase-trên-linux","PolyBase trên Linux",[613,3258,3259,3260,3263],{},"SQL Server 2025 trên Linux hỗ trợ đầy đủ ",[446,3261,3262],{},"PolyBase"," — truy vấn dữ liệu từ nhiều nguồn (Hadoop, Azure Blob, S3-compatible, ODBC) bằng T-SQL.",[464,3265,3267],{"className":466,"code":3266,"language":468,"meta":469,"style":469},"-- PolyBase: query file CSV\u002FParquet trên S3 từ SQL Server Linux\nCREATE EXTERNAL DATA SOURCE MyS3\nWITH (\n    LOCATION = 's3:\u002F\u002Fmy-bucket\u002F',\n    CREDENTIAL = S3Credential\n);\n\nSELECT * FROM OPENROWSET(\n    BULK 'sales\u002F2025\u002F*.parquet',\n    DATA_SOURCE = 'MyS3',\n    FORMAT = 'PARQUET'\n) AS Sales;\n",[471,3268,3269,3274,3279,3283,3288,3293,3297,3301,3306,3311,3316,3321],{"__ignoreMap":469},[474,3270,3271],{"class":476,"line":477},[474,3272,3273],{},"-- PolyBase: query file CSV\u002FParquet trên S3 từ SQL Server Linux\n",[474,3275,3276],{"class":476,"line":483},[474,3277,3278],{},"CREATE EXTERNAL DATA SOURCE MyS3\n",[474,3280,3281],{"class":476,"line":489},[474,3282,1423],{},[474,3284,3285],{"class":476,"line":496},[474,3286,3287],{},"    LOCATION = 's3:\u002F\u002Fmy-bucket\u002F',\n",[474,3289,3290],{"class":476,"line":502},[474,3291,3292],{},"    CREDENTIAL = S3Credential\n",[474,3294,3295],{"class":476,"line":508},[474,3296,1336],{},[474,3298,3299],{"class":476,"line":513},[474,3300,493],{"emptyLinePlaceholder":492},[474,3302,3303],{"class":476,"line":519},[474,3304,3305],{},"SELECT * FROM OPENROWSET(\n",[474,3307,3308],{"class":476,"line":525},[474,3309,3310],{},"    BULK 'sales\u002F2025\u002F*.parquet',\n",[474,3312,3313],{"class":476,"line":530},[474,3314,3315],{},"    DATA_SOURCE = 'MyS3',\n",[474,3317,3318],{"class":476,"line":536},[474,3319,3320],{},"    FORMAT = 'PARQUET'\n",[474,3322,3323],{"class":476,"line":542},[474,3324,3325],{},") AS Sales;\n",[432,3327,3329],{"id":3328},"active-directory-integration","Active Directory Integration",[613,3331,3332,3333,628,3336,3339],{},"SQL Server 2025 trên Linux có cải thiện đáng kể về AD integration — hỗ trợ ",[446,3334,3335],{},"Kerberos constrained delegation",[446,3337,3338],{},"group-managed service accounts (gMSA)",", và automatic keytab rotation.",[608,3341,686,3342,690,3345,3348],{"color":682,"icon":683},[446,3343,3344],{},"Câu PV DevOps:",[692,3346,3347],{},"\"SQL Server 2025 trên Linux khác gì 2022?\""," — Điểm khác chính: cgroup v2, tmpfs tempdb, PolyBase đầy đủ, AD integration cải thiện (gMSA, auto keytab), hỗ trợ RHEL 9 & Ubuntu 24.04.",[427,3350,3352],{"id":3351},"_17-azure-sql-cloud-integration-2025","17. Azure SQL & Cloud Integration (2025)",[432,3354,3356],{"id":3355},"sql-mcp-server-endpoint-public-preview","SQL MCP Server Endpoint (Public Preview)",[613,3358,3359,3360,3363,3364,638],{},"Đây là tính năng quan trọng cho ",[446,3361,3362],{},"AI Agent"," ecosystem. SQL MCP Server cho phép AI agents (Claude, ChatGPT, Copilot...) kết nối trực tiếp vào SQL database qua giao thức ",[446,3365,3366],{},"Model Context Protocol (MCP)",[464,3368,3371],{"className":3369,"code":3370,"language":2415,"meta":469},[2413],"AI Agent (Claude \u002F GPT \u002F Copilot)\n       |\n       | MCP Protocol (standardized)\n       v\nSQL MCP Server\n       |\n       v\nAzure SQL DB \u002F SQL Server 2025\n",[471,3372,3370],{"__ignoreMap":469},[608,3374,686,3375,3378],{"color":1008,"icon":683},[446,3376,3377],{},"Xu hướng 2026:"," SQL MCP Server là cầu nối giữa AI agent và database. Thay vì viết REST API trung gian, agent có thể trực tiếp query, explore schema, và học từ data qua giao thức chuẩn. Đây là điểm nhấn khi phỏng vấn vị trí Architect hoặc Data Engineer.",[432,3380,3382],{"id":3381},"azure-sql-db-hyperscale-mở-rộng","Azure SQL DB Hyperscale mở rộng",[864,3384,3385,3397],{},[867,3386,3387],{},[870,3388,3389,3392,3394],{},[873,3390,3391],{},"Cấu hình",[873,3393,2244],{},[873,3395,3396],{},"2025",[883,3398,3399,3412,3422,3432],{},[870,3400,3401,3404,3407],{},[888,3402,3403],{},"vCores tối đa",[888,3405,3406],{},"128 vCores",[888,3408,3409],{},[446,3410,3411],{},"160 và 192 vCores",[870,3413,3414,3417,3420],{},[888,3415,3416],{},"Storage tối đa",[888,3418,3419],{},"100 TB",[888,3421,3419],{},[870,3423,3424,3427,3430],{},[888,3425,3426],{},"Read replicas",[888,3428,3429],{},"30",[888,3431,3429],{},[870,3433,3434,3437,3439],{},[888,3435,3436],{},"Vector search",[888,3438,3119],{},[888,3440,3441],{},[446,3442,3443],{},"Co (với quantization)",[432,3445,3447],{"id":3446},"cost-optimization","Cost optimization",[464,3449,3452],{"className":3450,"code":3451,"language":2415,"meta":469},[2413],"Savings Plan 1 năm           -> Tiết kiệm đến 35%\nAzure Hybrid Benefit         -> Dùng on-prem license, giảm thêm\nReserved Capacity 3 năm       -> Tiết kiệm nhất\nAzure Arc enabled SQL Server -> Tiết kiệm đến 20% + Entra ID auth\n",[471,3453,3451],{"__ignoreMap":469},[432,3455,3457],{"id":3456},"microsoft-fabric-database-hub","Microsoft Fabric Database Hub",[613,3459,3460],{},"Database Hub trong Microsoft Fabric (early access 2025) cho phép quản lý và query nhiều SQL database từ một giao diện duy nhất, tích hợp với Fabric's OneLake và Copilot.",[464,3462,3465],{"className":3463,"code":3464,"language":2415,"meta":469},[2413],"Fabric Database Hub\n├── Azure SQL DB\n├── SQL Server on-prem (qua Azure Arc)\n├── Fabric SQL Database (SaaS)\n└── OneLake shortcut -> query trực tiếp từ Lakehouse\n",[471,3466,3464],{"__ignoreMap":469},[427,3468,3470],{"id":3469},"_18-ai-integration-architecture-sql-server-2025","18. AI Integration Architecture (SQL Server 2025)",[613,3472,3473,3474,3477,3478,638],{},"SQL Server 2025 tích hợp sâu với AI workflow thông qua ",[446,3475,3476],{},"RAG pattern"," và ",[446,3479,3480],{},"external model management",[432,3482,3484],{"id":3483},"kiến-trúc-rag-với-sql-server","Kiến trúc RAG với SQL Server",[464,3486,3489],{"className":3487,"code":3488,"language":2415,"meta":469},[2413],"+------------------------------------------------------+\n|                    RAG Architecture                   |\n|                                                       |\n|  +----------+    +-----------+    +----------------+  |\n|  |  User    |--->| SQL Server|--->|  AI Service    |  |\n|  |  Query   |    |           |    |  (Azure OpenAI)|  |\n|  +----------+    | - Data    |    +-------+--------+  |\n|                  | - Vector  |\u003C-----------+           |\n|                  |   Index   |   embedding response    |\n|                  +-----------+                        |\n|                                                       |\n|  1. User query -> SQL Server                          |\n|  2. sp_invoke_external_rest_endpoint -> AI service    |\n|  3. AI returns embedding \u002F completion                 |\n|  4. SQL Server dùng vector index tìm relevant data    |\n|  5. Trả kết quả kèm context cho user                  |\n+------------------------------------------------------+\n",[471,3490,3488],{"__ignoreMap":469},[432,3492,3493],{"id":3493},"sp_invoke_external_rest_endpoint",[464,3495,3497],{"className":466,"code":3496,"language":468,"meta":469,"style":469},"-- Gọi Azure OpenAI từ T-SQL để tạo embedding\nDECLARE @response NVARCHAR(MAX);\n\nEXEC sp_invoke_external_rest_endpoint\n    @url = 'https:\u002F\u002Fmy-openai.openai.azure.com\u002Fopenai\u002Fdeployments\u002Ftext-embedding-3-small\u002Fembeddings?api-version=2024-02-01',\n    @method = 'POST',\n    @headers = '{\"Content-Type\":\"application\u002Fjson\", \"api-key\":\"xxx\"}',\n    @payload = N'{\"input\": \"Sản phẩm điện thoại Samsung Galaxy\"}',\n    @response = @response OUTPUT;\n\n-- Parse embedding từ response và dùng để vector search\n-- SELECT ... ORDER BY VECTOR_DISTANCE(Embedding, @ParsedEmbedding, 'cosine')\n",[471,3498,3499,3504,3509,3513,3518,3523,3528,3533,3538,3543,3547,3552],{"__ignoreMap":469},[474,3500,3501],{"class":476,"line":477},[474,3502,3503],{},"-- Gọi Azure OpenAI từ T-SQL để tạo embedding\n",[474,3505,3506],{"class":476,"line":483},[474,3507,3508],{},"DECLARE @response NVARCHAR(MAX);\n",[474,3510,3511],{"class":476,"line":489},[474,3512,493],{"emptyLinePlaceholder":492},[474,3514,3515],{"class":476,"line":496},[474,3516,3517],{},"EXEC sp_invoke_external_rest_endpoint\n",[474,3519,3520],{"class":476,"line":502},[474,3521,3522],{},"    @url = 'https:\u002F\u002Fmy-openai.openai.azure.com\u002Fopenai\u002Fdeployments\u002Ftext-embedding-3-small\u002Fembeddings?api-version=2024-02-01',\n",[474,3524,3525],{"class":476,"line":508},[474,3526,3527],{},"    @method = 'POST',\n",[474,3529,3530],{"class":476,"line":513},[474,3531,3532],{},"    @headers = '{\"Content-Type\":\"application\u002Fjson\", \"api-key\":\"xxx\"}',\n",[474,3534,3535],{"class":476,"line":519},[474,3536,3537],{},"    @payload = N'{\"input\": \"Sản phẩm điện thoại Samsung Galaxy\"}',\n",[474,3539,3540],{"class":476,"line":525},[474,3541,3542],{},"    @response = @response OUTPUT;\n",[474,3544,3545],{"class":476,"line":530},[474,3546,493],{"emptyLinePlaceholder":492},[474,3548,3549],{"class":476,"line":536},[474,3550,3551],{},"-- Parse embedding từ response và dùng để vector search\n",[474,3553,3554],{"class":476,"line":542},[474,3555,3556],{},"-- SELECT ... ORDER BY VECTOR_DISTANCE(Embedding, @ParsedEmbedding, 'cosine')\n",[432,3558,3560],{"id":3559},"create-external-model","CREATE EXTERNAL MODEL",[464,3562,3564],{"className":466,"code":3563,"language":468,"meta":469,"style":469},"-- Đăng ký AI model như database object\nCREATE EXTERNAL MODEL InvoiceClassifier\nWITH (\n    MODEL_PROVIDER = 'AZURE_OPENAI',\n    MODEL_NAME = 'gpt-4o',\n    ENDPOINT = 'https:\u002F\u002Fmy-openai.openai.azure.com',\n    API_VERSION = '2024-10-21',\n    CREDENTIAL = MyAzureCredential\n);\n\n-- Gọi model như function trong T-SQL\nSELECT\n    InvoiceId,\n    PREDICT(InvoiceClassifier, InvoiceText) AS Category\nFROM Invoices;\n",[471,3565,3566,3571,3576,3580,3585,3590,3595,3600,3605,3609,3613,3618,3622,3627,3632],{"__ignoreMap":469},[474,3567,3568],{"class":476,"line":477},[474,3569,3570],{},"-- Đăng ký AI model như database object\n",[474,3572,3573],{"class":476,"line":483},[474,3574,3575],{},"CREATE EXTERNAL MODEL InvoiceClassifier\n",[474,3577,3578],{"class":476,"line":489},[474,3579,1423],{},[474,3581,3582],{"class":476,"line":496},[474,3583,3584],{},"    MODEL_PROVIDER = 'AZURE_OPENAI',\n",[474,3586,3587],{"class":476,"line":502},[474,3588,3589],{},"    MODEL_NAME = 'gpt-4o',\n",[474,3591,3592],{"class":476,"line":508},[474,3593,3594],{},"    ENDPOINT = 'https:\u002F\u002Fmy-openai.openai.azure.com',\n",[474,3596,3597],{"class":476,"line":513},[474,3598,3599],{},"    API_VERSION = '2024-10-21',\n",[474,3601,3602],{"class":476,"line":519},[474,3603,3604],{},"    CREDENTIAL = MyAzureCredential\n",[474,3606,3607],{"class":476,"line":525},[474,3608,1336],{},[474,3610,3611],{"class":476,"line":530},[474,3612,493],{"emptyLinePlaceholder":492},[474,3614,3615],{"class":476,"line":536},[474,3616,3617],{},"-- Gọi model như function trong T-SQL\n",[474,3619,3620],{"class":476,"line":542},[474,3621,1369],{},[474,3623,3624],{"class":476,"line":548},[474,3625,3626],{},"    InvoiceId,\n",[474,3628,3629],{"class":476,"line":553},[474,3630,3631],{},"    PREDICT(InvoiceClassifier, InvoiceText) AS Category\n",[474,3633,3634],{"class":476,"line":559},[474,3635,3636],{},"FROM Invoices;\n",[432,3638,3640],{"id":3639},"retry-logic-tích-hợp","Retry logic tích hợp",[464,3642,3644],{"className":466,"code":3643,"language":468,"meta":469,"style":469},"-- SQL Server 2025 tự retry khi gọi external API\nEXEC sp_invoke_external_rest_endpoint\n    @url = 'https:\u002F\u002Fapi.example.com\u002Fclassify',\n    @method = 'POST',\n    @payload = N'{\"text\": \"...\"}',\n    @retry_count = 3,\n    @retry_interval_ms = 1000,\n    @response = @response OUTPUT;\n",[471,3645,3646,3651,3655,3660,3664,3669,3674,3679],{"__ignoreMap":469},[474,3647,3648],{"class":476,"line":477},[474,3649,3650],{},"-- SQL Server 2025 tự retry khi gọi external API\n",[474,3652,3653],{"class":476,"line":483},[474,3654,3517],{},[474,3656,3657],{"class":476,"line":489},[474,3658,3659],{},"    @url = 'https:\u002F\u002Fapi.example.com\u002Fclassify',\n",[474,3661,3662],{"class":476,"line":496},[474,3663,3527],{},[474,3665,3666],{"class":476,"line":502},[474,3667,3668],{},"    @payload = N'{\"text\": \"...\"}',\n",[474,3670,3671],{"class":476,"line":508},[474,3672,3673],{},"    @retry_count = 3,\n",[474,3675,3676],{"class":476,"line":513},[474,3677,3678],{},"    @retry_interval_ms = 1000,\n",[474,3680,3681],{"class":476,"line":519},[474,3682,3542],{},[432,3684,3686],{"id":3685},"ab-testing-với-nhiều-model-version","A\u002FB Testing với nhiều model version",[464,3688,3690],{"className":466,"code":3689,"language":468,"meta":469,"style":469},"-- Đăng ký nhiều version của cùng model\nCREATE EXTERNAL MODEL SentimentV1\nWITH (MODEL_PROVIDER = 'AZURE_OPENAI', MODEL_NAME = 'gpt-4o', ENDPOINT = '...', CREDENTIAL = MyCredential);\n\nCREATE EXTERNAL MODEL SentimentV2\nWITH (MODEL_PROVIDER = 'AZURE_OPENAI', MODEL_NAME = 'gpt-4.1', ENDPOINT = '...', CREDENTIAL = MyCredential);\n\n-- A\u002FB test: 50% traffic mỗi model\nDECLARE @model SYSNAME = IIF(ABS(CHECKSUM(NEWID())) % 2 = 0, 'SentimentV1', 'SentimentV2');\nSELECT PREDICT(@model, ReviewText) AS Sentiment FROM Reviews;\n",[471,3691,3692,3697,3702,3707,3711,3716,3721,3725,3730,3735],{"__ignoreMap":469},[474,3693,3694],{"class":476,"line":477},[474,3695,3696],{},"-- Đăng ký nhiều version của cùng model\n",[474,3698,3699],{"class":476,"line":483},[474,3700,3701],{},"CREATE EXTERNAL MODEL SentimentV1\n",[474,3703,3704],{"class":476,"line":489},[474,3705,3706],{},"WITH (MODEL_PROVIDER = 'AZURE_OPENAI', MODEL_NAME = 'gpt-4o', ENDPOINT = '...', CREDENTIAL = MyCredential);\n",[474,3708,3709],{"class":476,"line":496},[474,3710,493],{"emptyLinePlaceholder":492},[474,3712,3713],{"class":476,"line":502},[474,3714,3715],{},"CREATE EXTERNAL MODEL SentimentV2\n",[474,3717,3718],{"class":476,"line":508},[474,3719,3720],{},"WITH (MODEL_PROVIDER = 'AZURE_OPENAI', MODEL_NAME = 'gpt-4.1', ENDPOINT = '...', CREDENTIAL = MyCredential);\n",[474,3722,3723],{"class":476,"line":513},[474,3724,493],{"emptyLinePlaceholder":492},[474,3726,3727],{"class":476,"line":519},[474,3728,3729],{},"-- A\u002FB test: 50% traffic mỗi model\n",[474,3731,3732],{"class":476,"line":525},[474,3733,3734],{},"DECLARE @model SYSNAME = IIF(ABS(CHECKSUM(NEWID())) % 2 = 0, 'SentimentV1', 'SentimentV2');\n",[474,3736,3737],{"class":476,"line":530},[474,3738,3739],{},"SELECT PREDICT(@model, ReviewText) AS Sentiment FROM Reviews;\n",[608,3741,3742,3750],{"color":1008,"icon":683},[613,3743,686,3744,690,3747],{},[446,3745,3746],{},"Câu PV Architect\u002FLead:",[692,3748,3749],{},"\"Làm sao tích hợp AI vào SQL Server app?\"",[696,3751,3752],{},[613,3753,3754,3755,3757,3758,3760],{},"\"SQL Server 2025 hỗ trợ RAG pattern natively: lưu embeddings trong cột VECTOR, tạo vector index với DiskANN, gọi AI service qua ",[471,3756,3493],{}," với built-in retry, và quản lý model qua ",[471,3759,3560],{},". Toàn bộ pipeline chạy trong T-SQL — không cần middleware, không cần vector database riêng.\"",[427,3762,3764],{"id":3763},"_19-monitoring-observability-sql-server-2025","19. Monitoring & Observability (SQL Server 2025)",[432,3766,3768],{"id":3767},"dmv-cập-nhật-cho-tính-năng-mới","DMV cập nhật cho tính năng mới",[464,3770,3772],{"className":466,"code":3771,"language":468,"meta":469,"style":469},"-- Vector query metrics trong Query Store (2025 mới)\nSELECT\n    qsq.query_id,\n    qsqt.query_sql_text,\n    qsq.count_vector_searches,\n    qsq.avg_vector_search_duration_ms,\n    qsq.avg_vector_distance_compute_ms\nFROM sys.query_store_query AS qsq\nJOIN sys.query_store_query_text AS qsqt\n    ON qsq.query_text_id = qsqt.query_text_id\nWHERE qsq.count_vector_searches > 0\nORDER BY qsq.avg_vector_search_duration_ms DESC;\n\n-- Lock escalation events (theo dõi Optimized Locking)\nSELECT\n    counter_name,\n    cntr_value\nFROM sys.dm_os_performance_counters\nWHERE object_name LIKE '%Locks%'\n  AND counter_name IN (\n      'Lock Escalations\u002Fsec',\n      'Average Wait Time (ms)',\n      'Number of Deadlocks\u002Fsec'\n  );\n\n-- TempDB usage theo workload group (2025 mới)\nSELECT\n    wg.name AS workload_group,\n    wg.total_tempdb_usage_kb,\n    wg.max_tempdb_space_kb\nFROM sys.dm_resource_governor_workload_groups AS wg;\n",[471,3773,3774,3779,3783,3788,3793,3798,3803,3808,3813,3818,3823,3828,3833,3837,3842,3846,3851,3856,3861,3866,3871,3876,3881,3887,3893,3898,3904,3909,3915,3921,3927],{"__ignoreMap":469},[474,3775,3776],{"class":476,"line":477},[474,3777,3778],{},"-- Vector query metrics trong Query Store (2025 mới)\n",[474,3780,3781],{"class":476,"line":483},[474,3782,1369],{},[474,3784,3785],{"class":476,"line":489},[474,3786,3787],{},"    qsq.query_id,\n",[474,3789,3790],{"class":476,"line":496},[474,3791,3792],{},"    qsqt.query_sql_text,\n",[474,3794,3795],{"class":476,"line":502},[474,3796,3797],{},"    qsq.count_vector_searches,\n",[474,3799,3800],{"class":476,"line":508},[474,3801,3802],{},"    qsq.avg_vector_search_duration_ms,\n",[474,3804,3805],{"class":476,"line":513},[474,3806,3807],{},"    qsq.avg_vector_distance_compute_ms\n",[474,3809,3810],{"class":476,"line":519},[474,3811,3812],{},"FROM sys.query_store_query AS qsq\n",[474,3814,3815],{"class":476,"line":525},[474,3816,3817],{},"JOIN sys.query_store_query_text AS qsqt\n",[474,3819,3820],{"class":476,"line":530},[474,3821,3822],{},"    ON qsq.query_text_id = qsqt.query_text_id\n",[474,3824,3825],{"class":476,"line":536},[474,3826,3827],{},"WHERE qsq.count_vector_searches > 0\n",[474,3829,3830],{"class":476,"line":542},[474,3831,3832],{},"ORDER BY qsq.avg_vector_search_duration_ms DESC;\n",[474,3834,3835],{"class":476,"line":548},[474,3836,493],{"emptyLinePlaceholder":492},[474,3838,3839],{"class":476,"line":553},[474,3840,3841],{},"-- Lock escalation events (theo dõi Optimized Locking)\n",[474,3843,3844],{"class":476,"line":559},[474,3845,1369],{},[474,3847,3848],{"class":476,"line":565},[474,3849,3850],{},"    counter_name,\n",[474,3852,3853],{"class":476,"line":571},[474,3854,3855],{},"    cntr_value\n",[474,3857,3858],{"class":476,"line":576},[474,3859,3860],{},"FROM sys.dm_os_performance_counters\n",[474,3862,3863],{"class":476,"line":582},[474,3864,3865],{},"WHERE object_name LIKE '%Locks%'\n",[474,3867,3868],{"class":476,"line":588},[474,3869,3870],{},"  AND counter_name IN (\n",[474,3872,3873],{"class":476,"line":593},[474,3874,3875],{},"      'Lock Escalations\u002Fsec',\n",[474,3877,3878],{"class":476,"line":599},[474,3879,3880],{},"      'Average Wait Time (ms)',\n",[474,3882,3884],{"class":476,"line":3883},23,[474,3885,3886],{},"      'Number of Deadlocks\u002Fsec'\n",[474,3888,3890],{"class":476,"line":3889},24,[474,3891,3892],{},"  );\n",[474,3894,3896],{"class":476,"line":3895},25,[474,3897,493],{"emptyLinePlaceholder":492},[474,3899,3901],{"class":476,"line":3900},26,[474,3902,3903],{},"-- TempDB usage theo workload group (2025 mới)\n",[474,3905,3907],{"class":476,"line":3906},27,[474,3908,1369],{},[474,3910,3912],{"class":476,"line":3911},28,[474,3913,3914],{},"    wg.name AS workload_group,\n",[474,3916,3918],{"class":476,"line":3917},29,[474,3919,3920],{},"    wg.total_tempdb_usage_kb,\n",[474,3922,3924],{"class":476,"line":3923},30,[474,3925,3926],{},"    wg.max_tempdb_space_kb\n",[474,3928,3930],{"class":476,"line":3929},31,[474,3931,3932],{},"FROM sys.dm_resource_governor_workload_groups AS wg;\n",[432,3934,3936],{"id":3935},"ssms-22-performance-dashboard","SSMS 22 Performance Dashboard",[613,3938,3939],{},"SSMS 22 đi kèm Performance Dashboard cập nhật cho SQL Server 2025:",[619,3941,3942,3949,3955],{},[622,3943,3944,3945,3948],{},"Tab ",[446,3946,3947],{},"Vector Search"," — thống kê vector index usage, latency distribution.",[622,3950,3944,3951,3954],{},[446,3952,3953],{},"Locking"," — hiển thị lock escalation events, LAQ hit rate.",[622,3956,3944,3957,3960,3961,638],{},[446,3958,3959],{},"External API"," — theo dõi latency và error rate của ",[471,3962,3493],{},[432,3964,3966],{"id":3965},"query-store-cho-ai-augmented-queries","Query Store cho AI-augmented queries",[464,3968,3970],{"className":466,"code":3969,"language":468,"meta":469,"style":469},"-- Kiểm tra query có gọi external endpoint không\nSELECT\n    q.query_id,\n    t.query_sql_text,\n    q.count_external_api_calls,\n    q.avg_external_api_duration_ms,\n    q.avg_external_api_retry_count\nFROM sys.query_store_query q\nJOIN sys.query_store_query_text t ON q.query_text_id = t.query_text_id\nWHERE q.count_external_api_calls > 0\nORDER BY q.avg_external_api_duration_ms DESC;\n",[471,3971,3972,3977,3981,3986,3991,3996,4001,4006,4011,4016,4021],{"__ignoreMap":469},[474,3973,3974],{"class":476,"line":477},[474,3975,3976],{},"-- Kiểm tra query có gọi external endpoint không\n",[474,3978,3979],{"class":476,"line":483},[474,3980,1369],{},[474,3982,3983],{"class":476,"line":489},[474,3984,3985],{},"    q.query_id,\n",[474,3987,3988],{"class":476,"line":496},[474,3989,3990],{},"    t.query_sql_text,\n",[474,3992,3993],{"class":476,"line":502},[474,3994,3995],{},"    q.count_external_api_calls,\n",[474,3997,3998],{"class":476,"line":508},[474,3999,4000],{},"    q.avg_external_api_duration_ms,\n",[474,4002,4003],{"class":476,"line":513},[474,4004,4005],{},"    q.avg_external_api_retry_count\n",[474,4007,4008],{"class":476,"line":519},[474,4009,4010],{},"FROM sys.query_store_query q\n",[474,4012,4013],{"class":476,"line":525},[474,4014,4015],{},"JOIN sys.query_store_query_text t ON q.query_text_id = t.query_text_id\n",[474,4017,4018],{"class":476,"line":530},[474,4019,4020],{},"WHERE q.count_external_api_calls > 0\n",[474,4022,4023],{"class":476,"line":536},[474,4024,4025],{},"ORDER BY q.avg_external_api_duration_ms DESC;\n",[608,4027,686,4028,4031,4032,3477,4035,4038],{"color":610,"icon":683},[446,4029,4030],{},"Tip phỏng vấn:"," Khi được hỏi về monitoring SQL Server 2025, hãy nhắc đến ",[446,4033,4034],{},"Query Store cho AI queries",[446,4036,4037],{},"vector search metrics"," — thể hiện bạn cập nhật tính năng mới nhất, không chỉ dùng DMV cũ.",[427,4040,4042],{"id":4041},"_20-performance-benchmarks-con-số-thực-tế-sql-server-2025","20. Performance Benchmarks — con số thực tế (SQL Server 2025)",[432,4044,4046],{"id":4045},"kỷ-lục-performance-mới","Kỷ lục performance mới",[864,4048,4049,4061],{},[867,4050,4051],{},[870,4052,4053,4056,4059],{},[873,4054,4055],{},"Benchmark",[873,4057,4058],{},"Kết quả",[873,4060,3391],{},[883,4062,4063,4076,4089,4104,4119,4132],{},[870,4064,4065,4070,4073],{},[888,4066,4067],{},[446,4068,4069],{},"10TB TPC-H",[888,4071,4072],{},"Kỷ lục thế giới mới",[888,4074,4075],{},"AMD EPYC + HPE Superdome",[870,4077,4078,4083,4086],{},[888,4079,4080],{},[446,4081,4082],{},"3TB Price-Performance",[888,4084,4085],{},"Cải thiện 4% so với gen trước",[888,4087,4088],{},"TPC-H price\u002Fperformance",[870,4090,4091,4096,4101],{},[888,4092,4093],{},[446,4094,4095],{},"OLTP throughput",[888,4097,4098],{},[446,4099,4100],{},"Tang 15-25%",[888,4102,4103],{},"Optimized Locking + IQP",[870,4105,4106,4111,4116],{},[888,4107,4108],{},[446,4109,4110],{},"Vector search @ 1B",[888,4112,4113],{},[446,4114,4115],{},"Millisecond latency",[888,4117,4118],{},"DiskANN trên NVMe SSD",[870,4120,4121,4126,4129],{},[888,4122,4123],{},[446,4124,4125],{},"Columnstore compression",[888,4127,4128],{},"10-15x compression",[888,4130,4131],{},"So với rowstore",[870,4133,4134,4139,4142],{},[888,4135,4136],{},[446,4137,4138],{},"Backup speed ZSTD",[888,4140,4141],{},"Nhanh hơn 30-50%",[888,4143,4144],{},"So với MS_XPRESS",[432,4146,4148],{"id":4147},"chi-tiết-oltp-improvement","Chi tiết OLTP improvement",[464,4150,4153],{"className":4151,"code":4152,"language":2415,"meta":469},[2413],"Optimized Locking (riêng):            +10-15% throughput\nIntelligent Query Processing (IQP):    +5-10% throughput\nKết hợp cả hai:                        +15-25% throughput\n+-----------------------------------------------------+\nGiảm lock waits:                      -40% đến -60%\nGiảm deadlocks:                       -20% đến -30%\n",[471,4154,4152],{"__ignoreMap":469},[432,4156,4158],{"id":4157},"diskann-vs-hnsw-benchmark-1b-vectors-768-dimensions","DiskANN vs HNSW benchmark (1B vectors, 768 dimensions)",[864,4160,4161,4173],{},[867,4162,4163],{},[870,4164,4165,4168,4170],{},[873,4166,4167],{},"Metric",[873,4169,1956],{},[873,4171,4172],{},"DiskANN (SQL 2025)",[883,4174,4175,4188,4201,4214,4225],{},[870,4176,4177,4180,4183],{},[888,4178,4179],{},"RAM required",[888,4181,4182],{},"~1.2 TB",[888,4184,4185],{},[446,4186,4187],{},"~120 GB (10x ít hơn)",[870,4189,4190,4193,4196],{},[888,4191,4192],{},"Query latency (p99)",[888,4194,4195],{},"0.5 ms",[888,4197,4198],{},[446,4199,4200],{},"3 ms",[870,4202,4203,4206,4209],{},[888,4204,4205],{},"Recall@10",[888,4207,4208],{},"98%",[888,4210,4211],{},[446,4212,4213],{},"97%",[870,4215,4216,4219,4222],{},[888,4217,4218],{},"Index build time",[888,4220,4221],{},"8 giờ",[888,4223,4224],{},"3 giờ",[870,4226,4227,4230,4233],{},[888,4228,4229],{},"Storage cost (ước tính)",[888,4231,4232],{},"~$15K RAM",[888,4234,4235],{},[446,4236,4237],{},"~$500 SSD",[608,4239,4240,4247],{"color":1008,"icon":683},[613,4241,686,4242,690,4244],{},[446,4243,1013],{},[692,4245,4246],{},"\"SQL Server 2025 nhanh hơn bao nhiêu so với 2022?\"",[696,4248,4249],{},[613,4250,4251,4252,4254],{},"\"OLTP workload cải thiện ",[446,4253,2387],{}," nhờ Optimized Locking + IQP. Backup nhanh hơn 30-50% với ZSTD compression. Vector search đạt millisecond latency trên billion-scale dataset với DiskANN, tốn ít RAM hơn 10x so với HNSW. Crash recovery từ hours xuống minutes với ADR cho TempDB. Đây là bản SQL Server có bước nhảy performance lớn nhất trong 5 năm.\"",[608,4256,4258,4259],{"color":1008,"icon":4257},"i-lucide-arrow-right","Tiếp theo: ",[4260,4261,4262],"a",{"href":194},"Câu hỏi phỏng vấn SQL Server",[4264,4265,4266],"style",{},"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 .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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":469,"searchDepth":483,"depth":483,"links":4268},[4269,4275,4279,4282,4283,4287,4288,4289,4290,4291,4292,4298,4301,4306,4311,4316,4322,4328,4335,4340],{"id":429,"depth":483,"text":430,"children":4270},[4271,4272,4273,4274],{"id":434,"depth":489,"text":435},{"id":605,"depth":489,"text":606},{"id":703,"depth":489,"text":704},{"id":765,"depth":489,"text":766},{"id":843,"depth":483,"text":844,"children":4276},[4277,4278],{"id":861,"depth":489,"text":862},{"id":1031,"depth":489,"text":1032},{"id":1084,"depth":483,"text":1085,"children":4280},[4281],{"id":1144,"depth":489,"text":1145},{"id":1210,"depth":483,"text":1211},{"id":1306,"depth":483,"text":1307,"children":4284},[4285,4286],{"id":1310,"depth":489,"text":1311},{"id":1353,"depth":489,"text":1354},{"id":1464,"depth":483,"text":1465},{"id":1511,"depth":483,"text":1512},{"id":1616,"depth":483,"text":1617},{"id":1656,"depth":483,"text":1657},{"id":1716,"depth":483,"text":1717},{"id":1921,"depth":483,"text":1922,"children":4293},[4294,4295,4296,4297],{"id":1936,"depth":489,"text":1937},{"id":2031,"depth":489,"text":2032},{"id":2146,"depth":489,"text":2147},{"id":2160,"depth":489,"text":2161},{"id":2218,"depth":483,"text":2219,"children":4299},[4300],{"id":2231,"depth":489,"text":2232},{"id":2376,"depth":483,"text":2377,"children":4302},[4303,4304,4305],{"id":2390,"depth":489,"text":2391},{"id":2420,"depth":489,"text":2421},{"id":2577,"depth":489,"text":2578},{"id":2668,"depth":483,"text":2669,"children":4307},[4308,4309,4310],{"id":2672,"depth":489,"text":2673},{"id":2721,"depth":489,"text":2722},{"id":2813,"depth":489,"text":2814},{"id":2919,"depth":483,"text":2920,"children":4312},[4313,4314,4315],{"id":2923,"depth":489,"text":2924},{"id":3012,"depth":489,"text":3013},{"id":3054,"depth":489,"text":3055},{"id":3080,"depth":483,"text":3081,"children":4317},[4318,4319,4320,4321],{"id":3084,"depth":489,"text":3085},{"id":3167,"depth":489,"text":3168},{"id":3255,"depth":489,"text":3256},{"id":3328,"depth":489,"text":3329},{"id":3351,"depth":483,"text":3352,"children":4323},[4324,4325,4326,4327],{"id":3355,"depth":489,"text":3356},{"id":3381,"depth":489,"text":3382},{"id":3446,"depth":489,"text":3447},{"id":3456,"depth":489,"text":3457},{"id":3469,"depth":483,"text":3470,"children":4329},[4330,4331,4332,4333,4334],{"id":3483,"depth":489,"text":3484},{"id":3493,"depth":489,"text":3493},{"id":3559,"depth":489,"text":3560},{"id":3639,"depth":489,"text":3640},{"id":3685,"depth":489,"text":3686},{"id":3763,"depth":483,"text":3764,"children":4336},[4337,4338,4339],{"id":3767,"depth":489,"text":3768},{"id":3935,"depth":489,"text":3936},{"id":3965,"depth":489,"text":3966},{"id":4041,"depth":483,"text":4042,"children":4341},[4342,4343,4344],{"id":4045,"depth":489,"text":4046},{"id":4147,"depth":489,"text":4148},{"id":4157,"depth":489,"text":4158},"Đặc thù SQL Server 2025 — JSON, Vector Index (DiskANN), Optimized Locking, RegEx, temporal table. Index, execution plan, tuning, query optimization, AI integration, benchmarks.","md",null,{},{"title":188,"icon":191},{"title":422,"description":4345},"lrWQCFyjJWVp2_mJckWBz7f5grv6lVersbgifjUqhmU",[4353,4355],{"title":183,"path":184,"stem":185,"description":4354,"icon":186,"children":-1},"JOIN, subquery, set operation, CTE recursive, window function, transaction, isolation level — gốc cho SQL Server.",{"title":193,"path":194,"stem":195,"description":4356,"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.",1783490364506]