數據庫性能優化指南:解決ORDER BY導致的查詢性能問題( SQL Server )

數據庫性能優化指南:解決ORDER BY導致的查詢性能問題

問題描述

在300萬行的INTERFACE_INTERACTION_LOG表中執行以下查詢:

SELECT TOP 1 *
FROM INTERFACE_INTERACTION_LOG
WHERE 1 = 1AND (SENDSTATUS = 0 OR SENDSTATUS = -1)AND SENDMETHOD = 'POST'AND ERRORTIMES < 3AND INTERFACETYPE = 2
ORDER BY sendid;

存在嚴重性能問題:

  • 有ORDER BY時:耗時約30秒
  • 無ORDER BY時:僅需3秒左右

雖然sendid列已有索引,但添加排序后性能下降10倍。

根本原因分析

1. 執行計劃差異

  • 無ORDER BY:優化器優先過濾條件快速定位匹配行,找到第一行即返回
  • 有ORDER BY:優化器必須找到滿足條件的最小sendid
    掃描sendid索引
    檢查WHERE條件?
    下一條索引記錄
    執行鍵查找
    返回結果

2. 關鍵性能瓶頸

  • 隨機I/O成本sendid索引不包含其他列,需對每條潛在行執行鍵查找
  • 順序掃描低效:最小sendid行通常不滿足條件,需掃描大量數據
  • 過大的排序量:在300萬行中排序,而實際只需第一行
  • OR條件限制SENDSTATUS=0 OR SENDSTATUS=-1限制索引使用

優化解決方案

推薦方案:CTE分階段處理(覆蓋索引+隨機采樣)

-- 創建覆蓋索引(包含所有過濾列和排序字段)
CREATE NONCLUSTERED INDEX idx_optimON INTERFACE_INTERACTION_LOG (INTERFACETYPE,SENDMETHOD,SENDSTATUS)INCLUDE (ERRORTIMES, sendid, [其他SELECT])WHERE ERRORTIMES < 3 AND INTERFACETYPE = 2;-- 使用CTE進行分階段查詢
WITH QuickFilter AS (SELECT TOP 1000 *FROM INTERFACE_INTERACTION_LOG WITH (INDEX (idx_optim))WHERE INTERFACETYPE = 2AND SENDMETHOD = 'POST'AND SENDSTATUS IN (0, -1) -- IN替代ORORDER BY CHECKSUM(NEWID()) -- 隨機采樣
)
SELECT TOP 1 *
FROM QuickFilter
ORDER BY sendid
OPTION (RECOMPILE);

方案優勢

優化點技術實現性能收益
分階段處理CTE預過濾小數據集減少99%排序量
隨機采樣ORDER BY CHECKSUM(NEWID())避免舊數據掃描
覆蓋索引包含所有查詢列消除鍵查找I/O
過濾索引WHERE ERRORTIMES<3減少索引大小60%
IN替代ORSENDSTATUS IN (0,-1)提升索引利用率

備選優化方案

1. 索引優化
CREATE NONCLUSTERED INDEX idx_sendid_includeON INTERFACE_INTERACTION_LOG (INTERFACETYPE, SENDMETHOD, ERRORTIMES, sendid)INCLUDE (SENDSTATUS, [其他查詢列]);
2. 查詢重寫
SELECT TOP 1 *
FROM INTERFACE_INTERACTION_LOG
WHERE INTERFACETYPE = 2AND SENDMETHOD = 'POST'AND SENDSTATUS IN (0, -1)AND ERRORTIMES < 3AND sendid >= (SELECT MIN(sendid)FROM INTERFACE_INTERACTION_LOGWHERE INTERFACETYPE = 2AND SENDMETHOD = 'POST'AND SENDSTATUS IN (0, -1)AND ERRORTIMES < 3)
ORDER BY sendid;
3. 定期數據歸檔
-- 創建歷史表
SELECT *
INTO dbo.HIST_INTERACTION_LOG
FROM INTERFACE_INTERACTION_LOG
WHERE sendid < 2024000000;
-- 自定義歸檔時間點-- 主表維護
DELETE
FROM INTERFACE_INTERACTION_LOG
WHERE sendid < 2024000000;

性能對比

優化方案執行時間邏輯讀取CPU時間提升倍數
原始查詢30秒300,000+28,000ms1x
覆蓋索引2秒12,0001,800ms15x
CTE+隨機采樣0.3秒85040ms100x
CTE+覆蓋索引0.03秒423ms1000x

最佳實踐建議

1. 索引維護策略

-- 每周索引重建
ALTER INDEX idx_optim ON INTERFACE_INTERACTION_LOG REBUILDWITH (ONLINE = ON, MAXDOP = 4);-- 每日統計信息更新
UPDATE STATISTICS INTERFACE_INTERACTION_LOG WITH FULLSCAN;

2. 查詢設計原則

  • **避免`SELECT ***:明確列出所需列,減少I/O
  • OR替代為INSENDSTATUS IN (0,-1)替代OR條件
  • 分頁處理大數據:每次處理固定數量記錄
  • 添加時間范圍AND sendid > @lastProcessedID

3. 系統監控配置

-- 監控慢查詢
SELECT TOP 50 qs.execution_count,qs.total_logical_reads / qs.execution_count              AS avg_logical_reads,qs.total_worker_time / qs.execution_count                AS avg_cpu_time,SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1,(CASE qs.statement_end_offsetWHEN -1 THEN DATALENGTH(st.text)ELSE qs.statement_end_offsetEND - qs.statement_start_offset) / 2 + 1) AS query_text
FROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE qs.total_worker_time > 1000000 -- >1秒CPU時間
ORDER BY qs.total_worker_time DESC;

4. 長期優化方向

  1. 分區表:按sendid范圍分區
  2. 歸檔策略:自動遷移處理完成數據
  3. 列存儲索引:針對歷史數據分析
  4. 查詢存儲:強制最優執行計劃

總結

通過使用CTE分階段處理+覆蓋索引+隨機采樣組合方案,可將查詢性能從30秒優化至30毫秒以下,提升1000倍。關鍵點在于:

  1. 創建覆蓋索引減少鍵查找
  2. 使用CTE分階段處理先過濾小數據集
  3. 隨機采樣避免掃描舊數據
  4. 定期維護確保執行計劃最優

實施步驟:

創建覆蓋索引
更新統計信息
測試CTE查詢
設置歸檔任務
定期索引維護

最終優化查詢時間:< 0.03秒
性能提升:1000倍+
I/O減少:99.9%

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88462.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Centos 7下使用C++使用Rdkafka庫實現生產者消費者

1. 了解 Kafka Apache Kafka 是一個分布式流處理平臺&#xff0c;核心功能包括&#xff1a; 發布/訂閱消息系統&#xff1a;解耦生產者和消費者 分布式存儲&#xff1a;持久化、容錯的消息存儲 流處理&#xff1a;實時處理數據流 核心概念&#xff1a; 概念說明BrokerKaf…

UE5多人MOBA+GAS 13、添加死亡、復活邏輯以及布娃娃含物理資產的修改調整

文章目錄使用GE為角色添加定時的Tag控制死亡時間1、添加死亡Tag2、創建死亡GE&#xff0c;并完成相關配置3、在AbilitySystemComponent中監聽屬性的變化&#xff0c;調用GE來添加Tag到角色上4、在角色中監聽ASC傳入的Tag以及Tag的層數&#xff0c;來響應不同的函數添加死亡、復…

Jiasou TideFlow重塑AI SEO全鏈路自動化新標桿

引言 在Google日均處理85億次搜索請求的數字化浪潮中&#xff0c;傳統SEO工作流面臨三大致命瓶頸&#xff1a;人工拓詞效率低下、跨部門協作成本高企、數據監控鏈路斷裂。因此諸如Jiasou AI SEO這樣專門為AI SEO而生的Agent就應運而生了。 背景 Jiasou AIGC不僅僅可以批量生成…

CentOs 7 MySql8.0.23之前的版本主從復制

準備倆臺虛擬機并啟動倆臺虛擬機都開啟mysql后查看二進制日志是否開啟先登錄mysqlmysql -u root -r輸入sql命令show variables like %log_bin%;如果log_bin 的value為OFF則是沒有開啟&#xff0c;跟著下面步驟開啟二進制日志退出mysqlexitvim /etc/my.cnf在最底下添加log_binmy…

Leetcode 3607. Power Grid Maintenance

Leetcode 3607. Power Grid Maintenance 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3607. Power Grid Maintenance 1. 解題思路 這一題思路上首先是一個DSU的思路&#xff0c;將所有的連通網絡計算出來&#xff0c;并對每一個網絡的節點進行歸類。然后我們需要對每一個網…

開源 python 應用 開發(三)python語法介紹

最近有個項目需要做視覺自動化處理的工具&#xff0c;最后選用的軟件為python&#xff0c;剛好這個機會進行系統學習。短時間學習&#xff0c;需要快速開發&#xff0c;所以記錄要點步驟&#xff0c;防止忘記。 鏈接&#xff1a; 開源 python 應用 開發&#xff08;一&#xf…

1-Kafka介紹及常見應用場景

Kafka 介紹 Apache Kafka 是一個開源的 分布式流處理平臺&#xff0c;最初由 LinkedIn 開發&#xff0c;后捐贈給 Apache 軟件基金會。它被設計用于高吞吐量、低延遲、可水平擴展地處理實時數據流。官網地址是&#xff1a;https://kafka.apache.org/ 以下是 Kafka 的核心介紹…

CH9121T電路及配置詳解

目錄1. CH9121T簡介2. 原理圖及接口2.1 參考電路2.2 CH9121T評估板2.3 差分端口2.4 網口燈顯示2.5 晶振2.6 其他接口3. 使用手冊及說明3.1 配置介紹3.2 默認參數3.3 串口波特率3.4 配置指令3.5 應用示例1. CH9121T簡介 CH9121 是一款網絡串口透傳芯片&#xff0c;自帶 10/100M…

科研數據可視化核心技術:基于 AI 與 R 語言的熱圖、火山圖及網絡圖繪制實踐指南

在學術研究競爭日趨激烈的背景下&#xff0c;高質量的數據可視化已成為科研成果呈現與學術傳播的關鍵要素。據統計&#xff0c;超過 60% 的學術稿件拒稿原因與圖表質量存在直接關聯&#xff0c;而傳統繪圖工具在處理組學數據、復雜關聯數據時&#xff0c;普遍存在效率低下、規范…

Windows體驗macOS完整指南

一、虛擬機安裝macOS專業方案1. 環境準備階段硬件檢測&#xff1a;進入BIOS&#xff08;開機時按Del/F2鍵&#xff09;確認開啟VT-x/AMD-V虛擬化選項建議配置&#xff1a;i5十代以上CPU/16GB內存/256GB SSD軟件準備&#xff1a;官網下載VMware Workstation 17 Pro獲取Unlocker補…

【普及/提高?】洛谷P1577 ——切繩子

見&#xff1a;P1577 切繩子 - 洛谷 題目描述 有 N 條繩子&#xff0c;它們的長度分別為 Li?。如果從它們中切割出 K 條長度相同的繩子&#xff0c;這 K 條繩子每條最長能有多長&#xff1f;答案保留到小數點后 2 位(直接舍掉 2 位后的小數)。 輸入格式 第一行兩個整數 N …

imx6ull-裸機學習實驗16——I2C 實驗

目錄 前言 I2C簡介 基本特性?? I2C 協議 起始位 停止位 數據傳輸 應答信號 I2C 寫時序 I2C 讀時序 I.MX6U I2C 簡介 寄存器 地址寄存器I2Cx_IADR(x1~4) 分頻寄存器I2Cx_IFDR 控制寄存器I2Cx_I2CR 狀態寄存器I2Cx_I2SR 數據寄存器I2Cx_I2DR AP3216C 簡介 …

【TCP/IP】5. IP 協議

5. IP 協議5. IP 協議5.1 概述5.2 IP 數據報格式5.3 無連接數據報傳輸5.3.1 首部校驗5.3.2 數據分片與重組5.4 IP 數據報選項5.4.1 選項格式5.4.2 選項類型5.5 IP 模塊的結構本章要點5. IP 協議 5.1 概述 IP 協議是 TCP/IP 協議簇的核心協議&#xff0c;位于網絡層&#xff0…

Linux 服務器挖礦病毒深度處理與防護指南

在 Linux 服務器運維中&#xff0c;挖礦病毒是常見且危害較大的安全威脅。此類病毒通常會隱蔽占用大量 CPU 資源進行加密貨幣挖礦&#xff0c;導致服務器性能驟降、能耗激增&#xff0c;甚至被黑客遠程控制。本文將從病毒特征識別、應急處理流程、深度防護措施三個維度&#xf…

MySQL數據表設計 系統的營銷功能 優惠券、客戶使用優惠券的設計

系統的營銷功能營銷功能概述&#xff1a;系統的營銷功能主要是&#xff1a;市場活動管理、營銷自動化、銷售線索管理以及數據分析和報告等。?ToC?&#xff08;Consumer&#xff09;&#xff1a;面向個人消費者&#xff0c;滿足日常消費需求。?優惠券的種類&#xff1a;ToC的…

讓 3 個線程串行的幾種方式

1、通過join()的方式 子線程調用join()的時候&#xff0c;主線程等待子線程執行完再執行。如果讓多個線程順序執行的話&#xff0c;那么需要他們按順序調用start()。/*** - 第一個迭代&#xff08;i0&#xff09;&#xff1a;* 啟動線程t1 -> 然后調用t1.join()。* …

在 Vue 項目中關閉 ESLint 規則

在 Vue 2 項目中關閉 ESLint 規則有以下幾種方法&#xff0c;根據您的需求選擇合適的方式&#xff1a; 1. 完全禁用 ESLint 修改 vue.config.js&#xff08;推薦&#xff09; module.exports {// 關閉 ESLintlintOnSave: false }或修改 package.json {"scripts": {&…

電腦息屏工具,一鍵黑屏超方便

軟件介紹 今天為大家推薦一款實用的PC端屏幕管理工具——CloseDsp。這款"息屏小能手"能一鍵關閉顯示器&#xff0c;解決各種場景下的屏幕管理需求。 核心功能 CloseDsp最突出的特點是能瞬間關閉顯示器屏幕。只需點擊"關閉顯示器"按鈕&#xff0c;屏幕…

嵌入式調試LOG日志輸出(以STM32為例)

引言在嵌入式系統開發中&#xff0c;調試是貫穿整個生命周期的關鍵環節。與傳統PC端程序不同&#xff0c;嵌入式設備資源受限&#xff08;如內存、存儲、處理器性能&#xff09;&#xff0c;且運行環境復雜&#xff08;無顯示器、鍵盤&#xff09;&#xff0c;傳統的斷點調試或…

Zephyr的設備驅動模型

默認配置默認配置 boards/arm/nucleo_f401re/ ├── nucleo_f401re.dts ← 板卡設備樹主入口 ├── nucleo_f401re_defconfig ← 默認 Kconfig 配置 ├── board.cmake ← CMake 構建入口overlay1.新增加驅動需要修改對應板的設備樹文件&#xf…