SQL Server的Descending Indexes降序索引

1、建立测试环境

测试环境:SQL Server 2012

表结构如下

USE [test]
GO CREATE TABLE [dbo].[tt8](
[id] INT IDENTITY(1,1) NOT NULL,
[win_num] [int] NOT NULL DEFAULT ((0)),
[lost_num] [int] NOT NULL DEFAULT ((0)),
[draw_num] [int] NOT NULL DEFAULT ((0)),
[offline_num] [int] NOT NULL DEFAULT ((0)),
[login_key] [nvarchar](50) NULL
CONSTRAINT [PK_user_T] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO

插入测试数据

DECLARE @i INT;
DECLARE @sql NVARCHAR(MAX);
SET @i = 1;
WHILE @i <= 9999
BEGIN
SET @sql = 'INSERT INTO [dbo].[tt8]
(
[win_num] ,
[lost_num] ,
[draw_num] ,
[offline_num] ,
[login_key] )
VALUES (
''' + CAST(@i AS NVARCHAR(3000)) + ''' ,
''' + CAST(@i AS NVARCHAR(3000)) + ''' ,
''' + CAST(@i AS NVARCHAR(3000)) + ''' ,
''' + CAST(@i AS NVARCHAR(3000)) + ''' ,
''' + CAST(@i AS NVARCHAR(3000)) + ''' );';
EXEC ( @sql );
SET @i = @i + 1; END;

2、构建查询语句

查询语句如下,可以看到这个是组合字段排序,要求是:按照draw_num值正序,对于相同的draw_num值,按照win_num值倒序

select top 10 * from [dbo].[tt8] order by  [draw_num] asc,[win_num] desc

根据查询语句建一个非聚集索引

CREATE NONCLUSTERED INDEX [IX_tt8_draw_numwin_num] ON [dbo].[tt8]
(
[draw_num] ASC,
[win_num] ASC )WITH (online= ON) ON [PRIMARY]
GO

建了索引之后,执行计划如下,可以看到无法用到刚才建的索引,因为建索引时候,两个字段的排序顺序都是单向遍历的,统一升序或统一降序


3、建索引

那么,建索引时候能不能按照查询语句的顺序,[draw_num] 升序,[win_num] 降序呢?

答案是可以的,删除刚才建的索引,再建一个新索引

DROP INDEX [IX_tt8_draw_numwin_num]    ON [tt8]

CREATE NONCLUSTERED INDEX [IX_tt8_draw_numwin_num]   ON [dbo].[tt8]
(
[draw_num] ASC ,
[win_num] DESC
) WITH ( ONLINE = ON ) ON [PRIMARY]
GO

建了索引之后,索引大概是这样,第一个字段升序,第二个字段降序

再查询一次,执行计划如下,可以看到这次利用到索引

通过这个例子说明,对于组合字段排序的语句,当多个字段排序顺序不一致的时候,只建单个字段的索引是无法利用到索引的,例如下面只建一个[draw_num] 字段的索引是无法利用到[IX_tt8_draw_num]索引的

CREATE NONCLUSTERED INDEX [IX_tt8_draw_num]   ON [dbo].[tt8]
(
[draw_num] ASC
) WITH ( ONLINE = ON ) ON [PRIMARY]
GO

必须要建排序字段的组合索引,并且索引字段的排序要跟查询语句一致,这个索引在Oracle里面叫Descending Indexes

总结

Descending Indexes这个特性在SQL Server和Oracle的早期版本已经支持,在MySQL里面只有MySQL8.0才支持

所以有时候,还是商业数据库比较强大

参考文章:

https://www.mssqltips.com/sqlservertip/1337/building-sql-server-indexes-in-ascending-vs-descending-order/

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

本文版权归作者所有,未经作者同意不得转载。

SQL Server的Descending Indexes的更多相关文章

  1. SQL Server Column Store Indeses

    SQL Server Column Store Indeses SQL Server Column Store Indeses 1. 概述 2. 索引存储 2.1 列式索引存储 2.2 数据编码和压缩 ...

  2. 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)

    传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...

  3. Part 18 Indexes in sql server

    Indexes in sql server Clustered and nonclustered indexes in sql server Unique and Non Unique Indexes ...

  4. SQL Server中如何识别、查找未使用的索引(unused indexes)

    在SQL Server中,索引是优化SQL性能的一大法宝.但是由于各种原因,索引会被当做"银弹"滥用,一方面有些开发人员(甚至是部分数据库管理员)有一些陋习,不管三七二十一,总是根 ...

  5. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(1)

    <Microsoft Sql server 2008 Internals>索引文件夹: <Microsoft Sql server 2008 Internals>读书笔记--文 ...

  6. 《Pro SQL Server Internals, 2nd edition》中CHAPTER 7 Designing and Tuning the Indexes中的Clustered Index Design Considerations一节(译)

    <Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...

  7. 《Pro SQL Server Internals, 2nd edition》的CHAPTER 2 Tables and Indexes中的Clustered Indexes一节(翻译)

    <Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...

  8. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  9. Understanding how SQL Server executes a query

    https://www.codeproject.com/Articles/630346/Understanding-how-SQL-Server-executes-a-query https://ww ...

随机推荐

  1. Archlinux安裝指南(uefi+gpt)

    1.系统安装前的一些准备 首先在Archlinux官网下载镜像文件,然后刻录到U盘或光盘上.在我的机器上刻录arch镜像文件到U盘后启动不了,因为时间问题我没做过多的探索,所以后面直接刻录到光盘,用光 ...

  2. 网络Socket编程及实例

    1 TCP和UDP介绍 在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次. 1.1  网络体系结构 协议:控制网络中信息的发送和接收.定义了通信实体之间交换报文的格式和次序,以及在报文传 ...

  3. 使用libpcap获取http报文

    在上一篇博客中简单对libpcap库基本函数及基本工作流程做了些简单说明, 今天我们先了解一下pcap_loop()及pcap_dispatch()函数的功能及作用: (1)pcap_loop()循环 ...

  4. Activity的运行过程

    今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...

  5. 如何把Python脚本导出为exe程序

    一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行 最新版是pyinstaller 3.1.1.支持python2.7和py ...

  6. Python List 删除元素

    1. 使用del删除指定元素 li = [1, 2, 3, 4] del li[3] print(li) # Output [1, 2, 3] 2. 使用list方法pop删除元素 li = [1, ...

  7. Windows下python3和python2同时安装python2.exe、python3.exe和pip2、pip3设置

    1.添加python2到系统环境变量 打开,控制面板\系统和安全\系统,选择高级系统设置,环境变量,选择Path,点击编辑,新建,分别添加D:\Python\python27和D:\Python\py ...

  8. 【莫比乌斯反演】BZOJ2005 [NOI2010]能量采集

    Description 求sigma gcd(x,y)*2-1,1<=x<=n, 1<=y<=m.n, m<=1e5. Solution f(n)为gcd正好是n的(x, ...

  9. Java线程与Linux内核线程的映射关系

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...

  10. solr+jieba结巴分词

    为什么选择结巴分词 分词效率高 词料库构建时使用的是jieba (python) 结巴分词Java版本 下载 git clone https://github.com/huaban/jieba-ana ...