索引查找
问题引入:
表姐蓝发现用相同的列索引次序不同索引,然后同样的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
分享到:
相关推荐
《索引查找之英语词典(C语言实现)》 在计算机科学中,高效的数据结构和算法是解决问题的关键。本项目以C语言实现了一个英语词典的索引查找功能,旨在帮助用户快速查找并定位单词。这个实现不仅涉及到C语言的基础...
二分查找算法和索引查找算法是两种在计算机科学中广泛应用的高效搜索策略,尤其在处理大规模有序数据时。在本篇文章中,我们将深入探讨这两种算法的原理、实现及应用场景。 首先,我们来讨论二分查找算法。二分查找...
**索引顺序表查找**是一种在数据...通过结合索引查找和顺序查找,它能够在保持较低复杂度的同时,避免完全依赖高级查找算法带来的额外开销。在实际编程中,理解并熟练掌握这种查找策略对于优化程序性能具有重要意义。
《算法07五大查找之:索引查找》 在计算机科学和信息技术领域,算法是解决问题的核心工具之一。本文将深入探讨五大查找算法之一——索引查找,也称为分块查找。这种查找方法结合了顺序查找和二分查找的优点,提高了...
在本实验报告中,我们关注的是两种常见的查找算法——二分查找和分块索引查找,它们都是在数据结构和算法领域中极为重要的概念。这两种查找算法主要应用于处理有序序列,能够有效地提高查找效率。 首先,二分查找是...
文件索引查找软件 WinCatalog 2016 中文多语特别版文件索引查找软件 WinCatalog 2019 中文多语特别版 位置管理 它可以帮助管理物理位置更容易。您可以添加所有的位置,说“框1”或“2 CD包”和关联的每个项目目录中...
实验十一的主题是“索引查找的实现”,主要目标是掌握数据结构中的查找算法,特别是索引查找算法。在这个实验中,学生需要实现一系列与索引查找相关的算法,并编写测试程序来验证它们的功能。 实验的内容围绕着一个...
两台服务器,CPU及内存...相同查询如句,一台上执行计划是索引查询,另一台则被分为 索引扫描+并行度(信息提示什么分区列) ,两库、表统计信息、结构完全一样。 是什么原因引起了不同的执行计划?如何解决???
在本课程设计中,我们将关注一种特定的数据查找方法——索引顺序查找,这是一种结合了顺序查找和索引查找优势的算法。在这个项目中,我们使用C++编程语言来实现这一算法。 首先,让我们理解什么是索引顺序查找。...
在SQL Server中,索引查找(Index Seek)和索引扫描(Index Scan)是两种不同的查询执行策略,它们直接影响查询性能。通常,Index Seek更为高效,因为它只访问满足条件的索引条目,而Index Scan则会遍历整个索引,...
教案数据库实验知识数据库操作的实现算法B树索引查找.pdf
数据库-实验4-数据库操作的实现算法-B树-索引查找.pdf
太好了简单方便实用的软件,支持 课程设计-索引顺序表查找
4. **`user_lookups`**:通过索引查找特定行的次数。 5. **`user_updates`**:索引中字段被更新的次数。 通过这些信息,我们可以判断哪些索引很少被使用或者不再有效,从而考虑删除这些索引以节省空间并减少维护...
2. **索引查找**: 使用索引表快速定位到可能包含目标元素的子区间。 3. **顺序查找**: 在定位到的子区间内执行顺序查找,直到找到目标元素或确认不存在。 示例代码如下所示: ```c #include // 定义数据表 int ...
本实验主要探讨了三种基本的查找算法:顺序查找、折半查找(二分查找)和索引查找,这些算法都是在数组或集合中寻找特定元素的重要方法。下面将详细解释这三种查找算法,并结合C语言编程环境进行深入分析。 1. **...
PyTorch中的索引查找功能尤其重要,它允许开发者轻松地提取出数据中的特定部分。在这篇教程中,我们将详细讲解PyTorch中的一个索引查找函数——index_select,它用于从张量中按照指定维度选择元素。 首先,我们需要...
其次,索引查找是提高数据检索效率的关键技术。索引就像书籍的目录,可以让我们快速定位到所需的信息。在学生信息管理中,可能采用了哈希表、二分查找树或其他索引结构。通过索引,我们可以避免线性搜索,显著减少...