[{"data":1,"prerenderedAt":4262},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-database-sql-server-truy-van-nang-cao":420,"-tu-hoc-database-sql-server-truy-van-nang-cao-surround":4257},[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":4250,"extension":4251,"links":4252,"meta":4253,"navigation":4254,"path":184,"seo":4255,"stem":185,"__hash__":4256},"docs\u002F2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao.md","Truy vấn T-SQL nâng cao",{"type":424,"value":425,"toc":4170},"minimark",[426,431,436,579,644,648,673,677,760,806,810,814,834,838,873,880,884,918,922,962,966,1057,1075,1079,1083,1123,1126,1130,1189,1193,1271,1279,1283,1287,1316,1320,1360,1364,1413,1430,1434,1483,1487,1515,1519,1557,1561,1565,1642,1646,1681,1685,1714,1718,1766,1769,1773,1777,1850,1854,1896,1900,1963,1969,1973,1977,2059,2088,2092,2112,2148,2152,2166,2170,2206,2221,2225,2228,2232,2243,2282,2316,2320,2339,2346,2365,2369,2376,2406,2412,2416,2427,2446,2476,2480,2500,2521,2534,2538,2545,2590,2629,2662,2666,2672,2701,2707,2720,2725,2729,2736,2740,2804,2808,2876,2909,2913,2961,2977,2981,2984,2988,3038,3042,3088,3092,3111,3196,3200,3203,3207,3253,3257,3305,3309,3349,3353,3381,3407,3417,3421,3424,3428,3614,3657,3661,3734,4166],[427,428,430],"h2",{"id":429},"_1-join-đào-sâu","1. JOIN — đào sâu",[432,433,435],"h3",{"id":434},"_5-loại-join-minh-hoạ","5 loại JOIN + minh hoạ",[437,438,443],"pre",{"className":439,"code":440,"language":441,"meta":442,"style":442},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- INNER — chỉ row match cả 2 bảng\nSELECT c.Name, o.OrderDate\nFROM Customers c\nINNER JOIN Orders o ON o.CustomerId = c.Id;\n\n-- LEFT — tất cả customer + đơn nếu có\nSELECT c.Name, o.OrderDate\nFROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id;\n\n-- RIGHT — đảo lại (ít dùng vì khó đọc, swap LEFT thuận hơn)\nSELECT c.Name, o.OrderDate\nFROM Orders o\nRIGHT JOIN Customers c ON o.CustomerId = c.Id;\n\n-- FULL OUTER — tất cả row 2 bên\nSELECT c.Name, o.OrderDate\nFROM Customers c\nFULL OUTER JOIN Orders o ON o.CustomerId = c.Id;\n\n-- CROSS — tích Descartes (m × n)\nSELECT c.Name, p.Name\nFROM Customers c CROSS JOIN Products p;\n","sql","",[444,445,446,454,460,466,472,479,485,490,495,501,506,512,517,523,529,534,540,545,550,556,561,567,573],"code",{"__ignoreMap":442},[447,448,451],"span",{"class":449,"line":450},"line",1,[447,452,453],{},"-- INNER — chỉ row match cả 2 bảng\n",[447,455,457],{"class":449,"line":456},2,[447,458,459],{},"SELECT c.Name, o.OrderDate\n",[447,461,463],{"class":449,"line":462},3,[447,464,465],{},"FROM Customers c\n",[447,467,469],{"class":449,"line":468},4,[447,470,471],{},"INNER JOIN Orders o ON o.CustomerId = c.Id;\n",[447,473,475],{"class":449,"line":474},5,[447,476,478],{"emptyLinePlaceholder":477},true,"\n",[447,480,482],{"class":449,"line":481},6,[447,483,484],{},"-- LEFT — tất cả customer + đơn nếu có\n",[447,486,488],{"class":449,"line":487},7,[447,489,459],{},[447,491,493],{"class":449,"line":492},8,[447,494,465],{},[447,496,498],{"class":449,"line":497},9,[447,499,500],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id;\n",[447,502,504],{"class":449,"line":503},10,[447,505,478],{"emptyLinePlaceholder":477},[447,507,509],{"class":449,"line":508},11,[447,510,511],{},"-- RIGHT — đảo lại (ít dùng vì khó đọc, swap LEFT thuận hơn)\n",[447,513,515],{"class":449,"line":514},12,[447,516,459],{},[447,518,520],{"class":449,"line":519},13,[447,521,522],{},"FROM Orders o\n",[447,524,526],{"class":449,"line":525},14,[447,527,528],{},"RIGHT JOIN Customers c ON o.CustomerId = c.Id;\n",[447,530,532],{"class":449,"line":531},15,[447,533,478],{"emptyLinePlaceholder":477},[447,535,537],{"class":449,"line":536},16,[447,538,539],{},"-- FULL OUTER — tất cả row 2 bên\n",[447,541,543],{"class":449,"line":542},17,[447,544,459],{},[447,546,548],{"class":449,"line":547},18,[447,549,465],{},[447,551,553],{"class":449,"line":552},19,[447,554,555],{},"FULL OUTER JOIN Orders o ON o.CustomerId = c.Id;\n",[447,557,559],{"class":449,"line":558},20,[447,560,478],{"emptyLinePlaceholder":477},[447,562,564],{"class":449,"line":563},21,[447,565,566],{},"-- CROSS — tích Descartes (m × n)\n",[447,568,570],{"class":449,"line":569},22,[447,571,572],{},"SELECT c.Name, p.Name\n",[447,574,576],{"class":449,"line":575},23,[447,577,578],{},"FROM Customers c CROSS JOIN Products p;\n",[580,581,584,601],"callout",{"color":582,"icon":583},"warning","i-lucide-star",[585,586,587,588,592,593,596,597,600],"p",{},"⭐ ",[589,590,591],"strong",{},"Bẫy phỏng vấn — LEFT JOIN + WHERE:"," điều kiện trên bảng phải đặt vào ",[444,594,595],{},"ON",", không phải ",[444,598,599],{},"WHERE",", để giữ NULL.",[437,602,604],{"className":439,"code":603,"language":441,"meta":442,"style":442},"-- ❌ Vô tình biến LEFT JOIN thành INNER\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Status = 'Paid';   -- lọc luôn row có o.Status NULL\n\n-- ✅ Đặt vào ON\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[444,605,606,611,616,621,626,630,635,639],{"__ignoreMap":442},[447,607,608],{"class":449,"line":450},[447,609,610],{},"-- ❌ Vô tình biến LEFT JOIN thành INNER\n",[447,612,613],{"class":449,"line":456},[447,614,615],{},"SELECT c.* FROM Customers c\n",[447,617,618],{"class":449,"line":462},[447,619,620],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id\n",[447,622,623],{"class":449,"line":468},[447,624,625],{},"WHERE o.Status = 'Paid';   -- lọc luôn row có o.Status NULL\n",[447,627,628],{"class":449,"line":474},[447,629,478],{"emptyLinePlaceholder":477},[447,631,632],{"class":449,"line":481},[447,633,634],{},"-- ✅ Đặt vào ON\n",[447,636,637],{"class":449,"line":487},[447,638,615],{},[447,640,641],{"class":449,"line":492},[447,642,643],{},"LEFT JOIN Orders o ON o.CustomerId = c.Id AND o.Status = 'Paid';\n",[432,645,647],{"id":646},"self-join","SELF JOIN",[437,649,651],{"className":439,"code":650,"language":441,"meta":442,"style":442},"-- Bảng Employees có ManagerId trỏ về Employees.Id\nSELECT e.Name AS Employee, m.Name AS Manager\nFROM Employees e\nLEFT JOIN Employees m ON m.Id = e.ManagerId;\n",[444,652,653,658,663,668],{"__ignoreMap":442},[447,654,655],{"class":449,"line":450},[447,656,657],{},"-- Bảng Employees có ManagerId trỏ về Employees.Id\n",[447,659,660],{"class":449,"line":456},[447,661,662],{},"SELECT e.Name AS Employee, m.Name AS Manager\n",[447,664,665],{"class":449,"line":462},[447,666,667],{},"FROM Employees e\n",[447,669,670],{"class":449,"line":468},[447,671,672],{},"LEFT JOIN Employees m ON m.Id = e.ManagerId;\n",[432,674,676],{"id":675},"anti-join-tìm-record-không-có-liên-kết","Anti-join — tìm record KHÔNG có liên kết",[437,678,680],{"className":439,"code":679,"language":441,"meta":442,"style":442},"-- Khách hàng chưa từng đặt đơn — 3 cách\n-- 1. LEFT JOIN ... IS NULL\nSELECT c.* FROM Customers c\nLEFT JOIN Orders o ON o.CustomerId = c.Id\nWHERE o.Id IS NULL;\n\n-- 2. NOT EXISTS (thường tốt nhất với SQL Server)\nSELECT c.* FROM Customers c\nWHERE NOT EXISTS (\n    SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id\n);\n\n-- 3. NOT IN (cẩn thận NULL!)\nSELECT c.* FROM Customers c\nWHERE c.Id NOT IN (\n    SELECT CustomerId FROM Orders WHERE CustomerId IS NOT NULL\n);\n",[444,681,682,687,692,696,700,705,709,714,718,723,728,733,737,742,746,751,756],{"__ignoreMap":442},[447,683,684],{"class":449,"line":450},[447,685,686],{},"-- Khách hàng chưa từng đặt đơn — 3 cách\n",[447,688,689],{"class":449,"line":456},[447,690,691],{},"-- 1. LEFT JOIN ... IS NULL\n",[447,693,694],{"class":449,"line":462},[447,695,615],{},[447,697,698],{"class":449,"line":468},[447,699,620],{},[447,701,702],{"class":449,"line":474},[447,703,704],{},"WHERE o.Id IS NULL;\n",[447,706,707],{"class":449,"line":481},[447,708,478],{"emptyLinePlaceholder":477},[447,710,711],{"class":449,"line":487},[447,712,713],{},"-- 2. NOT EXISTS (thường tốt nhất với SQL Server)\n",[447,715,716],{"class":449,"line":492},[447,717,615],{},[447,719,720],{"class":449,"line":497},[447,721,722],{},"WHERE NOT EXISTS (\n",[447,724,725],{"class":449,"line":503},[447,726,727],{},"    SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id\n",[447,729,730],{"class":449,"line":508},[447,731,732],{},");\n",[447,734,735],{"class":449,"line":514},[447,736,478],{"emptyLinePlaceholder":477},[447,738,739],{"class":449,"line":519},[447,740,741],{},"-- 3. NOT IN (cẩn thận NULL!)\n",[447,743,744],{"class":449,"line":525},[447,745,615],{},[447,747,748],{"class":449,"line":531},[447,749,750],{},"WHERE c.Id NOT IN (\n",[447,752,753],{"class":449,"line":536},[447,754,755],{},"    SELECT CustomerId FROM Orders WHERE CustomerId IS NOT NULL\n",[447,757,758],{"class":449,"line":542},[447,759,732],{},[580,761,763,773],{"color":762,"icon":583},"primary",[585,764,587,765,768,769],{},[589,766,767],{},"Câu PV:"," ",[770,771,772],"em",{},"\"NOT IN vs NOT EXISTS — khác gì?\"",[774,775,776,791,797],"ul",{},[777,778,779,782,783,786,787,790],"li",{},[444,780,781],{},"NOT IN"," cho ",[589,784,785],{},"kết quả sai"," nếu subquery có NULL (vì ",[444,788,789],{},"x \u003C> NULL"," là UNKNOWN).",[777,792,793,796],{},[444,794,795],{},"NOT EXISTS"," xử lý NULL đúng + thường có plan tốt hơn.",[777,798,799,802,803,805],{},[589,800,801],{},"Khuyến nghị:"," mặc định dùng ",[444,804,795],{},".",[427,807,809],{"id":808},"_2-subquery","2. Subquery",[432,811,813],{"id":812},"scalar-subquery-trả-1-giá-trị","Scalar subquery — trả 1 giá trị",[437,815,817],{"className":439,"code":816,"language":441,"meta":442,"style":442},"SELECT Name,\n    (SELECT COUNT(*) FROM Orders WHERE CustomerId = c.Id) AS OrderCount\nFROM Customers c;\n",[444,818,819,824,829],{"__ignoreMap":442},[447,820,821],{"class":449,"line":450},[447,822,823],{},"SELECT Name,\n",[447,825,826],{"class":449,"line":456},[447,827,828],{},"    (SELECT COUNT(*) FROM Orders WHERE CustomerId = c.Id) AS OrderCount\n",[447,830,831],{"class":449,"line":462},[447,832,833],{},"FROM Customers c;\n",[432,835,837],{"id":836},"correlated-subquery-tham-chiếu-outer-query","Correlated subquery — tham chiếu outer query",[437,839,841],{"className":439,"code":840,"language":441,"meta":442,"style":442},"-- Top 3 sản phẩm đắt nhất MỖI category\nSELECT * FROM Products p1\nWHERE (\n    SELECT COUNT(*) FROM Products p2\n    WHERE p2.CategoryId = p1.CategoryId AND p2.Price > p1.Price\n) \u003C 3;\n",[444,842,843,848,853,858,863,868],{"__ignoreMap":442},[447,844,845],{"class":449,"line":450},[447,846,847],{},"-- Top 3 sản phẩm đắt nhất MỖI category\n",[447,849,850],{"class":449,"line":456},[447,851,852],{},"SELECT * FROM Products p1\n",[447,854,855],{"class":449,"line":462},[447,856,857],{},"WHERE (\n",[447,859,860],{"class":449,"line":468},[447,861,862],{},"    SELECT COUNT(*) FROM Products p2\n",[447,864,865],{"class":449,"line":474},[447,866,867],{},"    WHERE p2.CategoryId = p1.CategoryId AND p2.Price > p1.Price\n",[447,869,870],{"class":449,"line":481},[447,871,872],{},") \u003C 3;\n",[585,874,875,876,879],{},"→ Cách hiện đại: dùng ",[589,877,878],{},"Window function"," (mục 5).",[432,881,883],{"id":882},"exists","EXISTS",[437,885,887],{"className":439,"code":886,"language":441,"meta":442,"style":442},"-- Khách có ít nhất 1 đơn > 10 triệu\nSELECT * FROM Customers c\nWHERE EXISTS (\n    SELECT 1 FROM Orders o\n    WHERE o.CustomerId = c.Id AND o.Total > 10000000\n);\n",[444,888,889,894,899,904,909,914],{"__ignoreMap":442},[447,890,891],{"class":449,"line":450},[447,892,893],{},"-- Khách có ít nhất 1 đơn > 10 triệu\n",[447,895,896],{"class":449,"line":456},[447,897,898],{},"SELECT * FROM Customers c\n",[447,900,901],{"class":449,"line":462},[447,902,903],{},"WHERE EXISTS (\n",[447,905,906],{"class":449,"line":468},[447,907,908],{},"    SELECT 1 FROM Orders o\n",[447,910,911],{"class":449,"line":474},[447,912,913],{},"    WHERE o.CustomerId = c.Id AND o.Total > 10000000\n",[447,915,916],{"class":449,"line":481},[447,917,732],{},[432,919,921],{"id":920},"derived-table-inline-view","Derived table (inline view)",[437,923,925],{"className":439,"code":924,"language":441,"meta":442,"style":442},"SELECT t.City, t.TotalRevenue\nFROM (\n    SELECT c.City, SUM(o.Total) AS TotalRevenue\n    FROM Customers c JOIN Orders o ON o.CustomerId = c.Id\n    GROUP BY c.City\n) t\nWHERE t.TotalRevenue > 100000000;\n",[444,926,927,932,937,942,947,952,957],{"__ignoreMap":442},[447,928,929],{"class":449,"line":450},[447,930,931],{},"SELECT t.City, t.TotalRevenue\n",[447,933,934],{"class":449,"line":456},[447,935,936],{},"FROM (\n",[447,938,939],{"class":449,"line":462},[447,940,941],{},"    SELECT c.City, SUM(o.Total) AS TotalRevenue\n",[447,943,944],{"class":449,"line":468},[447,945,946],{},"    FROM Customers c JOIN Orders o ON o.CustomerId = c.Id\n",[447,948,949],{"class":449,"line":474},[447,950,951],{},"    GROUP BY c.City\n",[447,953,954],{"class":449,"line":481},[447,955,956],{},") t\n",[447,958,959],{"class":449,"line":487},[447,960,961],{},"WHERE t.TotalRevenue > 100000000;\n",[427,963,965],{"id":964},"_3-set-operations","3. Set operations",[437,967,969],{"className":439,"code":968,"language":441,"meta":442,"style":442},"-- UNION — gộp + loại trùng (chậm hơn)\nSELECT Email FROM Customers\nUNION\nSELECT Email FROM Suppliers;\n\n-- UNION ALL — gộp, không loại trùng (NHANH HƠN)\nSELECT Email FROM Customers\nUNION ALL\nSELECT Email FROM Suppliers;\n\n-- INTERSECT — giao\nSELECT Email FROM Customers\nINTERSECT\nSELECT Email FROM Suppliers;\n\n-- EXCEPT — hiệu (A trừ B)\nSELECT Email FROM Customers\nEXCEPT\nSELECT Email FROM Suppliers;\n",[444,970,971,976,981,986,991,995,1000,1004,1009,1013,1017,1022,1026,1031,1035,1039,1044,1048,1053],{"__ignoreMap":442},[447,972,973],{"class":449,"line":450},[447,974,975],{},"-- UNION — gộp + loại trùng (chậm hơn)\n",[447,977,978],{"class":449,"line":456},[447,979,980],{},"SELECT Email FROM Customers\n",[447,982,983],{"class":449,"line":462},[447,984,985],{},"UNION\n",[447,987,988],{"class":449,"line":468},[447,989,990],{},"SELECT Email FROM Suppliers;\n",[447,992,993],{"class":449,"line":474},[447,994,478],{"emptyLinePlaceholder":477},[447,996,997],{"class":449,"line":481},[447,998,999],{},"-- UNION ALL — gộp, không loại trùng (NHANH HƠN)\n",[447,1001,1002],{"class":449,"line":487},[447,1003,980],{},[447,1005,1006],{"class":449,"line":492},[447,1007,1008],{},"UNION ALL\n",[447,1010,1011],{"class":449,"line":497},[447,1012,990],{},[447,1014,1015],{"class":449,"line":503},[447,1016,478],{"emptyLinePlaceholder":477},[447,1018,1019],{"class":449,"line":508},[447,1020,1021],{},"-- INTERSECT — giao\n",[447,1023,1024],{"class":449,"line":514},[447,1025,980],{},[447,1027,1028],{"class":449,"line":519},[447,1029,1030],{},"INTERSECT\n",[447,1032,1033],{"class":449,"line":525},[447,1034,990],{},[447,1036,1037],{"class":449,"line":531},[447,1038,478],{"emptyLinePlaceholder":477},[447,1040,1041],{"class":449,"line":536},[447,1042,1043],{},"-- EXCEPT — hiệu (A trừ B)\n",[447,1045,1046],{"class":449,"line":542},[447,1047,980],{},[447,1049,1050],{"class":449,"line":547},[447,1051,1052],{},"EXCEPT\n",[447,1054,1055],{"class":449,"line":552},[447,1056,990],{},[580,1058,587,1059,768,1069,1071,1072,1074],{"color":582,"icon":583},[589,1060,1061,1064,1065,1068],{},[444,1062,1063],{},"UNION"," vs ",[444,1066,1067],{},"UNION ALL",":",[444,1070,1063],{}," thêm bước SORT DISTINCT (tốn). Nếu biết chắc không trùng, dùng ",[444,1073,1067],{}," nhanh hơn nhiều.",[427,1076,1078],{"id":1077},"_4-cte-common-table-expression","4. CTE — Common Table Expression",[432,1080,1082],{"id":1081},"cte-đơn-giản","CTE đơn giản",[437,1084,1086],{"className":439,"code":1085,"language":441,"meta":442,"style":442},"WITH HighValueOrders AS (\n    SELECT * FROM Orders WHERE Total > 10000000\n)\nSELECT c.Name, COUNT(*) AS BigOrderCount\nFROM HighValueOrders o\nJOIN Customers c ON c.Id = o.CustomerId\nGROUP BY c.Name;\n",[444,1087,1088,1093,1098,1103,1108,1113,1118],{"__ignoreMap":442},[447,1089,1090],{"class":449,"line":450},[447,1091,1092],{},"WITH HighValueOrders AS (\n",[447,1094,1095],{"class":449,"line":456},[447,1096,1097],{},"    SELECT * FROM Orders WHERE Total > 10000000\n",[447,1099,1100],{"class":449,"line":462},[447,1101,1102],{},")\n",[447,1104,1105],{"class":449,"line":468},[447,1106,1107],{},"SELECT c.Name, COUNT(*) AS BigOrderCount\n",[447,1109,1110],{"class":449,"line":474},[447,1111,1112],{},"FROM HighValueOrders o\n",[447,1114,1115],{"class":449,"line":481},[447,1116,1117],{},"JOIN Customers c ON c.Id = o.CustomerId\n",[447,1119,1120],{"class":449,"line":487},[447,1121,1122],{},"GROUP BY c.Name;\n",[585,1124,1125],{},"CTE giúp code đọc dễ hơn nhiều subquery lồng nhau.",[432,1127,1129],{"id":1128},"cte-đa-stage","CTE đa stage",[437,1131,1133],{"className":439,"code":1132,"language":441,"meta":442,"style":442},"WITH \nTopCustomers AS (\n    SELECT TOP 10 CustomerId, SUM(Total) AS Spent\n    FROM Orders GROUP BY CustomerId\n    ORDER BY Spent DESC\n),\nTheirOrders AS (\n    SELECT o.* FROM Orders o\n    WHERE o.CustomerId IN (SELECT CustomerId FROM TopCustomers)\n)\nSELECT * FROM TheirOrders WHERE OrderDate >= '2026-01-01';\n",[444,1134,1135,1140,1145,1150,1155,1160,1165,1170,1175,1180,1184],{"__ignoreMap":442},[447,1136,1137],{"class":449,"line":450},[447,1138,1139],{},"WITH \n",[447,1141,1142],{"class":449,"line":456},[447,1143,1144],{},"TopCustomers AS (\n",[447,1146,1147],{"class":449,"line":462},[447,1148,1149],{},"    SELECT TOP 10 CustomerId, SUM(Total) AS Spent\n",[447,1151,1152],{"class":449,"line":468},[447,1153,1154],{},"    FROM Orders GROUP BY CustomerId\n",[447,1156,1157],{"class":449,"line":474},[447,1158,1159],{},"    ORDER BY Spent DESC\n",[447,1161,1162],{"class":449,"line":481},[447,1163,1164],{},"),\n",[447,1166,1167],{"class":449,"line":487},[447,1168,1169],{},"TheirOrders AS (\n",[447,1171,1172],{"class":449,"line":492},[447,1173,1174],{},"    SELECT o.* FROM Orders o\n",[447,1176,1177],{"class":449,"line":497},[447,1178,1179],{},"    WHERE o.CustomerId IN (SELECT CustomerId FROM TopCustomers)\n",[447,1181,1182],{"class":449,"line":503},[447,1183,1102],{},[447,1185,1186],{"class":449,"line":508},[447,1187,1188],{},"SELECT * FROM TheirOrders WHERE OrderDate >= '2026-01-01';\n",[432,1190,1192],{"id":1191},"recursive-cte-tree","Recursive CTE — tree",[437,1194,1196],{"className":439,"code":1195,"language":441,"meta":442,"style":442},"-- Build cây tổ chức từ root xuống\nWITH OrgTree AS (\n    -- Anchor: root (không có manager)\n    SELECT Id, Name, ManagerId, 0 AS Lvl, CAST(Name AS NVARCHAR(MAX)) AS Path\n    FROM Employees WHERE ManagerId IS NULL\n    \n    UNION ALL\n    \n    -- Recursive: tìm nhân viên có manager đã ở trong tree\n    SELECT e.Id, e.Name, e.ManagerId, t.Lvl + 1,\n           CAST(t.Path + N' > ' + e.Name AS NVARCHAR(MAX))\n    FROM Employees e\n    JOIN OrgTree t ON t.Id = e.ManagerId\n)\nSELECT * FROM OrgTree ORDER BY Path;\n",[444,1197,1198,1203,1208,1213,1218,1223,1228,1233,1237,1242,1247,1252,1257,1262,1266],{"__ignoreMap":442},[447,1199,1200],{"class":449,"line":450},[447,1201,1202],{},"-- Build cây tổ chức từ root xuống\n",[447,1204,1205],{"class":449,"line":456},[447,1206,1207],{},"WITH OrgTree AS (\n",[447,1209,1210],{"class":449,"line":462},[447,1211,1212],{},"    -- Anchor: root (không có manager)\n",[447,1214,1215],{"class":449,"line":468},[447,1216,1217],{},"    SELECT Id, Name, ManagerId, 0 AS Lvl, CAST(Name AS NVARCHAR(MAX)) AS Path\n",[447,1219,1220],{"class":449,"line":474},[447,1221,1222],{},"    FROM Employees WHERE ManagerId IS NULL\n",[447,1224,1225],{"class":449,"line":481},[447,1226,1227],{},"    \n",[447,1229,1230],{"class":449,"line":487},[447,1231,1232],{},"    UNION ALL\n",[447,1234,1235],{"class":449,"line":492},[447,1236,1227],{},[447,1238,1239],{"class":449,"line":497},[447,1240,1241],{},"    -- Recursive: tìm nhân viên có manager đã ở trong tree\n",[447,1243,1244],{"class":449,"line":503},[447,1245,1246],{},"    SELECT e.Id, e.Name, e.ManagerId, t.Lvl + 1,\n",[447,1248,1249],{"class":449,"line":508},[447,1250,1251],{},"           CAST(t.Path + N' > ' + e.Name AS NVARCHAR(MAX))\n",[447,1253,1254],{"class":449,"line":514},[447,1255,1256],{},"    FROM Employees e\n",[447,1258,1259],{"class":449,"line":519},[447,1260,1261],{},"    JOIN OrgTree t ON t.Id = e.ManagerId\n",[447,1263,1264],{"class":449,"line":525},[447,1265,1102],{},[447,1267,1268],{"class":449,"line":531},[447,1269,1270],{},"SELECT * FROM OrgTree ORDER BY Path;\n",[580,1272,587,1273,768,1275,1278],{"color":762,"icon":583},[589,1274,767],{},[770,1276,1277],{},"\"Khi nào dùng Recursive CTE?\""," → tree\u002Fhierarchy (org chart, comment thread, bill-of-material), graph path, generate sequence (số 1→N).",[427,1280,1282],{"id":1281},"_5-window-function","5. Window function",[432,1284,1286],{"id":1285},"cấu-trúc-tổng-quát","Cấu trúc tổng quát",[437,1288,1290],{"className":439,"code":1289,"language":441,"meta":442,"style":442},"function_name() OVER (\n    [PARTITION BY col1, col2 ...]\n    [ORDER BY col1 [ASC|DESC] ...]\n    [ROWS|RANGE BETWEEN ... AND ...]\n)\n",[444,1291,1292,1297,1302,1307,1312],{"__ignoreMap":442},[447,1293,1294],{"class":449,"line":450},[447,1295,1296],{},"function_name() OVER (\n",[447,1298,1299],{"class":449,"line":456},[447,1300,1301],{},"    [PARTITION BY col1, col2 ...]\n",[447,1303,1304],{"class":449,"line":462},[447,1305,1306],{},"    [ORDER BY col1 [ASC|DESC] ...]\n",[447,1308,1309],{"class":449,"line":468},[447,1310,1311],{},"    [ROWS|RANGE BETWEEN ... AND ...]\n",[447,1313,1314],{"class":449,"line":474},[447,1315,1102],{},[432,1317,1319],{"id":1318},"ranking-row_number-rank-dense_rank","Ranking — ROW_NUMBER \u002F RANK \u002F DENSE_RANK",[437,1321,1323],{"className":439,"code":1322,"language":441,"meta":442,"style":442},"-- Cùng dữ liệu: 100, 100, 90, 80\nSELECT\n    Value,\n    ROW_NUMBER() OVER (ORDER BY Value DESC) AS Rn,    -- 1, 2, 3, 4\n    RANK()       OVER (ORDER BY Value DESC) AS Rk,    -- 1, 1, 3, 4 (skip)\n    DENSE_RANK() OVER (ORDER BY Value DESC) AS Dk     -- 1, 1, 2, 3 (no skip)\nFROM Scores;\n",[444,1324,1325,1330,1335,1340,1345,1350,1355],{"__ignoreMap":442},[447,1326,1327],{"class":449,"line":450},[447,1328,1329],{},"-- Cùng dữ liệu: 100, 100, 90, 80\n",[447,1331,1332],{"class":449,"line":456},[447,1333,1334],{},"SELECT\n",[447,1336,1337],{"class":449,"line":462},[447,1338,1339],{},"    Value,\n",[447,1341,1342],{"class":449,"line":468},[447,1343,1344],{},"    ROW_NUMBER() OVER (ORDER BY Value DESC) AS Rn,    -- 1, 2, 3, 4\n",[447,1346,1347],{"class":449,"line":474},[447,1348,1349],{},"    RANK()       OVER (ORDER BY Value DESC) AS Rk,    -- 1, 1, 3, 4 (skip)\n",[447,1351,1352],{"class":449,"line":481},[447,1353,1354],{},"    DENSE_RANK() OVER (ORDER BY Value DESC) AS Dk     -- 1, 1, 2, 3 (no skip)\n",[447,1356,1357],{"class":449,"line":487},[447,1358,1359],{},"FROM Scores;\n",[432,1361,1363],{"id":1362},"use-case-kinh-điển-top-n-per-group","Use case kinh điển — Top N per group",[437,1365,1367],{"className":439,"code":1366,"language":441,"meta":442,"style":442},"-- Đơn hàng MỚI NHẤT của MỖI khách\nWITH Ranked AS (\n    SELECT *, ROW_NUMBER() OVER (\n        PARTITION BY CustomerId\n        ORDER BY OrderDate DESC\n    ) AS Rn\n    FROM Orders\n)\nSELECT * FROM Ranked WHERE Rn = 1;\n",[444,1368,1369,1374,1379,1384,1389,1394,1399,1404,1408],{"__ignoreMap":442},[447,1370,1371],{"class":449,"line":450},[447,1372,1373],{},"-- Đơn hàng MỚI NHẤT của MỖI khách\n",[447,1375,1376],{"class":449,"line":456},[447,1377,1378],{},"WITH Ranked AS (\n",[447,1380,1381],{"class":449,"line":462},[447,1382,1383],{},"    SELECT *, ROW_NUMBER() OVER (\n",[447,1385,1386],{"class":449,"line":468},[447,1387,1388],{},"        PARTITION BY CustomerId\n",[447,1390,1391],{"class":449,"line":474},[447,1392,1393],{},"        ORDER BY OrderDate DESC\n",[447,1395,1396],{"class":449,"line":481},[447,1397,1398],{},"    ) AS Rn\n",[447,1400,1401],{"class":449,"line":487},[447,1402,1403],{},"    FROM Orders\n",[447,1405,1406],{"class":449,"line":492},[447,1407,1102],{},[447,1409,1410],{"class":449,"line":497},[447,1411,1412],{},"SELECT * FROM Ranked WHERE Rn = 1;\n",[580,1414,1415,1423],{"color":582,"icon":583},[585,1416,587,1417,768,1420],{},[589,1418,1419],{},"Câu hỏi siêu hot:",[770,1421,1422],{},"\"Lấy đơn hàng mới nhất của mỗi khách hàng — viết query.\"",[585,1424,1425,1426,1429],{},"Đây là test point xem fresher biết window function không. ",[589,1427,1428],{},"Câu trên là đáp án chuẩn."," Cách cổ điển (correlated subquery) chậm hơn nhiều.",[432,1431,1433],{"id":1432},"aggregate-window-function","Aggregate window function",[437,1435,1437],{"className":439,"code":1436,"language":441,"meta":442,"style":442},"SELECT\n    OrderDate,\n    Total,\n    SUM(Total) OVER (ORDER BY OrderDate) AS RunningTotal,\n    AVG(Total) OVER (\n        ORDER BY OrderDate\n        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW\n    ) AS MovingAvg7Days\nFROM Orders;\n",[444,1438,1439,1443,1448,1453,1458,1463,1468,1473,1478],{"__ignoreMap":442},[447,1440,1441],{"class":449,"line":450},[447,1442,1334],{},[447,1444,1445],{"class":449,"line":456},[447,1446,1447],{},"    OrderDate,\n",[447,1449,1450],{"class":449,"line":462},[447,1451,1452],{},"    Total,\n",[447,1454,1455],{"class":449,"line":468},[447,1456,1457],{},"    SUM(Total) OVER (ORDER BY OrderDate) AS RunningTotal,\n",[447,1459,1460],{"class":449,"line":474},[447,1461,1462],{},"    AVG(Total) OVER (\n",[447,1464,1465],{"class":449,"line":481},[447,1466,1467],{},"        ORDER BY OrderDate\n",[447,1469,1470],{"class":449,"line":487},[447,1471,1472],{},"        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW\n",[447,1474,1475],{"class":449,"line":492},[447,1476,1477],{},"    ) AS MovingAvg7Days\n",[447,1479,1480],{"class":449,"line":497},[447,1481,1482],{},"FROM Orders;\n",[432,1484,1486],{"id":1485},"lag-lead-so-sánh-row-liền-kề","LAG \u002F LEAD — so sánh row liền kề",[437,1488,1490],{"className":439,"code":1489,"language":441,"meta":442,"style":442},"SELECT\n    OrderDate, Total,\n    LAG(Total) OVER (ORDER BY OrderDate) AS PrevTotal,\n    Total - LAG(Total) OVER (ORDER BY OrderDate) AS DeltaFromPrev\nFROM Orders;\n",[444,1491,1492,1496,1501,1506,1511],{"__ignoreMap":442},[447,1493,1494],{"class":449,"line":450},[447,1495,1334],{},[447,1497,1498],{"class":449,"line":456},[447,1499,1500],{},"    OrderDate, Total,\n",[447,1502,1503],{"class":449,"line":462},[447,1504,1505],{},"    LAG(Total) OVER (ORDER BY OrderDate) AS PrevTotal,\n",[447,1507,1508],{"class":449,"line":468},[447,1509,1510],{},"    Total - LAG(Total) OVER (ORDER BY OrderDate) AS DeltaFromPrev\n",[447,1512,1513],{"class":449,"line":474},[447,1514,1482],{},[432,1516,1518],{"id":1517},"ntile-chia-bucket","NTILE — chia bucket",[437,1520,1522],{"className":439,"code":1521,"language":441,"meta":442,"style":442},"-- Chia khách thành 4 quartile theo total spend\nSELECT CustomerId, Spent,\n    NTILE(4) OVER (ORDER BY Spent DESC) AS Quartile\nFROM (\n    SELECT CustomerId, SUM(Total) AS Spent\n    FROM Orders GROUP BY CustomerId\n) t;\n",[444,1523,1524,1529,1534,1539,1543,1548,1552],{"__ignoreMap":442},[447,1525,1526],{"class":449,"line":450},[447,1527,1528],{},"-- Chia khách thành 4 quartile theo total spend\n",[447,1530,1531],{"class":449,"line":456},[447,1532,1533],{},"SELECT CustomerId, Spent,\n",[447,1535,1536],{"class":449,"line":462},[447,1537,1538],{},"    NTILE(4) OVER (ORDER BY Spent DESC) AS Quartile\n",[447,1540,1541],{"class":449,"line":468},[447,1542,936],{},[447,1544,1545],{"class":449,"line":474},[447,1546,1547],{},"    SELECT CustomerId, SUM(Total) AS Spent\n",[447,1549,1550],{"class":449,"line":481},[447,1551,1154],{},[447,1553,1554],{"class":449,"line":487},[447,1555,1556],{},") t;\n",[427,1558,1560],{"id":1559},"_6-aggregate-group-by-nâng-cao","6. Aggregate & GROUP BY nâng cao",[432,1562,1564],{"id":1563},"grouping-sets-rollup-cube","GROUPING SETS \u002F ROLLUP \u002F CUBE",[437,1566,1568],{"className":439,"code":1567,"language":441,"meta":442,"style":442},"-- Tổng theo nhiều combination cùng lúc — báo cáo\nSELECT City, Status, COUNT(*) AS Cnt\nFROM Orders o JOIN Customers c ON c.Id = o.CustomerId\nGROUP BY GROUPING SETS (\n    (City, Status),       -- detail\n    (City),               -- subtotal theo City\n    (Status),             -- subtotal theo Status\n    ()                    -- grand total\n);\n\n-- ROLLUP = subtotal lũy tiến\nGROUP BY ROLLUP (Year, Month, Day);\n\n-- CUBE = mọi combination\nGROUP BY CUBE (City, Status);\n",[444,1569,1570,1575,1580,1585,1590,1595,1600,1605,1610,1614,1618,1623,1628,1632,1637],{"__ignoreMap":442},[447,1571,1572],{"class":449,"line":450},[447,1573,1574],{},"-- Tổng theo nhiều combination cùng lúc — báo cáo\n",[447,1576,1577],{"class":449,"line":456},[447,1578,1579],{},"SELECT City, Status, COUNT(*) AS Cnt\n",[447,1581,1582],{"class":449,"line":462},[447,1583,1584],{},"FROM Orders o JOIN Customers c ON c.Id = o.CustomerId\n",[447,1586,1587],{"class":449,"line":468},[447,1588,1589],{},"GROUP BY GROUPING SETS (\n",[447,1591,1592],{"class":449,"line":474},[447,1593,1594],{},"    (City, Status),       -- detail\n",[447,1596,1597],{"class":449,"line":481},[447,1598,1599],{},"    (City),               -- subtotal theo City\n",[447,1601,1602],{"class":449,"line":487},[447,1603,1604],{},"    (Status),             -- subtotal theo Status\n",[447,1606,1607],{"class":449,"line":492},[447,1608,1609],{},"    ()                    -- grand total\n",[447,1611,1612],{"class":449,"line":497},[447,1613,732],{},[447,1615,1616],{"class":449,"line":503},[447,1617,478],{"emptyLinePlaceholder":477},[447,1619,1620],{"class":449,"line":508},[447,1621,1622],{},"-- ROLLUP = subtotal lũy tiến\n",[447,1624,1625],{"class":449,"line":514},[447,1626,1627],{},"GROUP BY ROLLUP (Year, Month, Day);\n",[447,1629,1630],{"class":449,"line":519},[447,1631,478],{"emptyLinePlaceholder":477},[447,1633,1634],{"class":449,"line":525},[447,1635,1636],{},"-- CUBE = mọi combination\n",[447,1638,1639],{"class":449,"line":531},[447,1640,1641],{},"GROUP BY CUBE (City, Status);\n",[432,1643,1645],{"id":1644},"having-vs-where","HAVING vs WHERE",[437,1647,1649],{"className":439,"code":1648,"language":441,"meta":442,"style":442},"-- WHERE lọc TRƯỚC group, HAVING lọc SAU group\nSELECT City, COUNT(*) cnt\nFROM Customers\nWHERE IsActive = 1                 -- trước group\nGROUP BY City\nHAVING COUNT(*) > 5;               -- sau group\n",[444,1650,1651,1656,1661,1666,1671,1676],{"__ignoreMap":442},[447,1652,1653],{"class":449,"line":450},[447,1654,1655],{},"-- WHERE lọc TRƯỚC group, HAVING lọc SAU group\n",[447,1657,1658],{"class":449,"line":456},[447,1659,1660],{},"SELECT City, COUNT(*) cnt\n",[447,1662,1663],{"class":449,"line":462},[447,1664,1665],{},"FROM Customers\n",[447,1667,1668],{"class":449,"line":468},[447,1669,1670],{},"WHERE IsActive = 1                 -- trước group\n",[447,1672,1673],{"class":449,"line":474},[447,1674,1675],{},"GROUP BY City\n",[447,1677,1678],{"class":449,"line":481},[447,1679,1680],{},"HAVING COUNT(*) > 5;               -- sau group\n",[432,1682,1684],{"id":1683},"string_agg-2017","STRING_AGG (2017+)",[437,1686,1688],{"className":439,"code":1687,"language":441,"meta":442,"style":442},"-- Gộp tên người trong cùng city thành 1 string\nSELECT City, STRING_AGG(Name, ', ')\n    WITHIN GROUP (ORDER BY Name) AS People\nFROM Customers\nGROUP BY City;\n",[444,1689,1690,1695,1700,1705,1709],{"__ignoreMap":442},[447,1691,1692],{"class":449,"line":450},[447,1693,1694],{},"-- Gộp tên người trong cùng city thành 1 string\n",[447,1696,1697],{"class":449,"line":456},[447,1698,1699],{},"SELECT City, STRING_AGG(Name, ', ')\n",[447,1701,1702],{"class":449,"line":462},[447,1703,1704],{},"    WITHIN GROUP (ORDER BY Name) AS People\n",[447,1706,1707],{"class":449,"line":468},[447,1708,1665],{},[447,1710,1711],{"class":449,"line":474},[447,1712,1713],{},"GROUP BY City;\n",[427,1715,1717],{"id":1716},"_7-pivot-unpivot","7. PIVOT \u002F UNPIVOT",[437,1719,1721],{"className":439,"code":1720,"language":441,"meta":442,"style":442},"-- Doanh thu theo tháng, hàng = sản phẩm\nSELECT *\nFROM (\n    SELECT ProductName, MONTH(OrderDate) AS m, Total\n    FROM Orders\n) src\nPIVOT (\n    SUM(Total) FOR m IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])\n) AS p;\n",[444,1722,1723,1728,1733,1737,1742,1746,1751,1756,1761],{"__ignoreMap":442},[447,1724,1725],{"class":449,"line":450},[447,1726,1727],{},"-- Doanh thu theo tháng, hàng = sản phẩm\n",[447,1729,1730],{"class":449,"line":456},[447,1731,1732],{},"SELECT *\n",[447,1734,1735],{"class":449,"line":462},[447,1736,936],{},[447,1738,1739],{"class":449,"line":468},[447,1740,1741],{},"    SELECT ProductName, MONTH(OrderDate) AS m, Total\n",[447,1743,1744],{"class":449,"line":474},[447,1745,1403],{},[447,1747,1748],{"class":449,"line":481},[447,1749,1750],{},") src\n",[447,1752,1753],{"class":449,"line":487},[447,1754,1755],{},"PIVOT (\n",[447,1757,1758],{"class":449,"line":492},[447,1759,1760],{},"    SUM(Total) FOR m IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])\n",[447,1762,1763],{"class":449,"line":497},[447,1764,1765],{},") AS p;\n",[585,1767,1768],{},"PIVOT hay được dùng cho báo cáo. Với data dynamic cột → kết hợp dynamic SQL.",[427,1770,1772],{"id":1771},"_8-transaction-acid","8. Transaction & ACID",[432,1774,1776],{"id":1775},"cú-pháp-transaction","Cú pháp transaction",[437,1778,1780],{"className":439,"code":1779,"language":441,"meta":442,"style":442},"BEGIN TRANSACTION;\nBEGIN TRY\n    UPDATE Accounts SET Balance = Balance - 1000 WHERE Id = 1;\n    UPDATE Accounts SET Balance = Balance + 1000 WHERE Id = 2;\n    \n    IF (SELECT Balance FROM Accounts WHERE Id = 1) \u003C 0\n        THROW 50001, N'Insufficient funds', 1;\n    \n    COMMIT TRANSACTION;\nEND TRY\nBEGIN CATCH\n    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;\n    THROW;            -- rethrow để app biết\nEND CATCH\n",[444,1781,1782,1787,1792,1797,1802,1806,1811,1816,1820,1825,1830,1835,1840,1845],{"__ignoreMap":442},[447,1783,1784],{"class":449,"line":450},[447,1785,1786],{},"BEGIN TRANSACTION;\n",[447,1788,1789],{"class":449,"line":456},[447,1790,1791],{},"BEGIN TRY\n",[447,1793,1794],{"class":449,"line":462},[447,1795,1796],{},"    UPDATE Accounts SET Balance = Balance - 1000 WHERE Id = 1;\n",[447,1798,1799],{"class":449,"line":468},[447,1800,1801],{},"    UPDATE Accounts SET Balance = Balance + 1000 WHERE Id = 2;\n",[447,1803,1804],{"class":449,"line":474},[447,1805,1227],{},[447,1807,1808],{"class":449,"line":481},[447,1809,1810],{},"    IF (SELECT Balance FROM Accounts WHERE Id = 1) \u003C 0\n",[447,1812,1813],{"class":449,"line":487},[447,1814,1815],{},"        THROW 50001, N'Insufficient funds', 1;\n",[447,1817,1818],{"class":449,"line":492},[447,1819,1227],{},[447,1821,1822],{"class":449,"line":497},[447,1823,1824],{},"    COMMIT TRANSACTION;\n",[447,1826,1827],{"class":449,"line":503},[447,1828,1829],{},"END TRY\n",[447,1831,1832],{"class":449,"line":508},[447,1833,1834],{},"BEGIN CATCH\n",[447,1836,1837],{"class":449,"line":514},[447,1838,1839],{},"    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;\n",[447,1841,1842],{"class":449,"line":519},[447,1843,1844],{},"    THROW;            -- rethrow để app biết\n",[447,1846,1847],{"class":449,"line":525},[447,1848,1849],{},"END CATCH\n",[432,1851,1853],{"id":1852},"savepoint","Savepoint",[437,1855,1857],{"className":439,"code":1856,"language":441,"meta":442,"style":442},"BEGIN TRANSACTION;\nINSERT INTO Logs VALUES ('Step 1');\nSAVE TRANSACTION sp1;\n\nINSERT INTO Logs VALUES ('Step 2');\nIF (@@ERROR \u003C> 0) ROLLBACK TRANSACTION sp1;   -- rollback về step 1 thôi\n\nCOMMIT TRANSACTION;\n",[444,1858,1859,1863,1868,1873,1877,1882,1887,1891],{"__ignoreMap":442},[447,1860,1861],{"class":449,"line":450},[447,1862,1786],{},[447,1864,1865],{"class":449,"line":456},[447,1866,1867],{},"INSERT INTO Logs VALUES ('Step 1');\n",[447,1869,1870],{"class":449,"line":462},[447,1871,1872],{},"SAVE TRANSACTION sp1;\n",[447,1874,1875],{"class":449,"line":468},[447,1876,478],{"emptyLinePlaceholder":477},[447,1878,1879],{"class":449,"line":474},[447,1880,1881],{},"INSERT INTO Logs VALUES ('Step 2');\n",[447,1883,1884],{"class":449,"line":481},[447,1885,1886],{},"IF (@@ERROR \u003C> 0) ROLLBACK TRANSACTION sp1;   -- rollback về step 1 thôi\n",[447,1888,1889],{"class":449,"line":487},[447,1890,478],{"emptyLinePlaceholder":477},[447,1892,1893],{"class":449,"line":492},[447,1894,1895],{},"COMMIT TRANSACTION;\n",[432,1897,1899],{"id":1898},"acid-định-nghĩa","ACID — định nghĩa",[1901,1902,1903,1915],"table",{},[1904,1905,1906],"thead",{},[1907,1908,1909,1912],"tr",{},[1910,1911],"th",{},[1910,1913,1914],{},"Ý nghĩa",[1916,1917,1918,1930,1941,1952],"tbody",{},[1907,1919,1920,1927],{},[1921,1922,1923,1926],"td",{},[589,1924,1925],{},"A","tomicity",[1921,1928,1929],{},"Tất cả hoặc không gì — commit hết hoặc rollback hết.",[1907,1931,1932,1938],{},[1921,1933,1934,1937],{},[589,1935,1936],{},"C","onsistency",[1921,1939,1940],{},"DB trước-sau transaction vẫn hợp lệ (PK, FK, CHECK).",[1907,1942,1943,1949],{},[1921,1944,1945,1948],{},[589,1946,1947],{},"I","solation",[1921,1950,1951],{},"Transaction không thấy nháp của transaction khác.",[1907,1953,1954,1960],{},[1921,1955,1956,1959],{},[589,1957,1958],{},"D","urability",[1921,1961,1962],{},"Sau COMMIT, dữ liệu bền vững dù crash.",[580,1964,587,1965,1968],{"color":582,"icon":583},[589,1966,1967],{},"PV gần như chắc chắn hỏi ACID."," Học thuộc 4 chữ + giải thích bằng ví dụ chuyển khoản ngân hàng.",[427,1970,1972],{"id":1971},"_9-isolation-level","9. Isolation level",[432,1974,1976],{"id":1975},"_5-level-của-sql-server","5 level của SQL Server",[1901,1978,1979,1995],{},[1904,1980,1981],{},[1907,1982,1983,1986,1989,1992],{},[1910,1984,1985],{},"Level",[1910,1987,1988],{},"Dirty read",[1910,1990,1991],{},"Non-repeatable read",[1910,1993,1994],{},"Phantom read",[1916,1996,1997,2009,2025,2036,2047],{},[1907,1998,1999,2002,2005,2007],{},[1921,2000,2001],{},"Read Uncommitted",[1921,2003,2004],{},"✅ Có",[1921,2006,2004],{},[1921,2008,2004],{},[1907,2010,2011,2017,2020,2023],{},[1921,2012,2013,2016],{},[589,2014,2015],{},"Read Committed"," (default)",[1921,2018,2019],{},"❌",[1921,2021,2022],{},"✅",[1921,2024,2022],{},[1907,2026,2027,2030,2032,2034],{},[1921,2028,2029],{},"Repeatable Read",[1921,2031,2019],{},[1921,2033,2019],{},[1921,2035,2022],{},[1907,2037,2038,2041,2043,2045],{},[1921,2039,2040],{},"Serializable",[1921,2042,2019],{},[1921,2044,2019],{},[1921,2046,2019],{},[1907,2048,2049,2052,2054,2056],{},[1921,2050,2051],{},"Snapshot",[1921,2053,2019],{},[1921,2055,2019],{},[1921,2057,2058],{},"❌ (dùng MVCC versioning)",[437,2060,2062],{"className":439,"code":2061,"language":441,"meta":442,"style":442},"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;\n-- ...transaction body...\n\n-- Hoặc per query (hint)\nSELECT * FROM Orders WITH (NOLOCK);    -- = READ UNCOMMITTED — dirty read OK\n",[444,2063,2064,2069,2074,2078,2083],{"__ignoreMap":442},[447,2065,2066],{"class":449,"line":450},[447,2067,2068],{},"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;\n",[447,2070,2071],{"class":449,"line":456},[447,2072,2073],{},"-- ...transaction body...\n",[447,2075,2076],{"class":449,"line":462},[447,2077,478],{"emptyLinePlaceholder":477},[447,2079,2080],{"class":449,"line":468},[447,2081,2082],{},"-- Hoặc per query (hint)\n",[447,2084,2085],{"class":449,"line":474},[447,2086,2087],{},"SELECT * FROM Orders WITH (NOLOCK);    -- = READ UNCOMMITTED — dirty read OK\n",[432,2089,2091],{"id":2090},"_3-anomaly-cần-thuộc","3 anomaly cần thuộc",[580,2093,2095],{"color":762,"icon":2094},"i-lucide-info",[774,2096,2097,2102,2107],{},[777,2098,2099,2101],{},[589,2100,1988],{},": đọc dữ liệu của transaction CHƯA commit.",[777,2103,2104,2106],{},[589,2105,1991],{},": đọc cùng row 2 lần, lần 2 thấy khác (vì transaction khác UPDATE+commit giữa chừng).",[777,2108,2109,2111],{},[589,2110,1994],{},": query 1 range 2 lần, lần 2 thấy thêm\u002Fbớt row (vì transaction khác INSERT\u002FDELETE).",[580,2113,2114,2122],{"color":582,"icon":583},[585,2115,587,2116,768,2119],{},[589,2117,2118],{},"Câu PV hot:",[770,2120,2121],{},"\"SQL Server default isolation là gì? Postgres default là gì? Khác gì?\"",[774,2123,2124,2131,2141],{},[777,2125,2126,2127,2130],{},"SQL Server: ",[589,2128,2129],{},"READ COMMITTED"," (block, không MVCC mặc định).",[777,2132,2133,2134,2136,2137,2140],{},"Postgres: ",[589,2135,2129],{}," nhưng dùng ",[589,2138,2139],{},"MVCC"," — đọc không block ghi.",[777,2142,2143,2144,2147],{},"MySQL InnoDB: ",[589,2145,2146],{},"REPEATABLE READ"," (default cao hơn 2 cái trên).",[432,2149,2151],{"id":2150},"nolock-đừng-lạm-dụng","NOLOCK — đừng lạm dụng",[585,2153,2154,2157,2158,2161,2162,2165],{},[444,2155,2156],{},"WITH (NOLOCK)"," = ",[444,2159,2160],{},"READ UNCOMMITTED"," cho 1 query. Dùng cho ",[589,2163,2164],{},"báo cáo chấp nhận sai số nhẹ",". Tránh trong code nghiệp vụ (ngân hàng, đơn hàng) — gây dirty read.",[427,2167,2169],{"id":2168},"_10-deadlock-nhận-biết-tránh","10. Deadlock — nhận biết & tránh",[580,2171,2174,2180,2185],{"color":2172,"icon":2173},"error","i-lucide-alert-octagon",[585,2175,2176,2179],{},[589,2177,2178],{},"Deadlock"," = 2+ transaction giữ lock và chờ nhau, bế tắc. SQL Server tự pick \"deadlock victim\" và rollback nó.",[585,2181,2182],{},[589,2183,2184],{},"Cách tránh:",[774,2186,2187,2194,2200,2203],{},[777,2188,2189,2190,2193],{},"Lock theo ",[589,2191,2192],{},"cùng thứ tự"," trong mọi transaction (vd: luôn UPDATE Account A trước B).",[777,2195,2196,2197,805],{},"Giữ transaction ",[589,2198,2199],{},"ngắn",[777,2201,2202],{},"Update đúng cột cần, không lock thừa.",[777,2204,2205],{},"Isolation thấp hơn nếu được (Snapshot).",[437,2207,2209],{"className":439,"code":2208,"language":441,"meta":442,"style":442},"-- Bật theo dõi deadlock trong session\nDBCC TRACEON (1222, -1);   -- log deadlock graph ra ERRORLOG\n",[444,2210,2211,2216],{"__ignoreMap":442},[447,2212,2213],{"class":449,"line":450},[447,2214,2215],{},"-- Bật theo dõi deadlock trong session\n",[447,2217,2218],{"class":449,"line":456},[447,2219,2220],{},"DBCC TRACEON (1222, -1);   -- log deadlock graph ra ERRORLOG\n",[427,2222,2224],{"id":2223},"_11-ai-augmented-query-optimization-sql-server-2025","11. AI-Augmented Query Optimization (SQL Server 2025)",[585,2226,2227],{},"SQL Server 2025 dua AI\u002FML vao query optimizer -- engine tu hoc tu workload thuc te de chon plan tot hon.",[432,2229,2231],{"id":2230},"cardinality-estimation-ce-feedback","Cardinality Estimation (CE) Feedback",[580,2233,2234,2235,2238,2239,2242],{"color":762,"icon":273},"CE Feedback la tinh nang ",[589,2236,2237],{},"hoc tu query lap lai",". Engine ghi nhan khi uoc luong cardinality sai, tu dieu chinh cho lan chay sau. ",[589,2240,2241],{},"Du lieu feedback duoc persist qua restart"," -- khong mat khi reboot.",[437,2244,2246],{"className":439,"code":2245,"language":441,"meta":442,"style":442},"-- Bat CE Feedback (mac dinh ON trong 2025)\nALTER DATABASE SCOPED CONFIGURATION\nSET CE_FEEDBACK = ON;\n\n-- Kiem tra feedback da duoc ap dung\nSELECT * FROM sys.query_store_plan_feedback\nWHERE feature_id = 1;  -- CE feedback\n",[444,2247,2248,2253,2258,2263,2267,2272,2277],{"__ignoreMap":442},[447,2249,2250],{"class":449,"line":450},[447,2251,2252],{},"-- Bat CE Feedback (mac dinh ON trong 2025)\n",[447,2254,2255],{"class":449,"line":456},[447,2256,2257],{},"ALTER DATABASE SCOPED CONFIGURATION\n",[447,2259,2260],{"class":449,"line":462},[447,2261,2262],{},"SET CE_FEEDBACK = ON;\n",[447,2264,2265],{"class":449,"line":468},[447,2266,478],{"emptyLinePlaceholder":477},[447,2268,2269],{"class":449,"line":474},[447,2270,2271],{},"-- Kiem tra feedback da duoc ap dung\n",[447,2273,2274],{"class":449,"line":481},[447,2275,2276],{},"SELECT * FROM sys.query_store_plan_feedback\n",[447,2278,2279],{"class":449,"line":487},[447,2280,2281],{},"WHERE feature_id = 1;  -- CE feedback\n",[580,2283,2284,2292],{"color":582,"icon":583},[585,2285,587,2286,768,2289],{},[589,2287,2288],{},"Cau PV 2026:",[770,2290,2291],{},"\"CE Feedback giai quyet van de gi?\"",[774,2293,2294,2300,2306],{},[777,2295,2296,2299],{},[589,2297,2298],{},"Bad parameter sniffing"," -- khi plan duoc compile cho tham so A nhung chay voi tham so B gay scan ca bang.",[777,2301,2302,2303,805],{},"CE Feedback phat hien sai, tu tao plan moi -- ",[589,2304,2305],{},"khong can RECOMPILE hint hay plan guide thu cong",[777,2307,2308,2309,2312,2313,805],{},"Khac voi Query Store plan forcing: CE Feedback ",[589,2310,2311],{},"tu dong"," va ",[589,2314,2315],{},"hoc lien tuc",[432,2317,2319],{"id":2318},"pspo-parameter-sensitive-plan-optimization","PSPO -- Parameter Sensitive Plan Optimization",[437,2321,2323],{"className":439,"code":2322,"language":441,"meta":442,"style":442},"-- Bat PSPO (mac dinh ON trong 2025)\nALTER DATABASE SCOPED CONFIGURATION\nSET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;\n",[444,2324,2325,2330,2334],{"__ignoreMap":442},[447,2326,2327],{"class":449,"line":450},[447,2328,2329],{},"-- Bat PSPO (mac dinh ON trong 2025)\n",[447,2331,2332],{"class":449,"line":456},[447,2333,2257],{},[447,2335,2336],{"class":449,"line":462},[447,2337,2338],{},"SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;\n",[585,2340,2341,2342,2345],{},"PSPO cache ",[589,2343,2344],{},"nhieu execution plan"," cho cung 1 query, moi plan toi uu cho 1 khoang gia tri tham so khac nhau. Khi chay, engine tu chon plan phu hop nhat voi gia tri hien tai.",[580,2347,2349,2352,2353,2356,2357,2360,2361,2364],{"color":762,"icon":2348},"i-lucide-lightbulb",[589,2350,2351],{},"Khi nao dung:"," stored procedure co tham so ",[444,2354,2355],{},"@Status"," -- khi ",[444,2358,2359],{},"@Status = 'Active'"," tra 90% bang, khi ",[444,2362,2363],{},"@Status = 'Suspended'"," tra 0.1% bang. PSPO giu 2 plan rieng, khong con \"1 plan fit all\" gay loi.",[432,2366,2368],{"id":2367},"oppo-optional-parameter-plan-optimization","OPPO -- Optional Parameter Plan Optimization",[585,2370,2371,2372,2375],{},"Giai quyet van de ",[589,2373,2374],{},"optional parameter"," -- khi tham so co the NULL hoac co gia tri:",[437,2377,2379],{"className":439,"code":2378,"language":441,"meta":442,"style":442},"-- Pattern pho bien gay van de:\nSELECT * FROM Orders\nWHERE (@CustomerId IS NULL OR CustomerId = @CustomerId)\n  AND (@Status IS NULL OR Status = @Status);\n-- ⚠️ OPTION (RECOMPILE) truoc day la cach chua duy nhat\n",[444,2380,2381,2386,2391,2396,2401],{"__ignoreMap":442},[447,2382,2383],{"class":449,"line":450},[447,2384,2385],{},"-- Pattern pho bien gay van de:\n",[447,2387,2388],{"class":449,"line":456},[447,2389,2390],{},"SELECT * FROM Orders\n",[447,2392,2393],{"class":449,"line":462},[447,2394,2395],{},"WHERE (@CustomerId IS NULL OR CustomerId = @CustomerId)\n",[447,2397,2398],{"class":449,"line":468},[447,2399,2400],{},"  AND (@Status IS NULL OR Status = @Status);\n",[447,2402,2403],{"class":449,"line":474},[447,2404,2405],{},"-- ⚠️ OPTION (RECOMPILE) truoc day la cach chua duy nhat\n",[585,2407,2408,2409,805],{},"OPPO tu dong nhan dien pattern nay, tao plan toi uu cho tung to hop tham so, ",[589,2410,2411],{},"khong can OPTION (RECOMPILE)",[432,2413,2415],{"id":2414},"optimized-locking-dot-pha-ve-concurrency","Optimized Locking -- dot pha ve concurrency",[580,2417,587,2419,2422,2423,2426],{"color":582,"icon":2418},"i-lucide-lock",[589,2420,2421],{},"Dot pha ve concurrency trong SQL Server 2025:"," Optimized Locking loai bo ",[589,2424,2425],{},"lock escalation"," -- row-level locks giu nguyen row-level trong suot transaction. Giam blocking dang ke, dac biet voi workload OLTP nang.",[437,2428,2430],{"className":439,"code":2429,"language":441,"meta":442,"style":442},"-- Bat Optimized Locking (mac dinh ON trong 2025)\nALTER DATABASE SCOPED CONFIGURATION\nSET OPTIMIZED_LOCKING = ON;\n",[444,2431,2432,2437,2441],{"__ignoreMap":442},[447,2433,2434],{"class":449,"line":450},[447,2435,2436],{},"-- Bat Optimized Locking (mac dinh ON trong 2025)\n",[447,2438,2439],{"class":449,"line":456},[447,2440,2257],{},[447,2442,2443],{"class":449,"line":462},[447,2444,2445],{},"SET OPTIMIZED_LOCKING = ON;\n",[1901,2447,2448,2458],{},[1904,2449,2450],{},[1907,2451,2452,2455],{},[1910,2453,2454],{},"Truoc 2025",[1910,2456,2457],{},"Tu 2025",[1916,2459,2460,2468],{},[1907,2461,2462,2465],{},[1921,2463,2464],{},"UPDATE 10,000 rows → escalate len page\u002Ftable lock",[1921,2466,2467],{},"UPDATE 10,000 rows → giu 10,000 row-level locks",[1907,2469,2470,2473],{},[1921,2471,2472],{},"Chan toan bo session khac",[1921,2474,2475],{},"Session khac van truy cap rows khac binh thuong",[432,2477,2479],{"id":2478},"laq-lock-after-qualification","LAQ -- Lock After Qualification",[437,2481,2483],{"className":439,"code":2482,"language":441,"meta":442,"style":442},"-- Pattern duoc LAQ toi uu:\nUPDATE Orders SET Status = 'Processed'\nWHERE Status = 'Pending' AND OrderDate \u003C '2026-01-01';\n",[444,2484,2485,2490,2495],{"__ignoreMap":442},[447,2486,2487],{"class":449,"line":450},[447,2488,2489],{},"-- Pattern duoc LAQ toi uu:\n",[447,2491,2492],{"class":449,"line":456},[447,2493,2494],{},"UPDATE Orders SET Status = 'Processed'\n",[447,2496,2497],{"class":449,"line":462},[447,2498,2499],{},"WHERE Status = 'Pending' AND OrderDate \u003C '2026-01-01';\n",[1901,2501,2502,2511],{},[1904,2503,2504],{},[1907,2505,2506,2508],{},[1910,2507,2454],{},[1910,2509,2510],{},"Voi LAQ",[1916,2512,2513],{},[1907,2514,2515,2518],{},[1921,2516,2517],{},"Lock TAT CA rows trong bang → loc WHERE → update rows match",[1921,2519,2520],{},"Loc WHERE truoc → chi lock rows match dieu kien",[580,2522,587,2523,768,2526,2529,2530,2533],{"color":762,"icon":583},[589,2524,2525],{},"Cau PV:",[770,2527,2528],{},"\"LAQ khac gi voi cach lock truyen thong?\""," → Lock After Qualification ",[589,2531,2532],{},"loc truoc, lock sau"," -- giam so luong lock, giam blocking, tang throughput. Dac biet hieu qua khi WHERE filter ra it rows (\u003C 10% bang).",[427,2535,2537],{"id":2536},"_12-batch-mode-cho-built-in-functions-sql-server-2025","12. Batch Mode cho Built-in Functions (SQL Server 2025)",[585,2539,2540,2541,2544],{},"Cac ham built-in nay gio chay o ",[589,2542,2543],{},"batch mode (vectorized)"," thay vi row-by-row:",[2546,2547,2548],"blockquote",{},[585,2549,2550,2553,2554,2553,2557,2553,2560,2553,2563,2553,2566,2553,2569,2553,2572,2553,2575,2553,2578,2553,2581,2553,2584,2553,2587],{},[444,2551,2552],{},"ABS()",", ",[444,2555,2556],{},"SIN()",[444,2558,2559],{},"COS()",[444,2561,2562],{},"DATE_TRUNC()",[444,2564,2565],{},"LOG()",[444,2567,2568],{},"EXP()",[444,2570,2571],{},"SQRT()",[444,2573,2574],{},"POWER()",[444,2576,2577],{},"CEILING()",[444,2579,2580],{},"FLOOR()",[444,2582,2583],{},"ROUND()",[444,2585,2586],{},"GREATEST()",[444,2588,2589],{},"LEAST()",[437,2591,2593],{"className":439,"code":2592,"language":441,"meta":442,"style":442},"-- Query nay gio chay ~70% nhanh hon nho batch mode\nSELECT\n    ABS(PriceChange) AS AbsoluteChange,\n    SIN(RADIANS(Latitude)) AS SinLat,\n    DATE_TRUNC('month', OrderDate) AS OrderMonth\nFROM Orders\nWHERE OrderDate >= '2026-01-01';\n",[444,2594,2595,2600,2604,2609,2614,2619,2624],{"__ignoreMap":442},[447,2596,2597],{"class":449,"line":450},[447,2598,2599],{},"-- Query nay gio chay ~70% nhanh hon nho batch mode\n",[447,2601,2602],{"class":449,"line":456},[447,2603,1334],{},[447,2605,2606],{"class":449,"line":462},[447,2607,2608],{},"    ABS(PriceChange) AS AbsoluteChange,\n",[447,2610,2611],{"class":449,"line":468},[447,2612,2613],{},"    SIN(RADIANS(Latitude)) AS SinLat,\n",[447,2615,2616],{"class":449,"line":474},[447,2617,2618],{},"    DATE_TRUNC('month', OrderDate) AS OrderMonth\n",[447,2620,2621],{"class":449,"line":481},[447,2622,2623],{},"FROM Orders\n",[447,2625,2626],{"class":449,"line":487},[447,2627,2628],{},"WHERE OrderDate >= '2026-01-01';\n",[580,2630,2631,2638],{"color":582,"icon":583},[585,2632,587,2633,768,2635],{},[589,2634,2525],{},[770,2636,2637],{},"\"Batch mode la gi? Tai sao 2025 lai mo rong?\"",[774,2639,2640,2647,2650,2659],{},[777,2641,2642,2643,2646],{},"Batch mode xu ly ",[589,2644,2645],{},"900 rows\u002Flan"," (vectorized), thay vi tung row mot (row mode).",[777,2648,2649],{},"Truoc 2025: chi columnstore indexes, aggregate functions (SUM, AVG) va mot vai operator dung batch mode.",[777,2651,2652,2655,2656,805],{},[589,2653,2654],{},"2025:"," mo rong sang built-in scalar functions -- ",[589,2657,2658],{},"CPU-bound queries cai thien ~70%",[777,2660,2661],{},"Khong can thay doi code -- optimizer tu chon batch mode khi co loi.",[427,2663,2665],{"id":2664},"_13-optimized_sp_executesql-sql-server-2025","13. OPTIMIZED_SP_EXECUTESQL (SQL Server 2025)",[580,2667,587,2668,2671],{"color":582,"icon":268},[589,2669,2670],{},"Tinh nang danh cho high-concurrency:"," ngăn \"compile storm\" khi hang tram\u002Fhang ngan connection goi cung 1 stored procedure dong thoi.",[437,2673,2675],{"className":439,"code":2674,"language":441,"meta":442,"style":442},"-- Thay vi sp_executesql thong thuong\nEXEC sp_executesql @sql, @params, @p1, @p2;\n\n-- Dung OPTIMIZED variant\nEXEC sys.OPTIMIZED_SP_EXECUTESQL @sql, @params, @p1, @p2;\n",[444,2676,2677,2682,2687,2691,2696],{"__ignoreMap":442},[447,2678,2679],{"class":449,"line":450},[447,2680,2681],{},"-- Thay vi sp_executesql thong thuong\n",[447,2683,2684],{"class":449,"line":456},[447,2685,2686],{},"EXEC sp_executesql @sql, @params, @p1, @p2;\n",[447,2688,2689],{"class":449,"line":462},[447,2690,478],{"emptyLinePlaceholder":477},[447,2692,2693],{"class":449,"line":468},[447,2694,2695],{},"-- Dung OPTIMIZED variant\n",[447,2697,2698],{"class":449,"line":474},[447,2699,2700],{},"EXEC sys.OPTIMIZED_SP_EXECUTESQL @sql, @params, @p1, @p2;\n",[585,2702,2703,2706],{},[589,2704,2705],{},"Van de:"," Khi nhieu connection cung goi 1 stored procedure lan dau tien, moi connection deu co gang compile rieng → \"compile storm\" ton CPU, tranh Plan Cache.",[585,2708,2709,768,2712,2715,2716,2719],{},[589,2710,2711],{},"Giai phap:",[444,2713,2714],{},"OPTIMIZED_SP_EXECUTESQL"," chia se ",[589,2717,2718],{},"cung 1 compiled plan"," cho tat ca cac concurrent executions, chi compile 1 lan duy nhat.",[580,2721,2722,2724],{"color":762,"icon":2094},[589,2723,2351],{}," API endpoint duoc goi > 1000 req\u002Fs, moi req goi cung 1 stored procedure. Dung OPTIMIZED variant giam CPU compile, tang throughput.",[427,2726,2728],{"id":2727},"_14-vector-search-trong-truy-van","14. Vector Search trong Truy van",[585,2730,2731,2732,2735],{},"SQL Server 2025 ho tro ",[589,2733,2734],{},"native vector operations"," cho semantic\u002Fembedding search.",[432,2737,2739],{"id":2738},"semantic-search-ket-hop-sql-truyen-thong","Semantic search ket hop SQL truyen thong",[437,2741,2743],{"className":439,"code":2742,"language":441,"meta":442,"style":442},"-- Tim 10 san pham tuong tu nhat, kem loc theo category + gia\nDECLARE @query_vector VECTOR(1536);\n-- @query_vector duoc tao tu embedding model (OpenAI, v.v.)\n\nSELECT TOP 10\n    p.name,\n    p.price,\n    VECTOR_DISTANCE('cosine', p.embedding, @query_vector) AS score\nFROM products p\nWHERE p.category_id = 5\n    AND p.price BETWEEN 100 AND 1000\nORDER BY score ASC;\n",[444,2744,2745,2750,2755,2760,2764,2769,2774,2779,2784,2789,2794,2799],{"__ignoreMap":442},[447,2746,2747],{"class":449,"line":450},[447,2748,2749],{},"-- Tim 10 san pham tuong tu nhat, kem loc theo category + gia\n",[447,2751,2752],{"class":449,"line":456},[447,2753,2754],{},"DECLARE @query_vector VECTOR(1536);\n",[447,2756,2757],{"class":449,"line":462},[447,2758,2759],{},"-- @query_vector duoc tao tu embedding model (OpenAI, v.v.)\n",[447,2761,2762],{"class":449,"line":468},[447,2763,478],{"emptyLinePlaceholder":477},[447,2765,2766],{"class":449,"line":474},[447,2767,2768],{},"SELECT TOP 10\n",[447,2770,2771],{"class":449,"line":481},[447,2772,2773],{},"    p.name,\n",[447,2775,2776],{"class":449,"line":487},[447,2777,2778],{},"    p.price,\n",[447,2780,2781],{"class":449,"line":492},[447,2782,2783],{},"    VECTOR_DISTANCE('cosine', p.embedding, @query_vector) AS score\n",[447,2785,2786],{"class":449,"line":497},[447,2787,2788],{},"FROM products p\n",[447,2790,2791],{"class":449,"line":503},[447,2792,2793],{},"WHERE p.category_id = 5\n",[447,2795,2796],{"class":449,"line":508},[447,2797,2798],{},"    AND p.price BETWEEN 100 AND 1000\n",[447,2800,2801],{"class":449,"line":514},[447,2802,2803],{},"ORDER BY score ASC;\n",[432,2805,2807],{"id":2806},"hybrid-search-filter-vector","Hybrid search: filter + vector",[437,2809,2811],{"className":439,"code":2810,"language":441,"meta":442,"style":442},"-- Dung VECTOR_SEARCH de lay tap ung vien, sau do JOIN loc them\nWITH semantic AS (\n    SELECT\n        id,\n        VECTOR_DISTANCE('cosine', embedding, @query_vector) AS score\n    FROM products\n    WHERE VECTOR_SEARCH(embedding, @query_vector, 100)\n)\nSELECT p.*, s.score\nFROM products p\nJOIN semantic s ON p.id = s.id\nWHERE p.in_stock = 1\nORDER BY s.score ASC;\n",[444,2812,2813,2818,2823,2828,2833,2838,2843,2848,2852,2857,2861,2866,2871],{"__ignoreMap":442},[447,2814,2815],{"class":449,"line":450},[447,2816,2817],{},"-- Dung VECTOR_SEARCH de lay tap ung vien, sau do JOIN loc them\n",[447,2819,2820],{"class":449,"line":456},[447,2821,2822],{},"WITH semantic AS (\n",[447,2824,2825],{"class":449,"line":462},[447,2826,2827],{},"    SELECT\n",[447,2829,2830],{"class":449,"line":468},[447,2831,2832],{},"        id,\n",[447,2834,2835],{"class":449,"line":474},[447,2836,2837],{},"        VECTOR_DISTANCE('cosine', embedding, @query_vector) AS score\n",[447,2839,2840],{"class":449,"line":481},[447,2841,2842],{},"    FROM products\n",[447,2844,2845],{"class":449,"line":487},[447,2846,2847],{},"    WHERE VECTOR_SEARCH(embedding, @query_vector, 100)\n",[447,2849,2850],{"class":449,"line":492},[447,2851,1102],{},[447,2853,2854],{"class":449,"line":497},[447,2855,2856],{},"SELECT p.*, s.score\n",[447,2858,2859],{"class":449,"line":503},[447,2860,2788],{},[447,2862,2863],{"class":449,"line":508},[447,2864,2865],{},"JOIN semantic s ON p.id = s.id\n",[447,2867,2868],{"class":449,"line":514},[447,2869,2870],{},"WHERE p.in_stock = 1\n",[447,2872,2873],{"class":449,"line":519},[447,2874,2875],{},"ORDER BY s.score ASC;\n",[580,2877,2878,2885],{"color":762,"icon":583},[585,2879,587,2880,768,2882],{},[589,2881,2288],{},[770,2883,2884],{},"\"Hybrid search la gi? Tai sao khong chi dung vector?\"",[774,2886,2887,2893,2896,2903],{},[777,2888,2889,2892],{},[589,2890,2891],{},"Hybrid search"," = vector similarity + traditional SQL filter (WHERE, JOIN, GROUP BY).",[777,2894,2895],{},"Chi dung vector: tim \"giay chay bo\" tra ve ca san pham het hang hoac sai category.",[777,2897,2898,2899,2902],{},"Hybrid: semantic similarity ",[589,2900,2901],{},"trong pham vi"," category=\"shoes\" AND in_stock=1.",[777,2904,2905,2908],{},[589,2906,2907],{},"Pattern:"," CTE\u002FWITH de tinh vector score → JOIN ra bang goc → loc them.",[432,2910,2912],{"id":2911},"tao-quan-ly-vector-index","Tao & quan ly vector index",[437,2914,2916],{"className":439,"code":2915,"language":441,"meta":442,"style":442},"-- Tao vector index cho tim kiem ANN (Approximate Nearest Neighbor)\nCREATE VECTOR INDEX idx_product_embedding\nON products (embedding)\nWITH (DISTANCE_METRIC = 'cosine', INDEX_TYPE = 'IVFFLAT');\n\n-- Query su dung index\nSELECT TOP 20 name, VECTOR_DISTANCE('cosine', embedding, @query_vector) AS score\nFROM products\nORDER BY score ASC;\n",[444,2917,2918,2923,2928,2933,2938,2942,2947,2952,2957],{"__ignoreMap":442},[447,2919,2920],{"class":449,"line":450},[447,2921,2922],{},"-- Tao vector index cho tim kiem ANN (Approximate Nearest Neighbor)\n",[447,2924,2925],{"class":449,"line":456},[447,2926,2927],{},"CREATE VECTOR INDEX idx_product_embedding\n",[447,2929,2930],{"class":449,"line":462},[447,2931,2932],{},"ON products (embedding)\n",[447,2934,2935],{"class":449,"line":468},[447,2936,2937],{},"WITH (DISTANCE_METRIC = 'cosine', INDEX_TYPE = 'IVFFLAT');\n",[447,2939,2940],{"class":449,"line":474},[447,2941,478],{"emptyLinePlaceholder":477},[447,2943,2944],{"class":449,"line":481},[447,2945,2946],{},"-- Query su dung index\n",[447,2948,2949],{"class":449,"line":487},[447,2950,2951],{},"SELECT TOP 20 name, VECTOR_DISTANCE('cosine', embedding, @query_vector) AS score\n",[447,2953,2954],{"class":449,"line":492},[447,2955,2956],{},"FROM products\n",[447,2958,2959],{"class":449,"line":497},[447,2960,2803],{},[580,2962,2963,768,2966,2969,2970,2553,2973,2976],{"color":762,"icon":2094},[589,2964,2965],{},"Distance metrics:",[444,2967,2968],{},"cosine"," (pho bien nhat cho semantic similarity), ",[444,2971,2972],{},"euclidean",[444,2974,2975],{},"dot_product",". Chon tuy theo embedding model cua ban.",[427,2978,2980],{"id":2979},"_15-json-queries-nang-cao","15. JSON Queries Nang Cao",[585,2982,2983],{},"SQL Server 2025 bo sung cac ham xu ly JSON manh me hon.",[432,2985,2987],{"id":2986},"json_table-bien-json-thanh-bang-quan-he","JSON_TABLE -- bien JSON thanh bang quan he",[437,2989,2991],{"className":439,"code":2990,"language":441,"meta":442,"style":442},"-- JSON_TABLE: tuong tu MySQL, chuyen JSON array thanh cac row\nSELECT j.*\nFROM orders\nCROSS APPLY OPENJSON(order_data, '$.items')\n    WITH (\n        product_id INT       '$.product_id',\n        qty        INT       '$.qty',\n        price      DECIMAL(10,2) '$.price'\n    ) AS j;\n",[444,2992,2993,2998,3003,3008,3013,3018,3023,3028,3033],{"__ignoreMap":442},[447,2994,2995],{"class":449,"line":450},[447,2996,2997],{},"-- JSON_TABLE: tuong tu MySQL, chuyen JSON array thanh cac row\n",[447,2999,3000],{"class":449,"line":456},[447,3001,3002],{},"SELECT j.*\n",[447,3004,3005],{"class":449,"line":462},[447,3006,3007],{},"FROM orders\n",[447,3009,3010],{"class":449,"line":468},[447,3011,3012],{},"CROSS APPLY OPENJSON(order_data, '$.items')\n",[447,3014,3015],{"class":449,"line":474},[447,3016,3017],{},"    WITH (\n",[447,3019,3020],{"class":449,"line":481},[447,3021,3022],{},"        product_id INT       '$.product_id',\n",[447,3024,3025],{"class":449,"line":487},[447,3026,3027],{},"        qty        INT       '$.qty',\n",[447,3029,3030],{"class":449,"line":492},[447,3031,3032],{},"        price      DECIMAL(10,2) '$.price'\n",[447,3034,3035],{"class":449,"line":497},[447,3036,3037],{},"    ) AS j;\n",[432,3039,3041],{"id":3040},"json_contains-kiem-tra-gia-tri-trong-json","JSON_CONTAINS -- kiem tra gia tri trong JSON",[437,3043,3045],{"className":439,"code":3044,"language":441,"meta":442,"style":442},"-- Kiem tra JSON co chua gia tri 'error' trong field $.level khong\nSELECT *\nFROM logs\nWHERE JSON_CONTAINS(payload, 'error', '$.level');\n\n-- Tim san pham co tag 'sale'\nSELECT *\nFROM products\nWHERE JSON_CONTAINS(tags, '\"sale\"');\n",[444,3046,3047,3052,3056,3061,3066,3070,3075,3079,3083],{"__ignoreMap":442},[447,3048,3049],{"class":449,"line":450},[447,3050,3051],{},"-- Kiem tra JSON co chua gia tri 'error' trong field $.level khong\n",[447,3053,3054],{"class":449,"line":456},[447,3055,1732],{},[447,3057,3058],{"class":449,"line":462},[447,3059,3060],{},"FROM logs\n",[447,3062,3063],{"class":449,"line":468},[447,3064,3065],{},"WHERE JSON_CONTAINS(payload, 'error', '$.level');\n",[447,3067,3068],{"class":449,"line":474},[447,3069,478],{"emptyLinePlaceholder":477},[447,3071,3072],{"class":449,"line":481},[447,3073,3074],{},"-- Tim san pham co tag 'sale'\n",[447,3076,3077],{"class":449,"line":487},[447,3078,1732],{},[447,3080,3081],{"class":449,"line":492},[447,3082,2956],{},[447,3084,3085],{"class":449,"line":497},[447,3086,3087],{},"WHERE JSON_CONTAINS(tags, '\"sale\"');\n",[432,3089,3091],{"id":3090},"json_path_exists-kiem-tra-path-ton-tai","JSON_PATH_EXISTS -- kiem tra path ton tai",[437,3093,3095],{"className":439,"code":3094,"language":441,"meta":442,"style":442},"SELECT *\nFROM documents\nWHERE JSON_PATH_EXISTS(metadata, '$.author.email');\n",[444,3096,3097,3101,3106],{"__ignoreMap":442},[447,3098,3099],{"class":449,"line":450},[447,3100,1732],{},[447,3102,3103],{"class":449,"line":456},[447,3104,3105],{},"FROM documents\n",[447,3107,3108],{"class":449,"line":462},[447,3109,3110],{},"WHERE JSON_PATH_EXISTS(metadata, '$.author.email');\n",[580,3112,3113,3118],{"color":582,"icon":583},[585,3114,587,3115],{},[589,3116,3117],{},"So sanh nhanh JSON functions:",[1901,3119,3120,3130],{},[1904,3121,3122],{},[1907,3123,3124,3127],{},[1910,3125,3126],{},"Function",[1910,3128,3129],{},"Cong dung",[1916,3131,3132,3146,3156,3166,3176,3186],{},[1907,3133,3134,3143],{},[1921,3135,3136,3139,3140],{},[444,3137,3138],{},"OPENJSON"," + ",[444,3141,3142],{},"WITH",[1921,3144,3145],{},"Parse JSON array → bang (da co tu 2016)",[1907,3147,3148,3153],{},[1921,3149,3150],{},[444,3151,3152],{},"JSON_VALUE",[1921,3154,3155],{},"Lay scalar value tu path",[1907,3157,3158,3163],{},[1921,3159,3160],{},[444,3161,3162],{},"JSON_QUERY",[1921,3164,3165],{},"Lay object\u002Farray tu path",[1907,3167,3168,3173],{},[1921,3169,3170],{},[444,3171,3172],{},"JSON_MODIFY",[1921,3174,3175],{},"Cap nhat gia tri trong JSON",[1907,3177,3178,3183],{},[1921,3179,3180],{},[444,3181,3182],{},"JSON_CONTAINS",[1921,3184,3185],{},"Kiem tra gia tri co ton tai (2025)",[1907,3187,3188,3193],{},[1921,3189,3190],{},[444,3191,3192],{},"JSON_PATH_EXISTS",[1921,3194,3195],{},"Kiem tra path co ton tai (2025)",[427,3197,3199],{"id":3198},"_16-regex-trong-truy-van","16. RegEx trong Truy van",[585,3201,3202],{},"SQL Server 2025 ho tro Regular Expressions native.",[432,3204,3206],{"id":3205},"regexp_like-tim-kiem-pattern","REGEXP_LIKE -- tim kiem pattern",[437,3208,3210],{"className":439,"code":3209,"language":441,"meta":442,"style":442},"-- Tim tai lieu chua tu khoa nhay cam (case-insensitive)\nSELECT *\nFROM documents\nWHERE REGEXP_LIKE(content, '\\b(confidential|secret|internal)\\b', 'i');\n\n-- Validate email format\nSELECT *\nFROM users\nWHERE NOT REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$');\n",[444,3211,3212,3217,3221,3225,3230,3234,3239,3243,3248],{"__ignoreMap":442},[447,3213,3214],{"class":449,"line":450},[447,3215,3216],{},"-- Tim tai lieu chua tu khoa nhay cam (case-insensitive)\n",[447,3218,3219],{"class":449,"line":456},[447,3220,1732],{},[447,3222,3223],{"class":449,"line":462},[447,3224,3105],{},[447,3226,3227],{"class":449,"line":468},[447,3228,3229],{},"WHERE REGEXP_LIKE(content, '\\b(confidential|secret|internal)\\b', 'i');\n",[447,3231,3232],{"class":449,"line":474},[447,3233,478],{"emptyLinePlaceholder":477},[447,3235,3236],{"class":449,"line":481},[447,3237,3238],{},"-- Validate email format\n",[447,3240,3241],{"class":449,"line":487},[447,3242,1732],{},[447,3244,3245],{"class":449,"line":492},[447,3246,3247],{},"FROM users\n",[447,3249,3250],{"class":449,"line":497},[447,3251,3252],{},"WHERE NOT REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$');\n",[432,3254,3256],{"id":3255},"regexp_substr-trich-xuat-du-lieu-tu-text","REGEXP_SUBSTR -- trich xuat du lieu tu text",[437,3258,3260],{"className":439,"code":3259,"language":441,"meta":442,"style":442},"-- Trich xuat dia chi IP tu log\nSELECT\n    id,\n    REGEXP_SUBSTR(description, '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}') AS ip_address\nFROM logs;\n\n-- Trich xuat so dien thoai\nSELECT REGEXP_SUBSTR(notes, '\\d{2,4}[-\\s]?\\d{3,4}[-\\s]?\\d{4}') AS phone\nFROM contacts;\n",[444,3261,3262,3267,3271,3276,3281,3286,3290,3295,3300],{"__ignoreMap":442},[447,3263,3264],{"class":449,"line":450},[447,3265,3266],{},"-- Trich xuat dia chi IP tu log\n",[447,3268,3269],{"class":449,"line":456},[447,3270,1334],{},[447,3272,3273],{"class":449,"line":462},[447,3274,3275],{},"    id,\n",[447,3277,3278],{"class":449,"line":468},[447,3279,3280],{},"    REGEXP_SUBSTR(description, '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}') AS ip_address\n",[447,3282,3283],{"class":449,"line":474},[447,3284,3285],{},"FROM logs;\n",[447,3287,3288],{"class":449,"line":481},[447,3289,478],{"emptyLinePlaceholder":477},[447,3291,3292],{"class":449,"line":487},[447,3293,3294],{},"-- Trich xuat so dien thoai\n",[447,3296,3297],{"class":449,"line":492},[447,3298,3299],{},"SELECT REGEXP_SUBSTR(notes, '\\d{2,4}[-\\s]?\\d{3,4}[-\\s]?\\d{4}') AS phone\n",[447,3301,3302],{"class":449,"line":497},[447,3303,3304],{},"FROM contacts;\n",[432,3306,3308],{"id":3307},"regexp_replace-thay-the-pattern","REGEXP_REPLACE -- thay the pattern",[437,3310,3312],{"className":439,"code":3311,"language":441,"meta":442,"style":442},"-- Mask so dien thoai trong log\nSELECT REGEXP_REPLACE(\n    log_message,\n    '\\d{2,4}[-\\s]?\\d{3,4}[-\\s]?\\d{4}',\n    '***MASKED***'\n) AS sanitized_message\nFROM audit_logs;\n",[444,3313,3314,3319,3324,3329,3334,3339,3344],{"__ignoreMap":442},[447,3315,3316],{"class":449,"line":450},[447,3317,3318],{},"-- Mask so dien thoai trong log\n",[447,3320,3321],{"class":449,"line":456},[447,3322,3323],{},"SELECT REGEXP_REPLACE(\n",[447,3325,3326],{"class":449,"line":462},[447,3327,3328],{},"    log_message,\n",[447,3330,3331],{"class":449,"line":468},[447,3332,3333],{},"    '\\d{2,4}[-\\s]?\\d{3,4}[-\\s]?\\d{4}',\n",[447,3335,3336],{"class":449,"line":474},[447,3337,3338],{},"    '***MASKED***'\n",[447,3340,3341],{"class":449,"line":481},[447,3342,3343],{},") AS sanitized_message\n",[447,3345,3346],{"class":449,"line":487},[447,3347,3348],{},"FROM audit_logs;\n",[432,3350,3352],{"id":3351},"regexp_count-dem-so-lan-xuat-hien","REGEXP_COUNT -- dem so lan xuat hien",[437,3354,3356],{"className":439,"code":3355,"language":441,"meta":442,"style":442},"-- Dem so URL trong bai viet\nSELECT\n    id,\n    REGEXP_COUNT(content, 'https?:\u002F\u002F[^\\s]+') AS url_count\nFROM articles;\n",[444,3357,3358,3363,3367,3371,3376],{"__ignoreMap":442},[447,3359,3360],{"class":449,"line":450},[447,3361,3362],{},"-- Dem so URL trong bai viet\n",[447,3364,3365],{"class":449,"line":456},[447,3366,1334],{},[447,3368,3369],{"class":449,"line":462},[447,3370,3275],{},[447,3372,3373],{"class":449,"line":468},[447,3374,3375],{},"    REGEXP_COUNT(content, 'https?:\u002F\u002F[^\\s]+') AS url_count\n",[447,3377,3378],{"class":449,"line":474},[447,3379,3380],{},"FROM articles;\n",[580,3382,587,3383,768,3385,3388,3389,3392,3393,2553,3396,2553,3399,3402,3403,3406],{"color":762,"icon":583},[589,3384,2525],{},[770,3386,3387],{},"\"Truoc 2025 SQL Server xu ly RegEx nhu the nao?\""," → Chi co ",[444,3390,3391],{},"LIKE"," voi wildcard (",[444,3394,3395],{},"%",[444,3397,3398],{},"_",[444,3400,3401],{},"[abc]",") don gian, hoac dung CLR integration \u002F external script de goi .NET Regex. ",[589,3404,3405],{},"2025 co native RegEx"," -- nhanh hon nhieu, khong can CLR.",[580,3408,3409,3412,3413,3416],{"color":2172,"icon":2173},[589,3410,3411],{},"Canh bao performance:"," RegEx khong dung index. Tranh ",[444,3414,3415],{},"REGEXP_LIKE"," tren bang lon khong co WHERE loc truoc. Pattern nen cang cu the cang tot, tranh backtracking qua sau.",[427,3418,3420],{"id":3419},"_17-intelligent-query-processing-iqp-tong-quan-cap-nhat-2025","17. Intelligent Query Processing (IQP) -- Tong quan & Cap nhat 2025",[585,3422,3423],{},"IQP la bo tinh nang tu dong cai thien query performance, khong can thay doi code.",[432,3425,3427],{"id":3426},"bang-tong-hop-iqp-qua-cac-phien-ban","Bang tong hop IQP qua cac phien ban",[1901,3429,3430,3450],{},[1904,3431,3432],{},[1907,3433,3434,3437,3441,3444,3447],{},[1910,3435,3436],{},"Tinh nang IQP",[1910,3438,3440],{"align":3439},"center","2017",[1910,3442,3443],{"align":3439},"2019",[1910,3445,3446],{"align":3439},"2022",[1910,3448,3449],{"align":3439},"2025",[1916,3451,3452,3467,3482,3498,3514,3529,3544,3563,3580,3597],{},[1907,3453,3454,3459,3461,3463,3465],{},[1921,3455,3456],{},[589,3457,3458],{},"Adaptive Joins",[1921,3460,2022],{"align":3439},[1921,3462,2022],{"align":3439},[1921,3464,2022],{"align":3439},[1921,3466,2022],{"align":3439},[1907,3468,3469,3474,3476,3478,3480],{},[1921,3470,3471],{},[589,3472,3473],{},"Interleaved Execution",[1921,3475,2022],{"align":3439},[1921,3477,2022],{"align":3439},[1921,3479,2022],{"align":3439},[1921,3481,2022],{"align":3439},[1907,3483,3484,3489,3491,3493,3496],{},[1921,3485,3486],{},[589,3487,3488],{},"Memory Grant Feedback",[1921,3490,2022],{"align":3439},[1921,3492,2022],{"align":3439},[1921,3494,3495],{"align":3439},"✅ (cai thien)",[1921,3497,3495],{"align":3439},[1907,3499,3500,3505,3508,3510,3512],{},[1921,3501,3502],{},[589,3503,3504],{},"Table Variable Deferred Compilation",[1921,3506,3507],{"align":3439},"--",[1921,3509,2022],{"align":3439},[1921,3511,2022],{"align":3439},[1921,3513,2022],{"align":3439},[1907,3515,3516,3521,3523,3525,3527],{},[1921,3517,3518],{},[589,3519,3520],{},"Scalar UDF Inlining",[1921,3522,3507],{"align":3439},[1921,3524,2022],{"align":3439},[1921,3526,2022],{"align":3439},[1921,3528,2022],{"align":3439},[1907,3530,3531,3536,3538,3540,3542],{},[1921,3532,3533],{},[589,3534,3535],{},"Degree of Parallelism Feedback (DOP Feedback)",[1921,3537,3507],{"align":3439},[1921,3539,3507],{"align":3439},[1921,3541,2022],{"align":3439},[1921,3543,3495],{"align":3439},[1907,3545,3546,3551,3553,3555,3557],{},[1921,3547,3548],{},[589,3549,3550],{},"CE Feedback",[1921,3552,3507],{"align":3439},[1921,3554,3507],{"align":3439},[1921,3556,3507],{"align":3439},[1921,3558,3559,3560],{"align":3439},"✅ ",[589,3561,3562],{},"NEW",[1907,3564,3565,3570,3572,3574,3576],{},[1921,3566,3567],{},[589,3568,3569],{},"Optimized Locking",[1921,3571,3507],{"align":3439},[1921,3573,3507],{"align":3439},[1921,3575,3507],{"align":3439},[1921,3577,3559,3578],{"align":3439},[589,3579,3562],{},[1907,3581,3582,3587,3589,3591,3593],{},[1921,3583,3584],{},[589,3585,3586],{},"Parameter Sensitive Plan (PSPO)",[1921,3588,3507],{"align":3439},[1921,3590,3507],{"align":3439},[1921,3592,3507],{"align":3439},[1921,3594,3559,3595],{"align":3439},[589,3596,3562],{},[1907,3598,3599,3604,3606,3608,3610],{},[1921,3600,3601],{},[589,3602,3603],{},"Optional Parameter Plan (OPPO)",[1921,3605,3507],{"align":3439},[1921,3607,3507],{"align":3439},[1921,3609,3507],{"align":3439},[1921,3611,3559,3612],{"align":3439},[589,3613,3562],{},[580,3615,3616,3623],{"color":582,"icon":583},[585,3617,587,3618,768,3620],{},[589,3619,2288],{},[770,3621,3622],{},"\"So sanh IQP qua cac phien ban -- diem moi cua 2025 la gi?\"",[774,3624,3625,3631,3637,3643,3651],{},[777,3626,3627,3630],{},[589,3628,3629],{},"2017:"," Adaptive Joins + Interleaved Execution + Memory Grant Feedback (3 tinh nang goc).",[777,3632,3633,3636],{},[589,3634,3635],{},"2019:"," Scalar UDF Inlining + Table Variable Deferred Compilation.",[777,3638,3639,3642],{},[589,3640,3641],{},"2022:"," DOP Feedback + Memory Grant Feedback cai thien (persisted).",[777,3644,3645,768,3647,3650],{},[589,3646,2654],{},[589,3648,3649],{},"AI-driven"," -- CE Feedback hoc tu workload, Optimized Locking loai bo lock escalation, PSPO\u002FOPPO tu dong chon plan theo tham so.",[777,3652,3653,3656],{},[589,3654,3655],{},"Khac biet cot loi:"," 2017-2022 la \"heuristic cai thien\", 2025 la \"ML tu hoc lien tuc\".",[432,3658,3660],{"id":3659},"battat-iqp-features","Bat\u002Ftat IQP features",[437,3662,3664],{"className":439,"code":3663,"language":441,"meta":442,"style":442},"-- Kiem tra IQP features dang bat\nSELECT name, value_in_use\nFROM sys.configurations\nWHERE name LIKE '%intelligent%'\n   OR name LIKE '%feedback%'\n   OR name LIKE '%adaptive%';\n\n-- Bat tat ca IQP features (2025, mac dinh ON)\nALTER DATABASE SCOPED CONFIGURATION\nSET CE_FEEDBACK = ON,\n    DOP_FEEDBACK = ON,\n    MEMORY_GRANT_FEEDBACK = ON,\n    OPTIMIZED_LOCKING = ON,\n    PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;\n",[444,3665,3666,3671,3676,3681,3686,3691,3696,3700,3705,3709,3714,3719,3724,3729],{"__ignoreMap":442},[447,3667,3668],{"class":449,"line":450},[447,3669,3670],{},"-- Kiem tra IQP features dang bat\n",[447,3672,3673],{"class":449,"line":456},[447,3674,3675],{},"SELECT name, value_in_use\n",[447,3677,3678],{"class":449,"line":462},[447,3679,3680],{},"FROM sys.configurations\n",[447,3682,3683],{"class":449,"line":468},[447,3684,3685],{},"WHERE name LIKE '%intelligent%'\n",[447,3687,3688],{"class":449,"line":474},[447,3689,3690],{},"   OR name LIKE '%feedback%'\n",[447,3692,3693],{"class":449,"line":481},[447,3694,3695],{},"   OR name LIKE '%adaptive%';\n",[447,3697,3698],{"class":449,"line":487},[447,3699,478],{"emptyLinePlaceholder":477},[447,3701,3702],{"class":449,"line":492},[447,3703,3704],{},"-- Bat tat ca IQP features (2025, mac dinh ON)\n",[447,3706,3707],{"class":449,"line":497},[447,3708,2257],{},[447,3710,3711],{"class":449,"line":503},[447,3712,3713],{},"SET CE_FEEDBACK = ON,\n",[447,3715,3716],{"class":449,"line":508},[447,3717,3718],{},"    DOP_FEEDBACK = ON,\n",[447,3720,3721],{"class":449,"line":514},[447,3722,3723],{},"    MEMORY_GRANT_FEEDBACK = ON,\n",[447,3725,3726],{"class":449,"line":519},[447,3727,3728],{},"    OPTIMIZED_LOCKING = ON,\n",[447,3730,3731],{"class":449,"line":525},[447,3732,3733],{},"    PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;\n",[580,3735,3737,3741,3744,3748,3836,3851,3855,3863,3954,3958,3987,4021,4025,4090,4094,4097,4136,4159],{"color":762,"icon":3736},"i-lucide-arrow-right",[427,3738,3740],{"id":3739},"_18-azure-sql-hyperscale-khác-biệt-về-isolation-failover-scale-out","18. Azure SQL Hyperscale — khác biệt về isolation, failover, scale-out",[585,3742,3743],{},"Azure SQL Database Hyperscale là kiến trúc storage-compute tách rời, khác biệt đáng kể so với SQL Server boxed product về cách hoạt động transaction, failover, và read scale.",[432,3745,3747],{"id":3746},"isolation-transaction","Isolation & transaction",[1901,3749,3750,3762],{},[1904,3751,3752],{},[1907,3753,3754,3756,3759],{},[1910,3755],{},[1910,3757,3758],{},"SQL Server on-prem",[1910,3760,3761],{},"Azure SQL Hyperscale",[1916,3763,3764,3780,3797,3810,3823],{},[1907,3765,3766,3771,3774],{},[1921,3767,3768],{},[589,3769,3770],{},"Default isolation",[1921,3772,3773],{},"Read Committed (lock-based)",[1921,3775,3776,3779],{},[589,3777,3778],{},"Read Committed Snapshot (RCSI)"," ON mặc định",[1907,3781,3782,3787,3794],{},[1921,3783,3784],{},[589,3785,3786],{},"Snapshot \u002F MVCC",[1921,3788,3789,3790,3793],{},"Phải bật ",[444,3791,3792],{},"READ_COMMITTED_SNAPSHOT"," thủ công",[1921,3795,3796],{},"Bật sẵn — version store dùng page server (storage layer riêng)",[1907,3798,3799,3804,3807],{},[1921,3800,3801],{},[589,3802,3803],{},"TempDB",[1921,3805,3806],{},"Local SSD, contention bottleneck",[1921,3808,3809],{},"Không dùng TempDB cho version store — tránh PAGELATCH bottleneck",[1907,3811,3812,3817,3820],{},[1921,3813,3814],{},[589,3815,3816],{},"Long transaction",[1921,3818,3819],{},"Bloat version store trong TempDB",[1921,3821,3822],{},"Version store nằm trên page server (hầu như không giới hạn)",[1907,3824,3825,3830,3833],{},[1921,3826,3827],{},[589,3828,3829],{},"Lock memory",[1921,3831,3832],{},"Shared global lock manager",[1921,3834,3835],{},"Per-node lock manager (scale-out tự nhiên hơn)",[580,3837,3838,3846],{"color":582,"icon":583},[585,3839,587,3840,768,3843],{},[589,3841,3842],{},"Câu PV quan trọng:",[770,3844,3845],{},"\"RCSI trong Hyperscale khác gì SQL Server thường?\"",[2546,3847,3848],{},[585,3849,3850],{},"\"Hyperscale bật RCSI mặc định và không dùng TempDB cho version store. Page server lưu tất cả version → loại bỏ hoàn toàn TempDB contention, PAGELATCH bottleneck. Long transaction không gây bloat TempDB. Đây là lý do Hyperscale phù hợp cho workload mixed OLTP + reporting.\"",[432,3852,3854],{"id":3853},"failover-high-availability","Failover & High Availability",[437,3856,3861],{"className":3857,"code":3859,"language":3860},[3858],"language-text","┌──────────────┐      ┌──────────────┐\n│  Compute     │◄────►│  Compute     │\n│  (Primary)   │      │  (Secondary) │\n└──────┬───────┘      └──────┬───────┘\n       │                     │\n       └──────────┬──────────┘\n                  │\n         ┌────────▼────────┐\n         │   Page Server   │  ← Storage layer shared giữa các replica\n         │   (Data + Log)  │\n         └─────────────────┘\n","text",[444,3862,3859],{"__ignoreMap":442},[1901,3864,3865,3875],{},[1904,3866,3867],{},[1907,3868,3869,3871,3873],{},[1910,3870],{},[1910,3872,3758],{},[1910,3874,3761],{},[1916,3876,3877,3893,3906,3922,3938],{},[1907,3878,3879,3884,3887],{},[1921,3880,3881],{},[589,3882,3883],{},"Failover time",[1921,3885,3886],{},"30s-2 phút (AG failover)",[1921,3888,3889,3892],{},[589,3890,3891],{},"\u003C 10 giây"," (compute node restart + reattach page server)",[1907,3894,3895,3900,3903],{},[1921,3896,3897],{},[589,3898,3899],{},"Data sync",[1921,3901,3902],{},"Sync\u002Fasync commit qua AG",[1921,3904,3905],{},"Không cần sync data — page server dùng chung",[1907,3907,3908,3913,3916],{},[1921,3909,3910],{},[589,3911,3912],{},"RPO",[1921,3914,3915],{},"0 với sync commit, >0 với async",[1921,3917,3918,3921],{},[589,3919,3920],{},"0 RPO"," (log ghi vào page server trước khi ACK)",[1907,3923,3924,3929,3932],{},[1921,3925,3926],{},[589,3927,3928],{},"Read replicas",[1921,3930,3931],{},"Tối đa 8 secondary (AG), cần license",[1921,3933,3934,3937],{},[589,3935,3936],{},"0-30 named replicas"," (không giới hạn bởi AG), provision nhanh",[1907,3939,3940,3945,3948],{},[1921,3941,3942],{},[589,3943,3944],{},"Replica lag",[1921,3946,3947],{},"Vài ms đến vài giây (tuỳ sync mode)",[1921,3949,3950,3953],{},[589,3951,3952],{},"Sub-second"," (page server push log trực tiếp)",[432,3955,3957],{"id":3956},"scale-out-reads-tính-năng-đặc-thù-hyperscale","Scale-out reads — tính năng đặc thù Hyperscale",[437,3959,3961],{"className":439,"code":3960,"language":441,"meta":442,"style":442},"-- Connect string cho read-only replica trong Hyperscale\n-- Server=tcp:myserver.database.windows.net;Database=mydb;ApplicationIntent=ReadOnly;\n\n-- Không cần cấu hình AG listener thủ công — Azure tự route\n-- Mỗi named replica có connection string riêng\n",[444,3962,3963,3968,3973,3977,3982],{"__ignoreMap":442},[447,3964,3965],{"class":449,"line":450},[447,3966,3967],{},"-- Connect string cho read-only replica trong Hyperscale\n",[447,3969,3970],{"class":449,"line":456},[447,3971,3972],{},"-- Server=tcp:myserver.database.windows.net;Database=mydb;ApplicationIntent=ReadOnly;\n",[447,3974,3975],{"class":449,"line":462},[447,3976,478],{"emptyLinePlaceholder":477},[447,3978,3979],{"class":449,"line":468},[447,3980,3981],{},"-- Không cần cấu hình AG listener thủ công — Azure tự route\n",[447,3983,3984],{"class":449,"line":474},[447,3985,3986],{},"-- Mỗi named replica có connection string riêng\n",[580,3988,3989,3994],{"color":762,"icon":583},[585,3990,587,3991],{},[589,3992,3993],{},"Hyperscale read scale-out:",[774,3995,3996,4002,4008,4015],{},[777,3997,3998,4001],{},[589,3999,4000],{},"Named replicas",": tạo replica với tên riêng, có thể có compute size khác primary (VD: primary 8 vCore, replica 40 vCore cho reporting nặng).",[777,4003,4004,4007],{},[589,4005,4006],{},"High-availability replicas",": free, tự động tạo cho HA (không dùng cho read workload).",[777,4009,4010,4011,4014],{},"Mỗi replica dùng chung page server → không cần sync data → ",[589,4012,4013],{},"tạo replica trong \u003C 1 phút",", không cần seed database hàng giờ như AG on-prem.",[777,4016,4017,4020],{},[589,4018,4019],{},"Licensing",": named replicas tính riêng vCore cost; HA replicas miễn phí (đã bao gồm trong tier).",[432,4022,4024],{"id":4023},"khi-nào-dùng-hyperscale-vs-sql-server-on-prem-vs-azure-sql-thường","Khi nào dùng Hyperscale vs SQL Server on-prem vs Azure SQL thường?",[1901,4026,4027,4037],{},[1904,4028,4029],{},[1907,4030,4031,4034],{},[1910,4032,4033],{},"Use case",[1910,4035,4036],{},"Khuyến nghị",[1916,4038,4039,4047,4057,4066,4074,4082],{},[1907,4040,4041,4044],{},[1921,4042,4043],{},"OLTP \u003C 100GB, RTO thấp",[1921,4045,4046],{},"Azure SQL (DTU\u002FvCore)",[1907,4048,4049,4052],{},[1921,4050,4051],{},"OLTP + real-time reporting, > 1TB",[1921,4053,4054],{},[589,4055,4056],{},"Hyperscale",[1907,4058,4059,4062],{},[1921,4060,4061],{},"Cần 10+ read replicas, sub-second lag",[1921,4063,4064],{},[589,4065,4056],{},[1907,4067,4068,4071],{},[1921,4069,4070],{},"Regulatory: data phải on-prem",[1921,4072,4073],{},"SQL Server + AG",[1907,4075,4076,4079],{},[1921,4077,4078],{},"Full Enterprise feature (SSIS, SSAS)",[1921,4080,4081],{},"SQL Server on-prem \u002F Azure VM",[1907,4083,4084,4087],{},[1921,4085,4086],{},"Dev\u002Ftest local",[1921,4088,4089],{},"Docker container",[432,4091,4093],{"id":4092},"sql-database-on-microsoft-fabric","SQL Database on Microsoft Fabric",[585,4095,4096],{},"SQL Database trong Fabric là 1 database engine SaaS-native, dùng chung codebase với SQL Server 2025:",[437,4098,4100],{"className":439,"code":4099,"language":441,"meta":442,"style":442},"-- Tạo database trong Fabric (không cần provision server!)\nCREATE DATABASE MyFabricDB;\n-- Auto-provisioned, auto-scale, auto-backup\n\n-- Dùng T-SQL y hệt SQL Server\nCREATE TABLE products (id INT, name NVARCHAR(200), embedding VECTOR(1536));\nINSERT INTO products VALUES (1, 'Widget', @embedding);\n",[444,4101,4102,4107,4112,4117,4121,4126,4131],{"__ignoreMap":442},[447,4103,4104],{"class":449,"line":450},[447,4105,4106],{},"-- Tạo database trong Fabric (không cần provision server!)\n",[447,4108,4109],{"class":449,"line":456},[447,4110,4111],{},"CREATE DATABASE MyFabricDB;\n",[447,4113,4114],{"class":449,"line":462},[447,4115,4116],{},"-- Auto-provisioned, auto-scale, auto-backup\n",[447,4118,4119],{"class":449,"line":468},[447,4120,478],{"emptyLinePlaceholder":477},[447,4122,4123],{"class":449,"line":474},[447,4124,4125],{},"-- Dùng T-SQL y hệt SQL Server\n",[447,4127,4128],{"class":449,"line":481},[447,4129,4130],{},"CREATE TABLE products (id INT, name NVARCHAR(200), embedding VECTOR(1536));\n",[447,4132,4133],{"class":449,"line":487},[447,4134,4135],{},"INSERT INTO products VALUES (1, 'Widget', @embedding);\n",[774,4137,4138,4144,4150,4156],{},[777,4139,4140,4143],{},[589,4141,4142],{},"Zero server management"," — không cần setup instance, không patch, không backup config.",[777,4145,4146,4149],{},[589,4147,4148],{},"Tích hợp Fabric ecosystem",": OneLake, Power BI, notebook, data pipeline.",[777,4151,4152,4155],{},[589,4153,4154],{},"Copilot tích hợp sẵn"," — natural language → T-SQL trong Fabric portal.",[777,4157,4158],{},"Phù hợp cho analytics project, data warehouse nhỏ, team muốn SQL mà không muốn quản trị server.",[580,4160,4161,4162],{"color":762,"icon":3736},"Tiếp theo: ",[4163,4164,4165],"a",{"href":189},"Đặc thù SQL Server & Performance",[4167,4168,4169],"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);}",{"title":442,"searchDepth":456,"depth":456,"links":4171},[4172,4177,4183,4184,4189,4197,4202,4203,4208,4213,4214,4221,4222,4223,4228,4233,4239,4243],{"id":429,"depth":456,"text":430,"children":4173},[4174,4175,4176],{"id":434,"depth":462,"text":435},{"id":646,"depth":462,"text":647},{"id":675,"depth":462,"text":676},{"id":808,"depth":456,"text":809,"children":4178},[4179,4180,4181,4182],{"id":812,"depth":462,"text":813},{"id":836,"depth":462,"text":837},{"id":882,"depth":462,"text":883},{"id":920,"depth":462,"text":921},{"id":964,"depth":456,"text":965},{"id":1077,"depth":456,"text":1078,"children":4185},[4186,4187,4188],{"id":1081,"depth":462,"text":1082},{"id":1128,"depth":462,"text":1129},{"id":1191,"depth":462,"text":1192},{"id":1281,"depth":456,"text":1282,"children":4190},[4191,4192,4193,4194,4195,4196],{"id":1285,"depth":462,"text":1286},{"id":1318,"depth":462,"text":1319},{"id":1362,"depth":462,"text":1363},{"id":1432,"depth":462,"text":1433},{"id":1485,"depth":462,"text":1486},{"id":1517,"depth":462,"text":1518},{"id":1559,"depth":456,"text":1560,"children":4198},[4199,4200,4201],{"id":1563,"depth":462,"text":1564},{"id":1644,"depth":462,"text":1645},{"id":1683,"depth":462,"text":1684},{"id":1716,"depth":456,"text":1717},{"id":1771,"depth":456,"text":1772,"children":4204},[4205,4206,4207],{"id":1775,"depth":462,"text":1776},{"id":1852,"depth":462,"text":1853},{"id":1898,"depth":462,"text":1899},{"id":1971,"depth":456,"text":1972,"children":4209},[4210,4211,4212],{"id":1975,"depth":462,"text":1976},{"id":2090,"depth":462,"text":2091},{"id":2150,"depth":462,"text":2151},{"id":2168,"depth":456,"text":2169},{"id":2223,"depth":456,"text":2224,"children":4215},[4216,4217,4218,4219,4220],{"id":2230,"depth":462,"text":2231},{"id":2318,"depth":462,"text":2319},{"id":2367,"depth":462,"text":2368},{"id":2414,"depth":462,"text":2415},{"id":2478,"depth":462,"text":2479},{"id":2536,"depth":456,"text":2537},{"id":2664,"depth":456,"text":2665},{"id":2727,"depth":456,"text":2728,"children":4224},[4225,4226,4227],{"id":2738,"depth":462,"text":2739},{"id":2806,"depth":462,"text":2807},{"id":2911,"depth":462,"text":2912},{"id":2979,"depth":456,"text":2980,"children":4229},[4230,4231,4232],{"id":2986,"depth":462,"text":2987},{"id":3040,"depth":462,"text":3041},{"id":3090,"depth":462,"text":3091},{"id":3198,"depth":456,"text":3199,"children":4234},[4235,4236,4237,4238],{"id":3205,"depth":462,"text":3206},{"id":3255,"depth":462,"text":3256},{"id":3307,"depth":462,"text":3308},{"id":3351,"depth":462,"text":3352},{"id":3419,"depth":456,"text":3420,"children":4240},[4241,4242],{"id":3426,"depth":462,"text":3427},{"id":3659,"depth":462,"text":3660},{"id":3739,"depth":456,"text":3740,"children":4244},[4245,4246,4247,4248,4249],{"id":3746,"depth":462,"text":3747},{"id":3853,"depth":462,"text":3854},{"id":3956,"depth":462,"text":3957},{"id":4023,"depth":462,"text":4024},{"id":4092,"depth":462,"text":4093},"JOIN, subquery, set operation, CTE recursive, window function, transaction, isolation level — gốc cho SQL Server.","md",null,{},{"title":183,"icon":186},{"title":422,"description":4250},"ruMMM47pH16drwoQuaWCAMF3amKXLpL-lgepGCFRcKU",[4258,4260],{"title":178,"path":179,"stem":180,"description":4259,"icon":181,"children":-1},"DDL, DML, kiểu dữ liệu, NULL handling, ràng buộc — nền tảng T-SQL cho SQL Server 2025.",{"title":188,"path":189,"stem":190,"description":4261,"icon":191,"children":-1},"Đặc thù SQL Server 2025 — JSON, Vector Index (DiskANN), Optimized Locking, RegEx, temporal table. Index, execution plan, tuning, query optimization, AI integration, benchmarks.",1783490364230]