<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: qodors</title>
    <description>The latest articles on Forem by qodors (@qodors).</description>
    <link>https://forem.com/qodors</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3892554%2F90747c51-0df7-4e81-8950-b2d32b359d38.png</url>
      <title>Forem: qodors</title>
      <link>https://forem.com/qodors</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/qodors"/>
    <language>en</language>
    <item>
      <title>Building Modern Apps with Blazor and .NET MAUI — What Actually Works in 2026</title>
      <dc:creator>qodors</dc:creator>
      <pubDate>Wed, 29 Apr 2026 10:10:32 +0000</pubDate>
      <link>https://forem.com/qodors/building-modern-apps-with-blazor-and-net-maui-what-actually-works-in-2026-36cm</link>
      <guid>https://forem.com/qodors/building-modern-apps-with-blazor-and-net-maui-what-actually-works-in-2026-36cm</guid>
      <description>&lt;p&gt;By Team Qodors — Custom Software Development &amp;amp; IT Consultancy&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jzebw8keevz82vp492x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jzebw8keevz82vp492x.jpg" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft’s Blazor and .NET MAUI don’t get the hype that React or Flutter get. But for teams already working in the .NET ecosystem — or businesses that need enterprise-grade applications with strong backend integration — they’re becoming serious contenders.&lt;/p&gt;

&lt;p&gt;At Qodors, .NET has been part of the stack for years. Blazor and .NET MAUI aren’t new to the team, but the way they’ve matured over the last two years has changed how certain projects get built. Especially when the requirement is a content management system (CMS) paired with a cross-platform application that needs to work on web, desktop, and mobile.&lt;/p&gt;

&lt;p&gt;This isn’t a tutorial. It’s a breakdown of what Blazor and .NET MAUI actually do well, where they fall short, and when it makes sense to use them instead of the usual suspects like React, Angular, or Flutter.&lt;/p&gt;

&lt;p&gt;What Is Blazor, Really?&lt;/p&gt;

&lt;p&gt;Blazor is Microsoft’s framework for building interactive web applications using C# instead of JavaScript. That’s the headline feature — write your frontend logic in the same language as your backend.&lt;/p&gt;

&lt;p&gt;There are two main flavors:&lt;/p&gt;

&lt;p&gt;Blazor Server — the app runs on the server, and UI updates get pushed to the browser over a SignalR connection. Fast to build, low client-side load, but requires a persistent connection to the server.&lt;/p&gt;

&lt;p&gt;Blazor WebAssembly (WASM) — the app runs entirely in the browser using WebAssembly. No server dependency after the initial load. Feels more like a traditional SPA (single-page application).&lt;/p&gt;

&lt;p&gt;For teams that live in the .NET world — ASP.NET Core, Entity Framework, SQL Server, Azure — Blazor removes the mental overhead of switching between C# on the backend and JavaScript on the frontend. The same developers can work across the full stack without context switching.&lt;/p&gt;

&lt;p&gt;That’s a real productivity boost for certain teams. Not everyone. But for the right setup, it’s significant.&lt;/p&gt;

&lt;p&gt;What Is .NET MAUI?&lt;/p&gt;

&lt;p&gt;.NET MAUI (Multi-platform App UI) is Microsoft’s framework for building native cross-platform apps. One codebase. Runs on Windows, macOS, iOS, and Android.&lt;/p&gt;

&lt;p&gt;It’s the successor to Xamarin.Forms, rebuilt from the ground up to be faster, cleaner, and better integrated with modern .NET.&lt;/p&gt;

&lt;p&gt;MAUI apps are written in C# and XAML (or pure C# if XAML isn’t the preference). They compile to native apps, so performance is solid. Unlike hybrid frameworks that wrap web views, MAUI apps feel native because they are native.&lt;/p&gt;

&lt;p&gt;For businesses that need internal tools, field service apps, or enterprise applications that run on desktop and mobile — MAUI is a strong option. Especially when the backend is already .NET and Azure.&lt;/p&gt;

&lt;p&gt;Blazor + .NET MAUI — Why Use Them Together?&lt;/p&gt;

&lt;p&gt;Here’s where it gets interesting.&lt;/p&gt;

&lt;p&gt;Blazor components can run inside a .NET MAUI app using something called Blazor Hybrid. That means the same UI code written for a Blazor web app can also be used in a desktop or mobile app built with MAUI.&lt;/p&gt;

&lt;p&gt;One set of components. Multiple platforms.&lt;/p&gt;

&lt;p&gt;This isn’t perfect code reuse — there are platform-specific quirks, navigation differences, and UI adjustments needed. But it’s close enough that a single development team can build a web app, a Windows desktop app, an iPad app, and an Android app without rewriting the entire frontend for each platform.&lt;/p&gt;

&lt;p&gt;For businesses building internal tools or SaaS products that need to work across web and mobile, this approach cuts development time significantly.&lt;/p&gt;

&lt;p&gt;At Qodors, this pattern has been used on projects where the client needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A web-based admin dashboard for managing content&lt;/li&gt;
&lt;li&gt;A mobile app for field staff to access the same content offline&lt;/li&gt;
&lt;li&gt;A Windows desktop app for office users who prefer native applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of building three separate frontends, the core UI was built once in Blazor and deployed across all three platforms using MAUI for mobile and desktop.&lt;/p&gt;

&lt;p&gt;Building a CMS with Blazor — What That Looks Like&lt;/p&gt;

&lt;p&gt;A content management system built with Blazor typically follows this structure:&lt;/p&gt;

&lt;p&gt;Backend — ASP.NET Core Web API handling authentication, database access, file uploads, and business logic. SQL Server or PostgreSQL for the database. Azure Blob Storage for media files.&lt;/p&gt;

&lt;p&gt;Frontend — Blazor WebAssembly or Blazor Server for the admin interface. Editors create and manage content. Real-time previews. Role-based access control. Media library. Version history.&lt;/p&gt;

&lt;p&gt;Content Delivery— A separate public-facing website or mobile app pulls content via the API. Could be another Blazor app. Could be React, Next.js, or a MAUI mobile app. The CMS just serves the data.&lt;/p&gt;

&lt;p&gt;Why Blazor for the CMS admin panel?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich UI components are easier to build in Blazor than in traditional MVC views.&lt;/li&gt;
&lt;li&gt;No need to manage a separate JavaScript framework for the admin interface.&lt;/li&gt;
&lt;li&gt;Tight integration with .NET identity and authentication.&lt;/li&gt;
&lt;li&gt;Fast development for CRUD operations, forms, and data tables.&lt;/li&gt;
&lt;li&gt;Works well with Entity Framework for database operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not the only way to build a CMS, but for .NET-heavy teams, it’s efficient.&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;Using .NET MAUI for the Content Consumption App&lt;/p&gt;

&lt;p&gt;Once the CMS exists and content is managed through the Blazor admin panel, the next step is building the app that actually displays that content to end users.&lt;/p&gt;

&lt;p&gt;This is where .NET MAUI comes in.&lt;/p&gt;

&lt;p&gt;A MAUI app connects to the same backend API the CMS uses. It pulls content — articles, images, videos, product listings, whatever the CMS manages — and displays it in a native mobile or desktop interface.&lt;/p&gt;

&lt;p&gt;Because MAUI supports offline storage using SQLite, the app can cache content locally. Users can browse even without an internet connection. When they reconnect, the app syncs with the server.&lt;/p&gt;

&lt;p&gt;For field workers, sales teams, or anyone who needs access to company content on the go, this setup works well. Web apps require a browser and an internet connection. MAUI apps run natively and handle offline scenarios cleanly.&lt;/p&gt;

&lt;p&gt;Where Blazor and .NET MAUI Actually Make Sense&lt;/p&gt;

&lt;p&gt;Not every project is a good fit. Here’s when this stack works best.&lt;/p&gt;

&lt;p&gt;Enterprise applications. Large organizations already using .NET, SQL Server, and Azure. Internal tools, employee portals, CRM systems, inventory management. Blazor and MAUI fit naturally into existing infrastructure.&lt;/p&gt;

&lt;p&gt;Line-of-business apps. Applications built for specific business processes — inspections, audits, data collection, reporting. Often need to work offline. Need tight integration with backend systems. MAUI handles this well.&lt;/p&gt;

&lt;p&gt;Hybrid web + mobile products. SaaS platforms that need a web admin interface and a mobile app for end users. Sharing Blazor components across both reduces duplication.&lt;/p&gt;

&lt;p&gt;Teams already skilled in .NET. If the team knows C#, Entity Framework, and ASP.NET Core, learning Blazor and MAUI is a much smaller jump than learning React, Flutter, and a new backend framework.&lt;/p&gt;

&lt;p&gt;Projects where JavaScript fatigue is real. Some teams are tired of the constant churn in the JavaScript ecosystem. Blazor offers stability. Microsoft’s release cycles are predictable. Breaking changes are rare.&lt;/p&gt;

&lt;p&gt;Where Blazor and .NET MAUI Fall Short&lt;/p&gt;

&lt;p&gt;No framework is perfect. Here’s where this stack struggles.&lt;/p&gt;

&lt;p&gt;Smaller talent pool. Finding developers who know React or Flutter is easier than finding Blazor or MAUI specialists. The .NET community is strong, but it’s smaller than the JavaScript world.&lt;/p&gt;

&lt;p&gt;WebAssembly file sizes. Blazor WASM apps have large initial download sizes compared to optimized React or Vue apps. That’s improving, but it’s still a consideration for public-facing websites with heavy traffic.&lt;/p&gt;

&lt;p&gt;Mobile app performance. MAUI is solid, but Flutter still has an edge in rendering performance and UI flexibility. For consumer-facing apps where every millisecond of startup time matters, Flutter is often the better choice.&lt;/p&gt;

&lt;p&gt;Limited third-party component libraries. The ecosystem is growing, but Blazor and MAUI don’t have the same breadth of open-source UI libraries as React or Flutter. More custom work is often needed.&lt;/p&gt;

&lt;p&gt;Not ideal for content-heavy public websites. Blazor works for web apps, but for marketing sites, blogs, or e-commerce storefronts, frameworks like Next.js or Astro with static generation are faster and better for SEO.&lt;/p&gt;

&lt;p&gt;Blazor and MAUI shine in enterprise and business contexts. They’re not the best choice for every project type.&lt;/p&gt;

&lt;p&gt;Real-World Example — How Qodors Used This Stack&lt;/p&gt;

&lt;p&gt;A logistics client needed a system to manage delivery schedules, driver assignments, and shipment tracking. The operations team needed a web dashboard. Drivers needed a mobile app. Warehouse managers wanted a Windows desktop app.&lt;/p&gt;

&lt;p&gt;The solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend: ASP.NET Core Web API + SQL Server&lt;/li&gt;
&lt;li&gt;CMS/Admin Dashboard: Blazor WebAssembly&lt;/li&gt;
&lt;li&gt;Mobile App (iOS/Android): .NET MAUI&lt;/li&gt;
&lt;li&gt;Desktop App (Windows): .NET MAUI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same backend. Same API. Shared Blazor components for common UI elements like shipment lists, driver profiles, and schedule views.&lt;/p&gt;

&lt;p&gt;Development time: 8 weeks instead of the 14–16 weeks it would have taken building three separate native apps.&lt;/p&gt;

&lt;p&gt;The client got a unified system that worked across all platforms, with a single codebase to maintain going forward.&lt;/p&gt;

&lt;p&gt;That’s the kind of project where Blazor and MAUI make perfect sense.&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;p&gt;The Honest Take&lt;/p&gt;

&lt;p&gt;Blazor and .NET MAUI aren’t trying to replace React or Flutter. They’re not the trendy choice. They don’t generate the same buzz on Twitter or get featured in every YouTube tutorial.&lt;/p&gt;

&lt;p&gt;But for businesses already invested in the Microsoft ecosystem, or for teams that prefer working in C# and want to avoid JavaScript entirely, they’re powerful tools that deliver real results.&lt;/p&gt;

&lt;p&gt;At Qodors, the decision always comes down to the project requirements, the client’s existing infrastructure, and the team’s skillset. Sometimes that means React and Node.js. Sometimes it means Flutter. And sometimes it means Blazor and .NET MAUI.&lt;/p&gt;

&lt;p&gt;The goal isn’t to use the most popular framework. It’s to use the one that gets the product shipped on time, on budget, and built to last.&lt;/p&gt;

&lt;p&gt;Building a CMS, internal tool, or cross-platform app? Need a team that knows when to use .NET and when to use something else? Reach out to Qodors. Happy to talk through what fits best.&lt;/p&gt;

&lt;p&gt;Team Qodors&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="http://www.qodors.com" rel="noopener noreferrer"&gt;www.qodors.com&lt;/a&gt;&lt;br&gt;
📧 &lt;a href="mailto:contact@qodors.com"&gt;contact@qodors.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— -&lt;/p&gt;

&lt;h1&gt;
  
  
  Blazor #DotNET #NETMAUI #MicrosoftDevelopment #CMS #CrossPlatformApps #EnterpriseApps #CustomSoftware #WebDevelopment #MobileAppDevelopment #Qodors #ASPNETCore #CSharp #SoftwareDevelopment #AppDevelopment #BusinessApps #HybridApps #ContentManagement
&lt;/h1&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>mobile</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SQL Server Running Slow? Here's What Actually Fixes It.</title>
      <dc:creator>qodors</dc:creator>
      <pubDate>Fri, 24 Apr 2026 08:19:58 +0000</pubDate>
      <link>https://forem.com/qodors/sql-server-running-slow-heres-what-actually-fixes-it-4nbo</link>
      <guid>https://forem.com/qodors/sql-server-running-slow-heres-what-actually-fixes-it-4nbo</guid>
      <description>&lt;p&gt;Every growing business hits this wall at some point. The application that worked perfectly six months ago now takes forever to load. Users start complaining. The dev team blames the server. The infrastructure team blames the code.&lt;/p&gt;

&lt;p&gt;Most of the time, it's neither. It's the database.&lt;/p&gt;

&lt;p&gt;SQL Server is built to handle serious workloads. But without regular maintenance and smart optimization, even the most powerful setup starts choking under pressure.&lt;/p&gt;

&lt;p&gt;At Qodors, database performance optimization is part of the daily work across multiple client projects. Not theoretical best practices — real fixes on real production systems serving real users.&lt;/p&gt;

&lt;p&gt;Here are the things that consistently make the biggest difference when a SQL Server database starts slowing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Fix the Indexes First
&lt;/h2&gt;

&lt;p&gt;This is the single most common reason SQL Server databases slow down over time.&lt;/p&gt;

&lt;p&gt;Either there aren't enough indexes, so the database scans entire tables for every query. Or there are too many, so every write operation — INSERT, UPDATE, DELETE — gets bogged down maintaining indexes nobody is using.&lt;/p&gt;

&lt;p&gt;The approach that works:&lt;/p&gt;

&lt;p&gt;Check what SQL Server is already recommending. The system tracks missing index suggestions automatically.&lt;/p&gt;

&lt;p&gt;`sql&lt;/p&gt;

&lt;p&gt;SELECT&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mid.statement AS TableName,

mid.equality_columns,

mid.inequality_columns,

mid.included_columns,

migs.user_seeks,

migs.avg_total_user_cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;FROM sys.dm_db_missing_index_groups mig&lt;/p&gt;

&lt;p&gt;INNER JOIN sys.dm_db_missing_index_group_stats migs&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ON mig.index_group_handle = migs.group_handle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;INNER JOIN sys.dm_db_missing_index_details mid&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ON mig.index_handle = mid.index_handle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;ORDER BY migs.avg_total_user_cost * migs.user_seeks DESC; `&lt;/p&gt;

&lt;p&gt;Then check for unused indexes sitting there doing nothing except slowing down writes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;sql&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt;

    &lt;span class="n"&gt;OBJECT_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;TableName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;IndexName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_seeks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_scans&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_updates&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dm_db_index_usage_stats&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;

&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexes&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;

    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index_id&lt;/span&gt;

&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;OBJECTPROPERTY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;object_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'IsUserTable'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_seeks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_scans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;ius&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_updates&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Index what gets searched. Drop what doesn't get used. Review every few months as query patterns change.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Read the Execution Plans
&lt;/h2&gt;

&lt;p&gt;An execution plan shows exactly what SQL Server does behind the scenes when running a query. Skipping this step means troubleshooting is just guesswork.&lt;/p&gt;

&lt;p&gt;Open SQL Server Management Studio, press Ctrl + M to enable Actual Execution Plan, and run the slow query.&lt;/p&gt;

&lt;p&gt;Things to look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Table Scans — the database is reading every single row instead of jumping straight to the data it needs. Usually means a missing index.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Key Lookups — the index found the row but had to go back to the table to fetch additional columns. Fix this by adding INCLUDE columns to the index.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fat arrows between operations — large amounts of data moving through the plan. Something upstream is pulling too much.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Warning triangles — SQL Server literally flagging that something went wrong during execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No amount of hardware upgrades will fix a bad query plan. Read the execution plan first, optimize second.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Keep Statistics Updated
&lt;/h2&gt;

&lt;p&gt;SQL Server decides how to execute a query based on statistics — its internal understanding of data distribution across tables. When statistics go stale, the optimizer makes terrible decisions. A table with 10 million rows might get treated like it has 500 rows, resulting in a plan that runs 50 times slower than it should.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;

&lt;span class="k"&gt;sql&lt;/span&gt;

&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;sp_updatestats&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run this on a schedule. Weekly for most databases. Daily for high-transaction systems.&lt;/p&gt;

&lt;p&gt;Also, verify that Auto Update Statistics is turned on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="k"&gt;sql&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_auto_update_stats_on&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;`
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setting should be ON by default, but there are production databases out there where someone turned it off years ago and nobody noticed. It happens more often than anyone would like to admit.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Stop Neglecting TempDB
&lt;/h2&gt;

&lt;p&gt;TempDB is the shared workspace SQL Server uses for temporary operations — sorting, hash joins, temp tables, cursors, snapshot isolation version store. Every database on the instance uses a single TempDB.&lt;/p&gt;

&lt;p&gt;When TempDB is misconfigured, the entire server suffers.&lt;/p&gt;

&lt;p&gt;What consistently works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create multiple TempDB data files. One file per logical CPU core, up to 8 files. This reduces allocation contention that causes waits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pre-size the files. Don't leave them at the default 8MB with 64MB autogrow. Figure out the typical TempDB usage and set the initial size accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Put TempDB on the fastest available storage. If SSDs or a dedicated drive are available, that's where TempDB belongs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This takes about 15 minutes to configure and makes a noticeable difference, especially on busy transactional systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Parameterize Every Query
&lt;/h2&gt;

&lt;p&gt;Building SQL queries by concatenating strings in application code is still shockingly common.&lt;/p&gt;

&lt;p&gt;-- This is a problem&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="nv"&gt;"SELECT * FROM Orders WHERE CustomerID = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beyond the SQL injection risk, this destroys performance. SQL Server creates a brand new execution plan for every variation. The plan cache fills up with thousands of single-use plans. The optimizer spends more time compiling than executing.&lt;/p&gt;

&lt;p&gt;The fix is simple. Use parameterized queries or stored procedures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;sql&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;OrderID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TotalAmount&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt;

&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;CustomerID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same plan gets reused every time, regardless of the parameter value. Less compilation overhead. Less memory consumed. Faster response.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Kill the SELECT * Habit
&lt;/h2&gt;

&lt;p&gt;Using SELECT * in production code means asking SQL Server to return every column from a table when the application probably needs three or four.&lt;/p&gt;

&lt;p&gt;The cost adds up fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;More data read from disk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More memory used for processing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More network bandwidth consumed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indexes can't cover the query, forcing expensive lookups back to the base table&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Name the columns. Only pull what's needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;sql&lt;/span&gt;

&lt;span class="c1"&gt;-- Instead of SELECT * FROM Customers&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;CustomerID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Phone&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;

&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;IsActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small change. Big impact at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Set Up Monitoring Before Things Break
&lt;/h2&gt;

&lt;p&gt;Fixing performance problems is ten times harder without a baseline. If there's no data showing what "normal" looks like, there's nothing to compare against when things go sideways.&lt;/p&gt;

&lt;p&gt;Key areas to monitor and the DMVs that help:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu21hf60wnu0sgrn2gbgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu21hf60wnu0sgrn2gbgw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Capture this data regularly. When something breaks at 2 AM on a Saturday, having historical baselines is the difference between a quick fix and hours of firefighting.&lt;br&gt;
 The Takeaway&lt;/p&gt;

&lt;p&gt;Most SQL Server performance problems come down to the same handful of issues:&lt;/p&gt;

&lt;p&gt;→ Missing or bloated indexes&lt;/p&gt;

&lt;p&gt;→ Stale statistics&lt;/p&gt;

&lt;p&gt;→ Poorly written queries pulling more data than needed&lt;/p&gt;

&lt;p&gt;→ TempDB sitting on default configuration&lt;/p&gt;

&lt;p&gt;→ Zero monitoring until something breaks&lt;/p&gt;

&lt;p&gt;None of this requires deep DBA expertise. It requires consistency. Set aside time every month to check database health. Treat the database like any other critical piece of infrastructure — because that's exactly what it is.&lt;/p&gt;

&lt;p&gt;At Qodors, SQL Server performance optimization is part of ongoing work across client projects in retail, healthcare, logistics, and financial services. Sometimes the fix takes two hours. Sometimes it needs a full performance audit. Either way, the goal is the same — find the bottleneck, fix it, and make sure it doesn't come back.&lt;/p&gt;

&lt;p&gt;Dealing with a slow database or a query that won't cooperate? The Qodors team is always open to taking a look.&lt;/p&gt;

&lt;p&gt;— Team Qodors&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="http://www.qodors.com" rel="noopener noreferrer"&gt;www.qodors.com&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  SQLServer #DatabasePerformance #SQLServerOptimization #PerformanceTuning #QueryOptimization #DatabaseManagement #Qodors #SoftwareDevelopment #ITConsulting #SQLServerDBA #MicrosoftSQLServer #SQLTips #TechNewsletter #DatabaseTuning #SQLServerTips #SlowQueryFix #IndexOptimization #SQLServerMonitoring
&lt;/h1&gt;

</description>
      <category>database</category>
      <category>performance</category>
      <category>sql</category>
    </item>
    <item>
      <title>Why AI-Generated Code Works… Until It Doesn’t (A React Reality Check)</title>
      <dc:creator>qodors</dc:creator>
      <pubDate>Wed, 22 Apr 2026 13:01:47 +0000</pubDate>
      <link>https://forem.com/qodors/why-ai-generated-code-works-until-it-doesnt-a-react-reality-check-4pm2</link>
      <guid>https://forem.com/qodors/why-ai-generated-code-works-until-it-doesnt-a-react-reality-check-4pm2</guid>
      <description>&lt;p&gt;Here’s a &lt;strong&gt;natural, human-style Dev.to first post&lt;/strong&gt; aligned with your tags (&lt;strong&gt;ai, programming, javascript, react&lt;/strong&gt;) and your positioning 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  Why AI-Generated Code Works… Until It Doesn’t (A React Reality Check)
&lt;/h1&gt;

&lt;p&gt;AI tools have changed how we write code.&lt;/p&gt;

&lt;p&gt;You can now spin up a React component, generate API logic, or even scaffold an entire app in minutes. It feels like 80% of the work is done instantly.&lt;/p&gt;

&lt;p&gt;But if you’ve tried to take that code into production, you’ve probably seen this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It works… until it doesn’t.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Illusion of “80% Done”
&lt;/h2&gt;

&lt;p&gt;Most AI-generated code looks correct at first glance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;components render&lt;/li&gt;
&lt;li&gt;API calls work&lt;/li&gt;
&lt;li&gt;UI behaves as expected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this is usually the &lt;strong&gt;happy path&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Real-world applications don’t run on happy paths.&lt;/p&gt;

&lt;p&gt;They run on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;edge cases&lt;/li&gt;
&lt;li&gt;unexpected user behavior&lt;/li&gt;
&lt;li&gt;performance constraints&lt;/li&gt;
&lt;li&gt;long-term maintainability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s where things start breaking.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple React Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you generate a component like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks fine, right?&lt;/p&gt;

&lt;p&gt;Now consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if &lt;code&gt;user&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;What if API is still loading?&lt;/li&gt;
&lt;li&gt;What if data shape changes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suddenly, you’re dealing with runtime errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Missing 20% (That Actually Matters)
&lt;/h2&gt;

&lt;p&gt;From experience, the “last 20%” usually includes:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. State &amp;amp; Edge Case Handling
&lt;/h3&gt;

&lt;p&gt;Loading states, empty states, error boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Performance Optimization
&lt;/h3&gt;

&lt;p&gt;Unnecessary re-renders, memoization, API caching.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Code Structure
&lt;/h3&gt;

&lt;p&gt;Separation of concerns, reusable components, clean architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Scalability
&lt;/h3&gt;

&lt;p&gt;Can this component survive 10x more users or features?&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Testing
&lt;/h3&gt;

&lt;p&gt;Unit tests, integration tests, regression safety.&lt;/p&gt;

&lt;p&gt;AI rarely gets these right out of the box.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happens
&lt;/h2&gt;

&lt;p&gt;AI is trained on patterns, not context.&lt;/p&gt;

&lt;p&gt;It doesn’t know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your product goals&lt;/li&gt;
&lt;li&gt;your future scale&lt;/li&gt;
&lt;li&gt;your team structure&lt;/li&gt;
&lt;li&gt;your long-term constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it generates something that &lt;em&gt;works now&lt;/em&gt;, not something that &lt;em&gt;lasts&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Actually Use AI Effectively
&lt;/h2&gt;

&lt;p&gt;AI is not the problem. Misusing it is.&lt;/p&gt;

&lt;p&gt;Here’s a better approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  Use AI for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;boilerplate code&lt;/li&gt;
&lt;li&gt;initial scaffolding&lt;/li&gt;
&lt;li&gt;quick experiments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Don’t rely on it for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;architecture decisions&lt;/li&gt;
&lt;li&gt;production readiness&lt;/li&gt;
&lt;li&gt;complex state management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of AI as a &lt;strong&gt;junior developer that works fast&lt;/strong&gt;, not as a replacement for engineering thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Shift
&lt;/h2&gt;

&lt;p&gt;We’re not moving from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Developers → AI&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We’re moving from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Writing code → Owning systems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The value is no longer in typing code.&lt;/p&gt;

&lt;p&gt;It’s in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;making systems stable&lt;/li&gt;
&lt;li&gt;making them scalable&lt;/li&gt;
&lt;li&gt;making them reliable over time&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;AI can get you to 80% faster than ever before.&lt;/p&gt;

&lt;p&gt;But the real work — the part that users actually feel — is still in the last 20%.&lt;/p&gt;

&lt;p&gt;And that part still needs engineers.&lt;/p&gt;




&lt;p&gt;If you’ve worked with AI-generated code in React or JS, curious to hear your experience — did it hold up in production?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
