索引查找
问题引入:
表姐蓝发现用相同的列索引次序不同索引,然后同样的SQL语句执行时间却不同
CREATE INDEX INDEX_YN_CREATEDATE ON ORDERS(YN,CREATEDATE)
--118 毫秒
CREATE INDEX INDEX_YN_CREATEDATE ON ORDERS(CREATEDATE,YN)
--187 毫秒
分析过程:
------------------------------------------------------------------------
-- Author: happyflystone
-- Date : 2009-02-13 15:00:07
-- Ver: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
--
------------------------------------------------------------------------
-- Test Data: TA
IF OBJECT_ID('TA') IS NOT NULL
DROP TABLE TA
Go
CREATE TABLE TA(PID INT PRIMARY KEY,ID INT,COL DATETIME)
Go
CREATE INDEX INDEX_YN_CREATEDATE2 ON TA(COL,ID)
GO
CREATE INDEX INDEX_YN_CREATEDATE1 ON TA(ID,COL)
GO
SELECT *
FROM TA WHERE COL >= CONVERT(VARCHAR(10),GETDATE()-300,120)
AND COL <= CONVERT(VARCHAR(10),GETDATE(),120) AND ID = 1
|--INDEX SEEK(OBJECT:([CSDNDB].[DBO].[TA].[INDEX_YN_CREATEDATE2]), SEEK:([CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@1],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0)), WHERE:(CONVERT(CHAR(1),[CSDNDB].[DBO].[TA].[ID],0)=[@2]) ORDERED FORWARD)
INDEX SEEK OBJECT:([CSDNDB].[DBO].[TA].[INDEX_YN_CREATEDATE2]), SEEK:([CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@1],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0)), WHERE:(CONVERT(CHAR(1),[CSDNDB].[DBO].[TA].[ID],0)=[@2]) ORDERED FORWARD [CSDNDB].[DBO].[TA].[PID], [CSDNDB].[DBO].[TA].[COL], [CSDNDB].[DBO].[TA].[ID]
SELECT *
FROM TA
WHERE ID = 1
AND COL >= CONVERT(VARCHAR(10),GETDATE()-300,120)
AND COL <= CONVERT(VARCHAR(10),GETDATE(),120)
|--INDEX SEEK(OBJECT:([CSDNDB].[DBO].[TA].[INDEX_YN_CREATEDATE1]), SEEK:([CSDNDB].[DBO].[TA].[ID]=CONVERT_IMPLICIT(BIGINT,[@1],0) AND [CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@2],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0)) ORDERED FORWARD)
INDEX SEEK OBJECT:([CSDNDB].[DBO].[TA].[INDEX_YN_CREATEDATE1]), SEEK:([CSDNDB].[DBO].[TA].[ID]=CONVERT_IMPLICIT(BIGINT,[@1],0) AND [CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@2],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0))
查询计划如下:
(CSDN不让上传图片)
――解释
索引查找
索引查找操作是SQL Server从索引中读取数据采用的迭代器,返回特定谓词上一个或多个范围内的数据行,仅扫描满足该谓词的数据页,查询开销显然要比表中总记录数的开销低,因此,对于大数据量的表进行查询时,使用查找谓词是比较有效率的。
谓词与谓词覆盖
索引要确保包含或覆盖查询中引用的列集合,关于查询优化的例子很多,对列是否能进行索引查找相信大家不陌生吧。
好,对上面的例子进行简要说明,第一个查询使用INDEX_YN_CREATEDATE2(COL,ID)索引,在第一个键列上进行索引查找,然后使用residual谓词来估计ID,
SEEK:([CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@1],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0)), WHERE:(CONVERT(CHAR(1),[CSDNDB].[DBO].[TA].[ID],0)=[@2])
第二个查询在ID,COL索引上进行利用索引INDEX_YN_CREATEDATE1(ID,COL)进行查找。
SEEK:([CSDNDB].[DBO].[TA].[ID]=CONVERT_IMPLICIT(BIGINT,[@1],0) AND [CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@2],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0)) ORDERED FORWARD)
INDEX SEEK OBJECT:([CSDNDB].[DBO].[TA].[INDEX_YN_CREATEDATE1]), SEEK:([CSDNDB].[DBO].[TA].[ID]=CONVERT_IMPLICIT(BIGINT,[@1],0) AND [CSDNDB].[DBO].[TA].[COL] >= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE()-CONVERT_IMPLICIT(DATETIME,[@2],0),120),0) AND [CSDNDB].[DBO].[TA].[COL] <= CONVERT_IMPLICIT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120),0))
DROP TABLE TA
GO
分享到:
相关推荐
文件索引查找软件 WinCatalog 2016 中文多语特别版文件索引查找软件 WinCatalog 2019 中文多语特别版 位置管理 它可以帮助管理物理位置更容易。您可以添加所有的位置,说“框1”或“2 CD包”和关联的每个项目目录中...
两台服务器,CPU及内存...相同查询如句,一台上执行计划是索引查询,另一台则被分为 索引扫描+并行度(信息提示什么分区列) ,两库、表统计信息、结构完全一样。 是什么原因引起了不同的执行计划?如何解决???
Visual studio 2019 数据结构与算法 内排序实验代码.zip (1) 二分查找算法的实现 (2) 索引查找算法的实现
NULL 博文链接:https://touch-2011.iteye.com/blog/1089807
算法07五大查找之:索引查找,算法数据结构 五大常用算法
《数据结构与算法》-李春葆 实验报告-典型查找算法实践-二分查找、分块索引查找
实验十一索引查找的实现.pdf
教案数据库实验知识数据库操作的实现算法B树索引查找.pdf
数据库-实验4-数据库操作的实现算法-B树-索引查找.pdf
SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试、总结、归纳。需要的朋友可以参考下本
索引顺序表查找,通过c++实现。
太好了简单方便实用的软件,支持 课程设计-索引顺序表查找
1代表维度1,即列,indices是筛选的索引序号。 例子: import torch x = torch.linspace(1, 12, steps=12).view(3,4) print(x) indices = torch.LongTensor([0, 2]) y = torch.index_select(x, 0, ind
摘要:本应用笔记阐述了使用内置可编程温度索引查找表(LUT)控制可变电阻,以补偿稳压器温漂。该应用中,可变电阻基于查找表每隔2°C提供一个补偿阻值,从而利用可变电阻有效补偿稳压器输出的任何温度变化(-40°C至+...
“索引”里输入关键字查找的列表,双击能正常显示所有文章的主题。 制作日期2020-6-7,截至到该日是最新版本的网站内容。 为啥我只制作英文版呢,因为中文的翻译只是一对一的将一句英文翻译成一句中文,有时候我...
DS1859用其中一路可变电阻和温控查找表(LUT)进行温度补偿,从测试结果可以清楚地看出利用DS1859温度索引查找表对系统指标的改善。更简单的芯片,譬如DS1847双温控非易失可变电阻同样带有温度索引查找表,效果一样...
聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表 120%的附加空间,以存放该表的副本和索引中间页。 SQL ...
由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使 用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。SQL ...