SQL Server数据库中设置索引的策略

在 SQL Server 中,索引通过加快数据检索速度在优化查询性能方面发挥着关键作用。在数据库中设置索引的策略受数据库结构、表的大小和将要运行的查询类型的影响。索引策略通常涉及考虑维度表、事实数据表、大型表和小型表之间的差异。以下是如何将索引应用于这些不同类型的表的详细分类:

1.维度表

维度表通常是中小型表,用于存储描述性的分类数据,用于在数据仓库和 OLAP(联机分析处理)方案中进行查询、筛选和分组。常见示例包括“Customers”、“Products”、“Time”、“Geography”等表。

维度表的索引策略:
  • 主键(聚集)索引:维度表上最常见的索引是主键(通常在代理键或唯一标识符上),它通常是聚集索引。此索引按键值对存储中的表数据进行物理组织。

CREATE TABLE Customers (CustomerID INT PRIMARY KEY, -- Surrogate keyCustomerName NVARCHAR(100),City NVARCHAR(50),Country NVARCHAR(50));
  • 非聚集索引:如果查询经常筛选某些列(例如,‘City’、‘Country’),您可以在这些列上创建非聚集索引以加快查找操作。

CREATE NONCLUSTERED INDEX idx_city_country ON Customers (City, Country);
  • 考虑

  • 小型表:由于维度表的大小通常较小,因此创建和维护索引的开销最小。

  • 读取密集型查询:经常查询维度表以进行查找或联接,因此频繁查询的列上的索引可以显著提高性能。

示例用例:如果您正在运行查询以查找特定Country的所有客户,则“Country”的索引会有所帮助:


SELECT * FROM Customers WHERE Country = 'USA';

2.事实表

事实数据表通常是大型表,用于存储交易数据、指标和事实,例如销售、订单或财务交易。这些表往往会快速增长,并包含数百万甚至数十亿行。

事实表的索引策略:
  • 主键上的聚集索引:如果事实表具有复合主键(例如,‘TransactionID’、‘ProductID’、‘Date’),则聚集索引通常基于此复合键构建。

CREATE TABLE SalesFact (TransactionID INT,ProductID INT,Date DATE,Amount DECIMAL(10, 2),PRIMARY KEY (TransactionID, ProductID, Date) -- Composite key);
  • 外键和常用筛选器上的非聚集索引:由于事实表通常与维度表(例如,‘ProductID’、‘CustomerID’、‘Date’)联接,因此您应该在外键列和经常筛选的列上创建非聚集索引。

CREATE NONCLUSTERED INDEX idx_product_date ON SalesFact (ProductID, Date);
  • 筛选索引:如果事实数据表包含多年数据,并且查询通常针对特定日期范围,则在给定日期范围的“Date”列上创建筛选索引可以提高性能。

CREATE NONCLUSTERED INDEX idx_sales_2023 ON SalesFact (Date)WHERE Date >= '2023-01-01' AND Date 
  • 考虑

  • 大型表:事实表可能非常大,因此需要仔细考虑索引维护(例如重建和重新组织索引)。对事实表过度索引会降低写入性能(例如,在数据被插入时)。

  • 写入密集型数据加载操作:事实表通常处理大量的插入操作。您应该尽量减少索引的数量,或者选择有助于特定查询的索引,而不会对插入性能产生太大影响。

示例使用案例:按产品和日期聚合销售额的查询:


SELECT ProductID, SUM(Amount) AS TotalSalesFROM SalesFactWHERE Date BETWEEN '2023-01-01' AND '2023-12-31'GROUP BY ProductID;

在这种情况下,“ProductID”和“Date”上的索引将有助于加快筛选和分组操作。

3.大型表

大型表是指包含大量数据(通常为数千万到数十亿行)的表。这些表可以是事实数据表,也可以是随着时间的推移而变大的其他表。

大型表的索引策略:
  • 聚集索引:对于大型表,建议对最常用的查询键(通常是主键或日期字段)使用聚集索引。目标是对磁盘上的数据进行排序,以便进行高效的范围扫描和查找。

CREATE CLUSTERED INDEX idx_large_table_id ON LargeTable (LargeTableID);
  • 非聚集索引:除了聚集索引之外,非聚集索引还可用于加速特定的查询模式。例如,如果您的查询经常搜索特定列(例如,‘LastName’),则该列上的非聚集索引将非常有用。

CREATE NONCLUSTERED INDEX idx_lastname ON LargeTable (LastName);
  • 分区:将大型表分区为更小、更易于管理的部分可以提高性能,特别是对于根据分区键(例如日期或区域)访问数据子集的查询。SQL Server 支持表分区,表分区可以与分区索引结合使用。

CREATE PARTITION FUNCTION pf_date_range (DATE)AS RANGE RIGHT FOR VALUES ('2020-01-01', '2021-01-01', '2022-01-01');
  • 考虑

  • 索引维护:大型表需要定期进行索引维护(例如,重建或重新组织索引)以确保索引保持高效。

  • 存储成本:索引会消耗存储空间,因此必须平衡性能改进与存储开销。

4.小型表

小型表是指行相对较少(例如,少于 1,000 行)的表。这些可以是引用表或查找表。

小型表的索引策略:
  • 主键(聚集)索引:即使小型表不需要太多索引,但代理键或自然键上的主键对于确保数据完整性仍然很有用。

CREATE TABLE Country (CountryID INT PRIMARY KEY,CountryName NVARCHAR(50));
  • 非聚集索引:应谨慎使用小表上的非聚集索引,因为性能提升可能并不显著。但是,如果经常查询特定列,索引仍然可以提供一些好处。

CREATE NONCLUSTERED INDEX idx_country_name ON Country (CountryName);
  • 考虑

  • 最小开销:为小型表编制索引不会对性能产生太大影响,但它仍然可以为查找操作带来好处。

  • 查询模式:如果小表被多个字段查询,可以考虑根据查询中经常使用的列创建索引。

索引的一般最佳实践:

  • 避免过度索引:过多的索引会损害性能,尤其是在写入密集型表上,因为每个插入/更新/删除操作都需要维护索引。

  • 监控和优化索引:使用 SQL Server 的内置工具(如 Database Tuning AdvisorSQL Server Profiler)来分析查询性能并确定哪些索引有助于或损害性能。

  • 使用与查询模式匹配的索引:根据最常见查询中 ‘WHERE’、‘JOIN’ 和 ‘ORDER BY’ 子句中使用的特定列创建索引。

  • 考虑查询执行计划:定期查看查询执行计划,以确保索引得到有效使用。

通过遵循这些策略并考虑数据库中表的大小和使用模式,您可以创建有效的索引策略来优化 SQL Server 中的读取和写入性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车(Enter)如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…

25考研软件工程 西南大学跟重庆大学哪个难?

需知晓,西南大学每年报考人数众多,可这不代表报考软件工程专业的人数就多呀,况且西南大学的优势学科并非工科,故而软件工程的报考热度不会如题主所言那般高呢。 其次得明白,软件工程专业上岸难度方面,重庆大…

普通算法——二维前缀和

二维前缀和 题目链接:https://www.acwing.com/problem/content/798/ 题目描述: 输入一个 n n n 行 m m m 列的整数矩阵,再输入 q q q 个询问,每个询问包含四个整数 ** x 1 , y 1 , x 2 , y 2 x1,y1,x2,y2 x1,y1,x2,y2 &…

【无标题】dom不更新 萤石云 ezuikit-js class赋值失败

原因&#xff1a;EZUIKit类赋值到dom节点后影响到dom节点更新 解决&#xff1a;外层嵌套一层节点&#xff0c;v-for外层节点如下 <div :class"item" v-for"item in videoPlay2" :key"item"> <div :id"item"></div> …

Mock神器:Easy-Mock 私有化部署及使用介绍

在现代前后端分离的开发模式中&#xff0c;后端接口的数据模拟是一个常见且必要的需求。尤其是在后端接口尚未开发完成时&#xff0c;前端开发需要依赖模拟数据进行开发与测试。Easy-Mock 是一个非常流行的开源工具&#xff08;虽然它已经停止更新好长时间了&#xff09;&#…

力扣第96题 不同的二叉搜索树

力扣第96题 - 不同的二叉搜索树 题目描述 给定一个整数 n&#xff0c;求以 1 到 n 为节点组成的所有 不同的二叉搜索树&#xff08;BST&#xff09; 的个数。 题目分析 二叉搜索树的性质 对于一个二叉搜索树&#xff0c;以 i 为根节点&#xff1a; 左子树的节点值来自 [1, i…

List与Set、数组与ArrayList、ArrayList与LinkedList的区别

List 与 Set 的区别&#xff1a; 项ListSet重复允许重复的对象&#xff08;多个null也可以&#xff09;不允许重复的对象&#xff08;null也只能有一个&#xff09;有序性有序的。 保持了每个元素的插入顺序。即输出顺序就是输入顺序。 有序和无序都有。 HashSet&#xff1a;无…

Java的Mvc整合Swagger的knife4框架

Swagger的介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger&#xff0c;就是把相关的信息存储在它定义的描述文件里面&#xff08;yml或json格式&#xff09;&#xff0c;再通过维护这个描述 文件可以去更…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

2024.12.5——攻防世界Training-WWW-Robots攻防世界baby_web

2024.12.5—攻防世界Training-WWW-Robots 知识点&#xff1a;robots协议 dirsearch工具 本题与第一道Robots协议十分类似&#xff0c;不做wp解析 大致步骤&#xff1a; step 1 打开靶机&#xff0c;发现是robots协议相关 step 2 用dirsearch进行扫描目录 step 3 url传参r…

springboot第84集:Java进阶之路, Netty

# kafka-map文件夹 cd /usr/local/kafka-map # 根据需求自行修改配置 vi application.yml # 启动 java -jar kafka-map.jar byte minByte -128; byte maxByte 127; 用于表示一个 8 位&#xff08;1 字节&#xff09;有符号整数。它的值范围是 -128&#xff08;-2^7&#xff0…

电脑无法识别usb设备怎么办?电脑无法识别usb解决方法

usb设备是我们常解除的外部操作以及存储设备&#xff0c;它可以方便用户数据传输以及操作输入。但在使用过程中&#xff0c;大家基本都碰到过电脑无法识别usb设备这种情况。这种情况下&#xff0c;我们应该怎么办呢&#xff1f;下面将为你介绍几种可能的原因和解决方法&#xf…

【学习总结|DAY014】Java面向对象高级-继承、多态

一、继承&#xff08;Inheritance&#xff09; 1. 概述 继承是面向对象编程的一种特性&#xff0c;允许我们定义一个类&#xff08;称为子类或派生类&#xff09;以继承另一个类&#xff08;称为超类或基类&#xff09;的功能。 2. 语法格式 public class Zi extends Fu {/…

【时间序列预测】基于PyTorch实现CNN_BiLSTM算法

文章目录 1. CNN与BiLSTM2. 完整代码实现3. 代码结构解读3.1 CNN Layer3.2 BiLSTM Layer3.3 Output Layer3.4 forward Layer 4. 应用场景5. 总结 本文将详细介绍如何使用Pytorch实现一个结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&am…

筑起厂区安全--叉车安全防护装置全解析

在繁忙的工业生产领域中&#xff0c;叉车作为搬运工&#xff0c;穿梭于仓储与生产线之间。然而&#xff0c;叉车的高效运作背后&#xff0c;也隐藏着诸多安全风险&#xff0c;尤其是在那些空间狭小、物流繁忙的环境中。为了降低这些潜在的危险&#xff0c;叉车安全防护装置便成…

MS SQL SERVER服务自动停止解决

报错原因 电脑异常重启&#xff0c;导致 MS SQL server 服务启动后自动停止&#xff0c;在【计算机管理】-【事件查看器】-【windows日志】中进行查看系统错误日志&#xff0c;在【应用程序】下发现可能的错误信息&#xff1a; 传递给数据库 ‘model’ 中的日志扫描操作的日志…

网络安全信息收集(总结)更新

目录 重点&#xff1a; 前言&#xff1a; 又学到了&#xff0c;就是我们什么时候要子域名收集&#xff0c;什么时候收集域名&#xff0c;重点应该放前面 思考&#xff1a; 信息收集分为哪几类&#xff0c;什么是主域名&#xff0c;为什么要收集主域名&#xff0c;为什么要收…

使用 Postman 上传二进制类型的图片到后端接口写法

我们有的时候会有需求&#xff0c;就是通过 postman 传递二进制图片到后端接口&#xff0c;如下图&#xff1a; 那我们的 Java 接口需要怎么写呢&#xff1f; Spring Boot 接收这些数据的方式需要使用 RequestBody 注解来处理原始的二进制数据&#xff08;byte[]&#xff09;。…

如何在Maven项目中避免依赖包版本冲突

在复杂的Maven项目中&#xff0c;依赖管理是一个至关重要的方面。随着项目的增长和外部库的增加&#xff0c;不同依赖之间可能会引入相同库的不同版本&#xff0c;从而导致版本冲突问题。这不仅可能引发编译错误&#xff0c;还可能导致运行时异常或难以调试的行为。本文将探讨几…

Java Web 7 请求响应(Postman)

前言&#xff08;SpringBoot程序请求响应流程&#xff09; 以上一章的程序为例&#xff0c;一个基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 而我们在开发web程序时呢&#xff0c;定义了一…