SQLServer索引调优实践(2)

继续上一篇文章,继续SQLServer索引调优实践。这次探讨一下索引覆盖 – SQL Server主要使用索引去查询你需要的数据,当索引包括所有的你请求查询的字段,SQL Server将不需要去在表中查询。这个概念称做索引覆盖。 SQLServer2005的Non-clustered INDEX增加了一

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

继续上一篇文章,继续sqlserver索引调优实践。这次探讨一下索引覆盖 – sql server主要使用索引去查询你需要的数据,当索引包括所有的你请求查询的字段,sql server将不需要去在表中查询。这个概念称做“索引覆盖”。

SQLServer2005的Non-clustered INDEX增加了一个“包含列(included column) ”选项。在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查询性能。这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

但应避免添加不必要的列。添加过多的索引列(键列或非键列)会对性能产生不良影响,应该合理使用。和Clustered INDEX,或者组合索引,结合使用,扩大索引覆盖,但不大可能所有列都有索引覆盖,磁盘开销和数据insert updat时索引的重新计算的时间开销是巨大的。总之,合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来,才能产生最佳的优化方案。

继续实践,先建个实验表 Table1:

建两个索引:

1. 主键ID是Clustered INDEX

2. 非聚簇索引Non-Clustered INDEX建立在Age列上,包含列:Count。

CREATE NONCLUSTERED INDEX [cnt] ON [dbo].[table1]
(
    [Age] ASC
)
INCLUDE ( [Count])
ON [PRIMARY]

我们的测试SQL语句是:从10万条记录中取出4条记录,两种写法

1. SELECT * FROM table1 WHERE age 2. SELECT count FROM table1 WHERE age

看看运行效率如何:

磁盘IO和时间:

sql2

实际执行计划:

sql

性能居然相差20多倍。为什么?

原来第二句Select Count在索引覆盖范围内,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,香港服务器,从而减少磁盘 I/O 操作。而第一句Select * 选择了所有字段,其中有一个字段Name不在索引覆盖范围内(既不在聚簇索引列,也不在非聚簇索引覆盖列内),SQL Server可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),美国服务器,以便搜索关键字共同覆盖一个查询。查询分析优化器会自动进行选择, 上述执行计划就是优化的结果,依然比第二个index seek慢了20倍。

然后我又把sql改了一下,变成从10万条记录中取得大部分数据( 返回99900条),小于号改成大于号:

1. SELECT * FROM table1 WHERE age > 100;
2. SELECT count FROM table1 WHERE age > 100;

看看结果:

磁盘IO和时间:

sql4

实际执行计划:

sql3

依然是第二句索引覆盖的快,这是毋庸置疑的。但第一句执行计划有所不同,SQLServer查询分析优化器选择了不同的策略,改为聚簇索引扫描。上面说过了,SQL Server可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。查询分析优化器会自动进行选择, 上述执行计划就是优化的结果。

为何结果集较小和结果集较大SQLServer选择的索引方案不同?

(From园友 高强:当 WHERE age 100时,由于记录数比较多,所以SQL SERVER 认为直接根据聚集索引叶级页面链表扫描页面得出结果更快。不管怎样,最终目的就是在相同结果集情况下,尽可能减少逻辑IO。)

看到这儿,恐怕喜欢用Select*的同学也要节制一下使用了,有时候SQLServer中Select*代价是很高的。当然类似这种SQL是没有问题的,(where exists (select * from …)),因为SQLServer查询分析优化器会聪明的知道此Select*非彼Select*。

数据库是一个很复杂的系统,即使你不是数据库专家,是应用开发人员,知道一点SQLServer内部更多的东西会有好处,而合理的索引设计是建立在对各种查询的分析和预测上的,只有正确地使索引与程序结合起来, 才能产生最佳的优化方案。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/520385.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月9日 05:17:35
下一篇 2025年11月9日 05:23:43

相关推荐

  • css样式层叠怎么调优先级

    CSS样式层叠调优的方法 在网页开发中,我们使用CSS来为网页添加样式和布局。然而,当多个样式规则同时应用到一个元素上时,就会出现样式层叠的问题。在这种情况下,我们需要了解如何调优样式的优先级。本文将介绍一些调优样式优先级的方法,并提供具体的代码示例。 CSS样式层叠的优先级由以下几个因素决定: 样…

    2025年12月24日
    000
  • 从基础到实际应用:理解响应式CSS框架

    响应式CSS框架:从原理到实践,需要具体代码示例 引言:在当今移动互联网时代,越来越多的用户使用移动设备浏览网页。为了提供更好的用户体验,开发响应式网页设计变得至关重要。而响应式CSS框架便是实现响应式网页设计的一种强大工具。本文将从原理到实践,介绍响应式CSS框架的基本原理,并给出一些具体的代码示…

    2025年12月24日
    000
  • CSS样式的覆盖规则

    下面为大家带来一篇css样式覆盖规则全面了解。内容挺不错的,现在就分享给大家,也给大家做个参考。 大家都知道CSS的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义。其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值,这…

    好文分享 2025年12月24日
    000
  • CSS样式覆盖规则的详细介绍

    大家都知道css的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义。其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值,这个过程就叫“层叠”。样式覆盖(这种叫法更大众化些)遵循一定的规则,之前我对这个规则一直似懂非懂的,…

    好文分享 2025年12月23日
    000
  • 实现响应式布局的指导与实践

    如何实现响应式布局:技巧与实践 在当今移动互联网的时代,响应式布局已经成为了设计网站的标配。随着不同设备、不同屏幕尺寸的普及,用户对于网站的期待也越来越高。为了确保用户体验的连续性和一致性,响应式布局成为了网页设计师必备的技能之一。本文将介绍一些实现响应式布局的技巧和实践,帮助读者更好地掌握这一技能…

    2025年12月21日
    000
  • 如何在HTML中创建以罗马数字索引的列表

    概述 索引是指示句子位置或位置的数字。在HTML中,我们可以通过两种方式进行索引:无序列表(ul)和有序列表(li)。在HTML中使用 标签来创建一个带有罗马数字的列表,罗马数字是按顺序编写的数字,因此我们使用有序列表而不是无序列表。要创建带有罗马数字的有序列表,我们需要定义有序列表的类型,即列表中…

    2025年12月21日
    000
  • 如何用C++实现桥接模式 抽象与实现分离设计方案

    c++++中桥接模式的核心优势在于解耦抽象与实现,使其能独立变化。1. 它通过将一个类中可能变动的具体操作抽离为独立的实现体系,降低类组合数量,避免“m x n”组合爆炸;2. 抽象类(如shape)包含指向实现接口的指针或引用,调用具体实现(如drawingapi),使两者互不影响;3. 适用于多…

    2025年12月18日 好文分享
    200
  • C++ 函数的重载和覆盖

    c++++ 中重载和覆盖是不同的概念。重载允许创建同名函数,具有不同的参数列表,而覆盖允许派生类函数覆盖基类同名函数。在重载中,函数名相同,但参数列表不同,在覆盖中,函数名和参数列表必须相同,并且派生类函数必须使用 override 关键字。 C++ 函数的重载和覆盖 重载与覆盖 重载和覆盖是 C+…

    2025年12月18日
    000
  • C++反射机制实践:实现灵活的运行时类型信息

    C++反射机制实践:实现灵活的运行时类型信息 导语:C++是一门强类型语言,不像其他语言那样直接提供反射机制以获取类的类型信息。然而,通过一些技巧和技术手段,我们也可以在C++中实现类似的反射功能。本文将介绍如何利用模板元编程和宏定义来实现灵活的运行时类型信息。 一、什么是反射机制?反射机制是指在运…

    2025年12月17日
    000
  • 安排一个二进制字符串,以在索引范围内获得最大值。C/C++?

    对于一个由0和1组成的给定字符串,我们给出了M个不相交的范围A,B(A 活动是找到一个合法或有效的排列,同时满足以下两个条件− 所有M个给定范围之间的数字之和最大。 字符串将是字典序最大的。字符串1100的字典序比字符串1001高。 立即学习“C++免费学习笔记(深入)”; 示例 Input1110…

    2025年12月17日
    000
  • C/C++程序中的数组

    数组是一组固定数量的相同数据类型的项目。这些元素存储在内存中的连续内存位置中。 可以使用方括号“[]”和数组名称像a[4]、a[3]等从其索引值访问值的每个单个元素。 声明数组 在c/c++编程语言中,通过定义数组的类型和长度(元素数量)来声明数组。下面的语法显示了在c/c++中声明数组的方法− d…

    2025年12月17日
    000
  • 在C语言中,打印给定索引处的链表节点

    we have to print the data of nodes of the linked list at the given index. unlike array linked list generally don’t have index so we have to traverse t…

    2025年12月17日
    000
  • 在数据库管理系统中,B+树

    A B+ tree in DBMS is a specialized version of a balanced tree, a type of tree data structure used in databases to store and retrieve data efficiently.…

    2025年12月17日
    000
  • C# Avalonia如何集成Entity Framework Core Avalonia EF Core教程

    在 Avalonia 中集成 EF Core 可行,关键在于异步操作、DI 注入 DbContextFactory 及正确管理生命周期;需避免 UI 线程阻塞,推荐用 AddDbContextFactory 而非 Scoped 或 Singleton 注册。 在 Avalonia 中集成 Entit…

    2025年12月17日
    000
  • EF Core在控制台程序中怎么用 EF Core控制台应用入门

    EF Core在控制台程序中入门只需四步:建模型、配上下文、跑迁移、写代码操作数据;依次完成项目创建与NuGet安装、定义实体类和DbContext、执行Add-Migration与Update-Database生成数据库、在Main中用Add/SaveChanges/ToList实现增删改查。 E…

    2025年12月17日
    000
  • EF Core AsNoTracking怎么用 EF Core AsNoTracking提升性能方法

    AsNoTracking是提升EF Core只读查询性能最直接的方法,适用于查后不修改的场景,如列表页、报表、分页接口和数据导出;需在执行前调用,配合Select投影效果更佳,也可全局默认关闭跟踪。 EF Core 的 AsNoTracking 是提升只读查询性能最直接、最常用的方法之一。它不改变业…

    2025年12月17日
    000
  • EF Core怎么处理不同环境的数据库 EF Core多环境配置(ASPNETCORE_ENVIRONMENT)

    EF Core 通过 ASP.NET Core 配置系统和 DI 实现环境差异化配置:按环境加载 appsettings.{Environment}.json 中的连接字符串,开发环境启用迁移与日志,生产环境禁用自动迁移、关闭敏感数据日志,迁移脚本需指定环境生成。 EF Core 本身不直接处理环境…

    2025年12月17日
    000
  • C# Entity Framework Core中的迁移(Migrations) – 数据库架构的版本控制

    迁移是EF Core数据库版本控制机制,通过add-migration生成Up/Down方法脚本,update-database执行并记录至__EFMigrationsHistory表;开发中需及时生成、检查脚本、避免冲突;生产环境应导出SQL交DBA审核,禁用业务逻辑;注意重命名、多上下文等特殊处…

    2025年12月17日
    000
  • C#如何实现定时任务?Hangfire与Quartz.NET两大任务调度框架对比

    Hangfire适合任务可靠性和可观测性要求高的场景,集成简单、自带监控面板,依赖持久化存储,适用于后台任务处理;Quartz.NET侧重精确调度,支持复杂cron表达式,配置灵活但学习成本高,适合对时间控制要求严格的系统。 在C#开发中,实现定时任务是常见需求,比如每天凌晨清理日志、每小时同步数据…

    2025年12月17日
    000
  • C#的Entity Framework Core是什么?如何用它进行数据库操作?

    EF Core是微软提供的轻量级ORM框架,通过安装NuGet包、定义实体类、创建DbContext子类实现数据库操作,支持增删改查及迁移功能,提升开发效率。 Entity Framework Core(简称 EF Core) 是微软为 C# 开发者提供的一个轻量级、可扩展的 ORM(对象关系映射)…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信