国产素人在线观看人成视频-国产素人自拍-国产台湾夫妻在线播放-国产台湾全黄a一级毛片-国产台湾无码AV片在线观看-国产探花视频

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

SQL Server的Descending Indexes降序索引

freeflydom
2024年12月12日 8:48 本文熱度 141

背景
索引是關系型數據庫中優化查詢性能的重要手段之一。對于需要處理大量數據的場景,合理的索引策略能夠顯著減少查詢時間。

特別是在涉及多字段排序的復雜查詢中,選擇合適的索引類型(如降序索引)顯得尤為重要。本文將探討如何在SQL Server中使用降序索引優化查詢性能,并通過實例展示其應用效果。

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 <= 9
BEGIN
    IF @i % 2 = 0
    BEGIN
        SET @sql
            = N'INSERT  INTO [dbo].[tt8]
        ( 
          [win_num] ,
          [lost_num] ,
          [draw_num] ,
          [offline_num] ,
          [login_key] 
         
        )
        VALUES  ( 
        ''' + CAST(@i+2 AS NVARCHAR(3000)) + N''' ,
        ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
        ''' + CAST(@i-1 AS NVARCHAR(3000)) + N''' ,
            ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
            ''' + CAST(@i AS NVARCHAR(3000)) + N''' 
        );';
    END;
    ELSE
    BEGIN
        SET @sql
            = N'INSERT  INTO [dbo].[tt8]
        ( 
          [win_num] ,
          [lost_num] ,
          [draw_num] ,
          [offline_num] ,
          [login_key] 
                 )
        VALUES  ( 
        ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
        ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
        ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
            ''' + CAST(@i AS NVARCHAR(3000)) + N''' ,
            ''' + CAST(@i AS NVARCHAR(3000)) + N''' 
        );';
    END;
    EXEC (@sql);
    SET @i = @i + 1;
END;

瀏覽數據

SELECT * FROM [dbo].[tt8]

 

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

 建了非聚集索引之后,執行計劃如下,可以看到無法用到剛才建的非聚集索引[IX_tt8_draw_numwin_num],因為建索引時候,兩個字段的排序順序都是單向遍歷的,統一升序或統一降序

下面的執行計劃說明數據庫引擎掃描聚集索引之后,需要對[win_num]字段進行倒序排序,所以會看到sort算子

 

查詢結果如下,查詢結果沒有問題

3、建降序索引

那么,建索引時候能不能按照查詢語句的排序順序,[draw_num] 升序,[win_num] 降序呢?

答案是可以的,再建一個新索引按照[draw_num] 升序,[win_num] 降序的排序順序

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

建了索引之后,非聚集索引的結構大概是這樣,第一個字段升序,第二個字段降序

再查詢一次,查詢結果如下,沒有問題

 

執行計劃如下,可以看到這次利用到索引[IX_tt8_draw_numwin_num_reverse],然后跟聚集索引聯合返回結果 

可以看到聚集索引/主鍵索引的存儲結構,winnum字段是順序排序存儲的

SELECT TOP 10 * FROM [dbo].[tt8]

[IX_tt8_draw_numwin_num_reverse]索引的存儲結構是[win_num]字段倒序,[draw_num]字段升序存儲的

這個倒序索引的弊端是,當向表插入數據或者更新數據時,需要先對[win_num]字段倒序排序再插入或者更新到[IX_tt8_draw_numwin_num_reverse]索引,所以性能會有一點損耗

select [draw_num],[win_num]  from [dbo].[tt8] with (INDEX([IX_tt8_draw_numwin_num_reverse]))

查詢結果

通過這個例子說明,對于組合字段排序的語句,當多個字段排序順序不一致的時候,只建單個字段的索引無法利用到索引,例如下面只建一個[draw_num] 字段的索引,在遇到下面語句時無法使用[IX_tt8_draw_num]索引

select TOP 10 * FROM [dbo].[tt8] ORDER BY  [draw_num] ASC,[win_num] DESC

單字段索引

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 直到 8.0 版本才引入這個功能,這也體現了不同數據庫系統在功能上的演進。
在性能關鍵的場景下,商業數據庫往往提供更強大和優化的功能。然而,索引策略的選擇需要謹慎,尤其是面對字段排序順序不一致的查詢時,正確的索引能夠極大提升查詢性能。

參考文章

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

https://sqlmaestros.com/free-sql-video-troubleshoot-slow-running-query-sql-server-extended-events-wait-stats/

轉自https://www.cnblogs.com/lyhabc/p/18417544/sql-server-index-optimization-with-ascending-and-descending-order


該文章在 2024/12/12 8:48:40 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2024 ClickSun All Rights Reserved

主站蜘蛛池模板: 东北60岁熟女露脸在线| 7M精品福利视频导航| 免费看欧美日韩一区二区三区| 免费网站色| 免费黄色电影观看| 色综合久久久久综合体桃花网| 18女下面流水不遮网站免费| 欧美性色黄大片四虎影视| 黑人巨大两根一起挤进A片小说| 黄页网站在线观看视频| 最近韩国日本免费高清观看直播| jizzjizzjizz在线观看| 四房播播地址| 国产福利资源网在线观看| 亚洲精品无码成人A片在线漫画| 操美女免费视频| 正在播放国产精品| 精品一区二区三区影片| 国产免费网站看V片在线观看| 欧美日韩在线视频观看 | 欧美日韩一区视频 | porn精品国产| 一本大道一卡二卡三卡 视 | 国产高清卡一卡新区| 色阁阁日韩欧美在线| 污污网站免费下载入| 中国免费黄色片| 精品AV综合导航| 精品人妻无码一区二区三区下一页| 99re免费在线视频| 医生别摸啊摁摁| 免费v片在线观看| 欧美综合区自拍亚洲综合图| 麻豆文化传媒精品一区观看| 99ri精品国产亚洲| 久久机热视频免费| 国产国语特级 a毛片| 99久久久久国产精品免费| 欧美熟妇无码XXXXXX| 丁香五六月婷婷| 免费三级毛片|