【數據庫】使用Sql Server創建索引優化查詢速度,一般2萬多數據后,通過非索引時間字段排序查詢出現超時情況

大家好,我是全棧小5,歡迎來到《小5講堂》。
這是《Sql Server》系列文章,每篇文章將以博主理解的角度展開講解。
溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!

在這里插入圖片描述

目錄

  • 前言
  • SQL 創建索引的基本語法和示例
    • 基本語法
    • 常見索引創建示例
      • 1. 創建簡單非聚集索引
      • 2. 創建唯一索引
      • 3. 創建聚集索引
      • 4. 創建復合索引(多列索引)
      • 5. 包含額外列的索引(覆蓋索引)
      • 6. 使用篩選條件創建篩選索引
      • 7. 在線創建索引(減少鎖影響)
      • 8. 指定填充因子
    • 高級選項
      • 并行創建索引
      • 使用 tempdb 排序
      • 在特定文件組上創建索引
    • 注意事項
  • 實用查詢小技巧
    • 技巧說明
    • 基本語法
    • 實際示例
    • 適用場景
    • 注意事項
    • 替代方案
  • 文章推薦

前言

由于博主用的云服務器配置比較低,2M帶寬,所以整體訪問速度會比較慢,單達到一定內存和并發上限后會出現查詢超時的情況。
此時就在硬件不變動情況下,就需要從軟件層面優化,sql表索引就是常見的查詢優化方向之一,
如果你用的是SSMS可視化工具操作sql server數據庫,那么通過可視化方式去創建索引可能會失敗,可以換成通過sql方式創建!

在這里插入圖片描述

SQL 創建索引的基本語法和示例

以下是 SQL Server 中創建索引的完整語法和常見示例:

基本語法

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...)
[INCLUDE (column_name [, ...])]
[WITH (index_option [, ...])]
[ON filegroup_name | partition_scheme_name (column_name)]

常見索引創建示例

1. 創建簡單非聚集索引

CREATE INDEX IX_Customer_LastName ON Customers(LastName);

2. 創建唯一索引

CREATE UNIQUE INDEX IX_Employee_Email ON Employees(Email);

3. 創建聚集索引

CREATE CLUSTERED INDEX IX_Orders_OrderDate ON Orders(OrderDate);

4. 創建復合索引(多列索引)

CREATE INDEX IX_Products_CategoryPrice ON Products(CategoryID, UnitPrice DESC);

5. 包含額外列的索引(覆蓋索引)

CREATE INDEX IX_Orders_CustomerDate 
ON Orders(CustomerID, OrderDate) 
INCLUDE (TotalAmount, Status);

6. 使用篩選條件創建篩選索引

CREATE INDEX IX_ActiveProducts ON Products(ProductName)
WHERE Discontinued = 0;

7. 在線創建索引(減少鎖影響)

CREATE INDEX IX_Customer_Region ON Customers(Region) WITH (ONLINE = ON);

8. 指定填充因子

CREATE INDEX IX_OrderDetails_ProductID 
ON OrderDetails(ProductID) 
WITH (FILLFACTOR = 70);

高級選項

并行創建索引

CREATE INDEX IX_LargeTable_Column ON LargeTable(Column1) WITH (MAXDOP = 4);

使用 tempdb 排序

CREATE INDEX IX_LargeTable_Column ON LargeTable(Column1) WITH (SORT_IN_TEMPDB = ON);

在特定文件組上創建索引

CREATE INDEX IX_LargeTable_Column ON LargeTable(Column1) ON INDEX_FG;

注意事項

  1. 表名和列名區分大小寫取決于數據庫的排序規則設置
  2. 每個表只能有一個聚集索引
  3. 創建索引會占用系統資源,大型表上創建索引可能需要較長時間
  4. 索引會提高查詢性能但會降低插入、更新和刪除操作的性能
  5. 定期維護索引(重建或重組)以保持性能

實用查詢小技巧

使用 WITH (NOLOCK) 減少阻塞

技巧說明

在SQL Server中,當需要快速查詢數據而不需要絕對最新的數據或精確一致性時,可以使用WITH (NOLOCK)提示(也稱為"臟讀")。這可以避免查詢被其他事務阻塞,提高查詢速度,特別是在高并發環境下。

基本語法

SELECT 列名1, 列名2, ...
FROM 表名 WITH (NOLOCK)
WHERE 條件;

實際示例

-- 普通查詢(可能被其他事務阻塞)
SELECT OrderID, CustomerID, OrderDate 
FROM Orders
WHERE OrderDate > '2023-01-01';-- 使用NOLOCK的查詢(不會被阻塞,但可能讀到未提交的數據)
SELECT OrderID, CustomerID, OrderDate 
FROM Orders WITH (NOLOCK)
WHERE OrderDate > '2023-01-01';

適用場景

  1. 報表查詢,對實時性要求不高
  2. 大數據量分析查詢
  3. 開發調試環境
  4. 系統監控查詢

注意事項

  1. 可能讀取到未提交的數據(臟讀) - 如果其他事務回滾,你讀到的數據可能不存在
  2. 不保證數據一致性 - 可能讀到部分更新的數據
  3. 不適合財務等關鍵業務 - 對于需要精確數據的場景不應使用
  4. 不是表鎖的替代品 - 不能解決所有并發問題

替代方案

如果擔心臟讀但需要減少阻塞,可以考慮:

-- 使用READ UNCOMMITTED隔離級別(會話級設置)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT OrderID, CustomerID, OrderDate 
FROM Orders
WHERE OrderDate > '2023-01-01';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 恢復默認

文章推薦

【數據庫】使用Sql Server創建索引優化查詢速度,一般2萬多數據后,通過非索引時間字段排序查詢出現超時情況

【數據庫】SQL Server 查詢條件小技巧:ISNULL 函數的使用,有請DeepSeek來輔助講解下

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

【Sql Server】使用row_number over方式進行表分頁,數據量達到五千多條記錄后,查詢變慢需要20多秒的解決方案

【Sql Server】隨機查詢一條表記錄,并重重溫回顧下自定義函數的封裝和使用

【Sql Server】鎖表如何解鎖,模擬會話事務方式鎖定一個表然后進行解鎖

【Sql Server】通過Sql語句批量處理數據,使用變量且遍歷數據進行邏輯處理

【新星計劃回顧】第六篇學習計劃-通過自定義函數和存儲過程模擬MD5數據

【新星計劃回顧】第四篇學習計劃-自定義函數、存儲過程、隨機值知識點

【Sql Server】Update中的From語句,以及常見更新操作方式

【Sql server】假設有三個字段a,b,c 以a和b分組,如何查詢a和b唯一,但是c不同的記錄

【Sql Server】新手一分鐘看懂在已有表基礎上修改字段默認值和數據類型

總結:溫故而知新,不同階段重溫知識點,會有不一樣的認識和理解,博主將鞏固一遍知識點,并以實踐方式和大家分享,若能有所幫助和收獲,這將是博主最大的創作動力和榮幸。也期待認識更多優秀新老博主。

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

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

相關文章

MyBatis聯合查詢

文章目錄數據庫設計MyBatis 配置MyBatis 映射文件Mapper 接口總結數據庫設計 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

項目中使用的設計模式

項目中使用的設計模式請列舉幾個項目中常用的設計模式什么是設計模式,在項目中使用了那些設計模式動態代理模式JDK動態代理CGLIB動態代理單例模式懶漢式(非線程安全)餓漢式懶漢式(線程安全)工廠模式觀察者模式裝飾器模…

實戰教程:從“對象文件為空“到倉庫重生——修復 Git 倉庫損壞全記錄

文章目錄實戰教程:從"對象文件為空"到倉庫重生——修復 Git 倉庫損壞全記錄案發現場:一個嚴重損壞的倉庫修復之旅:四步讓倉庫重獲新生準備工作:創建安全備份第 1 步:清理戰場——刪除所有空對象第 2 步&…

ansible 操作家族(ansible_os_family)信息

1. 操作系統系列 (ansible_os_family)ansible web -m setup -a filteransible_os_family2. 操作系統家族為 RedHat 時執行任務--- - hosts: websrvsremote_user: roottasks:- name: Install package on RedHat systemsyum:name: httpdstate: presentwhen…

一文學會c++繼承 組合

文章目錄繼承簡介定義訪問限定符和繼承方式?基類派生類賦值轉換繼承的作用域派生類的默認成員函數繼承與友元繼承與靜態成員?復雜的菱形繼承虛擬繼承組合繼承簡介 繼承是面向對象程序設計代碼復用的重要手段,使得程序員可以在保持原類的基礎上擴展,新…

.Net下載共享文件夾中的文件

由于IIS站點權限等問題,總是沒找到處理辦法,所以改用外掛的winform的方式來下載共享文件(也可以改為使用windows服務的方式)。 前提需要先在資源管理器中登錄到共享文件夾,確保系統能訪問。 服務端代碼 (.NET后端) usi…

目標檢測數據集 - 眼睛瞳孔檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹:眼睛瞳孔檢測數據集,真實采集高質量人臉眼部圖片數據,適用于人臉定位、人臉疾病如白內障等疾病的視覺檢測。數據標注標簽包括 eyepupil 瞳孔一 個缺陷類別;適用實際項目應用:眼睛瞳孔檢測項目,以…

Keil MDK-ARM V5.42a 完整安裝教程

文章目錄一、安裝前期準備二、Keil MDK-ARM 主程序安裝三、器件支持包(Pack)安裝四、許可證激活五、安裝驗證Keil MDK(Microcontroller Development Kit)是針對 Arm Cortex-M 系列微控制器的專業開發環境,集成了 μVis…

WPF中引用其他元素各種方法

在WPF中,引用其他元素的方式有多種,每種方式適用于不同場景,各有優缺點。除了x:Reference,常用的還有以下幾種: 一、ElementName 綁定(最常用的XAML綁定方式) 通過元素的x:Name屬性引用同一作用…

Python生成統計學公式

一元線性回歸模型 2.1回歸分析概述/25 一、回歸分析基本概念/25 二、總體回歸函數/27 三、隨機誤差項/29 四、樣本回歸函數/30 2.2 一元線性回歸模型的參數估計/32 一、參數估計的普通最小二乘法/32 二、擬合優度/35 2.3基本假設與普通最小二乘估計量的統計性質/36 一、一元線性…

網絡工程師--華為命令專題

一、交換機 交換機分類:1.根據交換方式劃分:(1)存儲轉發式交換(Store and Forward)(2)直通式交換(Cut-through)(3)碎片過濾式交換&…

判斷可編輯div的光標是否在最前面

要判斷一個可編輯div(contenteditable)中的光標是否位于最前面,可以使用以下幾種方法: 方法一:使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity實戰】使用Unity程序化生成3D隨機地牢(附項目源碼)

最終效果 文章目錄最終效果前言1、理解程序生成的核心概念2、種子值的核心作用3、程序生成的實際應用4、主流程序生成技術概覽5、選擇合適的技術實戰1、素材2、生成一面墻變換矩陣數據3、渲染墻壁4、加點隨機不同的墻壁效果5、繪制四面墻壁4、在四個角落生成支柱5、生成地板6、…

多賬號管理方案:解析一款免Root的App分身工具

之前有小伙伴問阿燦有沒有可以軟件分身的免費軟件,后來阿燦找到了一款可以無限分身的app感覺很實用,只有10M大小 02軟件介紹說白了它能給各種app和游戲做分身,包括V信、qQ、某音、某付寶這些,而且支持最新的安卓15系統。每個分身…

(附源碼)基于PHP和Vue的網上購物平臺

內容摘要 內容摘要: 隨著互聯網技術的迅猛發展,網上購物已成為人們日常生活的重要組成部分。本文圍繞PHPVue技術棧構建的網上購物平臺展開研究,深入探討了該平臺的架構設計與實現細節。平臺前端采用Vue框架,利用其組件化開發和數據驅動的特性…

51單片機

中斷系統1.什么是中斷當CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷2.為什么要…

前端開發:HTML(5)—— 表單

下面我們來學習表單。 目錄 什么是Web表單? 表單標簽 1.form標簽 2.輸入框 文本框和密碼框 單選框和復選框 1.單選框 2.復選框 3.按鈕 (1)普通按鈕 (2)提交按鈕 (3)重置按鈕 &#…

【YOLOv8改進 - C2f融合】C2f融合SFS-Conv(空間 - 頻率選擇卷積)提升特征多樣性,同時減少參數和計算量

YOLOv8目標檢測創新改進與實戰案例專欄 專欄目錄: YOLOv8有效改進系列及項目實戰目錄 包含卷積,主干 注意力,檢測頭等創新機制 以及 各種目標檢測分割項目實戰案例 專欄鏈接: YOLOv8基礎解析+創新改進+實戰案例 文章目錄 YOLOv8目標檢測創新改進與實戰案例專欄 介紹 摘要 文…

如何將照片從POCO手機傳輸到Mac電腦

將照片從POCO手機傳輸到Mac電腦可能會有些困難,因為與iPhone不同,POCO設備沒有原生的macOS支持。這常常讓用戶尋找簡單、有效的方法來移動圖片,同時避免丟失質量,節省時間,并避免復雜的軟件設置。如果你想知道如何將照…

最新教程 | CentOS 7 內網環境 Nginx + ECharts 頁面離線部署手冊(RPM 安裝方式)

📁 一、準備階段(在聯網電腦上完成) 1.1 下載 Nginx 官方 RPM 安裝包 在聯網電腦瀏覽器中訪問 Nginx 官方穩定版本倉庫: 🔗 地址:http://nginx.org/packages/centos/7/x86_64/ ??云盤:htt…