Sql Sever性能優化之指定索引

来源:https://www.cnblogs.com/zwwhnly/archive/2018/11/01/9890055.html
-Advertisement-
Play Games

背景:生產環境SQL語句查詢過慢(數據總量在350萬左右),日誌中心一直報警 解決過程:分析無果後,求助於公司的DBA,DBA分析後建議在語句中指定索引 解決:在SQL語句中指定索引,效果相當明顯,親測有效 優化前SQL: 優化後SQL(指定使用索引IX_CityId): 註意事項:使用指定索引後, ...


背景:生產環境SQL語句查詢過慢(數據總量在350萬左右),日誌中心一直報警

解決過程:分析無果後,求助於公司的DBA,DBA分析後建議在語句中指定索引

解決:在SQL語句中指定索引,效果相當明顯,親測有效

優化前SQL:

SELECT  ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
        sc.CommodityCode AS ChannelCommodityCode ,
        sc.OutShopCommodityCode AS OutItemId ,
        sc.IsShelf ,
        sc.OriginPrice ,
        sc.SalePrice ,
        sc.CreateBy ,
        sc.CreateTime ,
        sc.ModifyTime ,
        sc.StoreCode ,
        sc.ShopCommodityId AS ChannelStoreMappingId ,
        sc.ShopCommodityName AS O2OCommodityName ,
        sc.ShopCommodityTitle AS O2OCommodityTitle ,
        sc.Remark AS Comment ,
        sc.OutShopSPUCode ,
        sc.ModifyBy ,
        sc.ChannelCode
FROM    dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK )
WHERE   sc.Disabled = 0
        AND sc.ChannelCode = '9000000009'
        AND sc.CityId = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

優化後SQL(指定使用索引IX_CityId):

SELECT  ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
        sc.CommodityCode AS ChannelCommodityCode ,
        sc.OutShopCommodityCode AS OutItemId ,
        sc.IsShelf ,
        sc.OriginPrice ,
        sc.SalePrice ,
        sc.CreateBy ,
        sc.CreateTime ,
        sc.ModifyTime ,
        sc.StoreCode ,
        sc.ShopCommodityId AS ChannelStoreMappingId ,
        sc.ShopCommodityName AS O2OCommodityName ,
        sc.ShopCommodityTitle AS O2OCommodityTitle ,
        sc.Remark AS Comment ,
        sc.OutShopSPUCode ,
        sc.ModifyBy ,
        sc.ChannelCode
FROM    dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK, INDEX= [IX_CityId] )
WHERE   sc.Disabled = 0
        AND sc.ChannelCode = '9000000009'
        AND sc.CityId = 'eabbe02f-59e0-46e6-90e7-cd8a89dbb98f';

註意事項:使用指定索引後,必須保證Where條件中有這個篩選條件,否則索引不生效,查詢語句耗時仍然會很長

SELECT  ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
        sc.CommodityCode AS ChannelCommodityCode ,
        sc.OutShopCommodityCode AS OutItemId ,
        sc.IsShelf ,
        sc.OriginPrice ,
        sc.SalePrice ,
        sc.CreateBy ,
        sc.CreateTime ,
        sc.ModifyTime ,
        sc.StoreCode ,
        sc.ShopCommodityId AS ChannelStoreMappingId ,
        sc.ShopCommodityName AS O2OCommodityName ,
        sc.ShopCommodityTitle AS O2OCommodityTitle ,
        sc.Remark AS Comment ,
        sc.OutShopSPUCode ,
        sc.ModifyBy ,
        sc.ChannelCode
FROM    dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK, INDEX= [IX_CityId] )
WHERE   sc.Disabled = 0
        AND sc.ChannelCode = '9000000009'
        AND sc.StoreCode IN ( '10000723' );

以下截圖為上面語句的耗時:

去除指定索引後再次執行

SELECT  ROW_NUMBER() OVER ( ORDER BY sc.ModifyTime DESC ) AS RowNumber ,
        sc.CommodityCode AS ChannelCommodityCode ,
        sc.OutShopCommodityCode AS OutItemId ,
        sc.IsShelf ,
        sc.OriginPrice ,
        sc.SalePrice ,
        sc.CreateBy ,
        sc.CreateTime ,
        sc.ModifyTime ,
        sc.StoreCode ,
        sc.ShopCommodityId AS ChannelStoreMappingId ,
        sc.ShopCommodityName AS O2OCommodityName ,
        sc.ShopCommodityTitle AS O2OCommodityTitle ,
        sc.Remark AS Comment ,
        sc.OutShopSPUCode ,
        sc.ModifyBy ,
        sc.ChannelCode
FROM    dbo.Channel_ShopCommodity AS sc WITH ( NOLOCK )
WHERE   sc.Disabled = 0
        AND sc.ChannelCode = '9000000009'
        AND sc.StoreCode IN ( '10000723' );

我們會發現耗時明顯減少。

由此總結:如果確保某個條件一定會傳並且該欄位上加了索引,可以使用指定索引提升性能,但是使用指定索引要慎重,避免因為指定索引的Where條件不傳又引起的查詢耗時變長 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 前面介紹了redis持久化和容災備份,這篇會介紹redis主從複製和redis持久化在主從複製中的一些應用。因為本人沒有那麼多伺服器或機器,所以這裡主要介紹下如何在docker容器中搭建主從複製以及搭建過程中遇到的一些問題。關於redis的深入講解,這邊博客《深入學習Redis(3):主從複製 ...
  • 似乎只要coding,這些代碼就要跟我過不去似的 今天在linux上安裝了mysql-server,想不到竟然被一個及其簡單的問題給難住了。 是的,我竟然無法登陸!!! 在論壇,百度,google上苦苦搜尋了半天,終於找到了問題所在。本質上還是自己資料庫學習的不夠扎實導致的問題。 廢話不多說,直接上 ...
  • mysql的出錯代碼表,根據mysql的頭文件mysql/include/mysqld_error.h整理而成 1005:創建表失敗 1006:創建資料庫失敗 1007:資料庫已存在,創建資料庫失敗 1008:資料庫不存在,刪除資料庫失敗 1009:不能刪除資料庫文件導致刪除資料庫失敗 1010:不 ...
  • 1、下載 https://dev.mysql.com/downloads/mysql/ 2、解壓到固定位置,如D:\MySQL\mysql 5.7.24 3、添加my.ini文件 跟bin同級 ··· [mysql] 設置mysql客戶端預設字元集 default character set=utf ...
  • map 結構 1. 語法:map(k1,v1,k2,v2,…) 1. 語法:map(k1,v1,k2,v2,…) 操作類型:map ,map類型的數據可以通過'列名['key']的方式訪問 案例: select deductions['Federal Taxes'],deductions['Stat ...
  • 一. 概述 鏈表提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可能通過增刪節點來靈活地調整鏈表的長度。作為一種數據結構,在C語言中並沒有內置的這種數據結構。所以Redis構建了自己的鏈表實現。鏈表在Redis中應用非常多,比如列表鍵的底層實現之一就是鏈表,當一個列表鍵包含了數量比較多的元素 ...
  • 一、導出 用 mysqldump 備份資料庫 1 mysqldump -u用戶 -p密碼 資料庫名 > (目錄)導出文件名 1 mysqldump -u用戶 -p密碼 資料庫名 > (目錄)導出文件名 1 mysqldump -u用戶 -p密碼 資料庫名 > (目錄)導出文件名 1 mysqldum ...
  • 小活中用到mssql,於是在自己lnmp環境中安裝各mssql資料庫 步驟如下: 源碼編譯安裝 (1)下載freetds-stable-0.91源碼:http://download.csdn.net/download/xhu_eternalcc/7457555(花了4積分,沒有積分的找我要,微信zm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...