`

数据库索引漫谈(整理)1

SQL 
阅读更多
不良的SQL往往来自于不恰当的索引设计、不充份的接条件和不可化的where子句。
们进行适当的化后,其运行速度有了明地提高!
下面我将从三个方面分别进总结
一、不合理的索引设计----
例:表record620000行,看在不同的索引下,下面几个 SQL的运行情况:
---- 1.date上建有一非个群集索引
select count(*) from record where date >'19991201' and date < '19991214'and amount >2000 (25)
select date ,sum(amount) from record group by date(55)
select count(*) from record where date >'19990901' and place in ('BJ','SH') (27)
---- 分析:----
date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据上,在范围查,必须执行一次表描才能找到一范内的全部行。
---- 2.date上的一个群集索引
select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 14秒)
select date,sum(amount) from record group by date28秒)
select count(*) from record where date >'19990901' and place in ('BJ','SH')14秒)
---- 分析:---- 在群集索引下,数据在物理上按序在数据上,重复值也排列在一起,因而在范围查,可以先找到个范的起末点,且只在个范描数据,避免了大范围扫描,提高了查询速度。
---- 3.placedateamount上的合索引
select count(*) from record where date >'19991201' and date < '19991214' and amount >2000 26秒)
select date,sum(amount) from record group by date27秒)
select count(*) from record where date >'19990901' and place in ('BJ, 'SH')< 1秒)
---- 分析:---- 是一个不很合理的合索引,因它的前列是place,第一和第二条SQL没有引用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在合索引中,形成了索引覆盖,所以它的速度是非常快的。
---- 4.dateplaceamount上的合索引
select count(*) from record where date >'19991201' and date < '19991214' and amount >2000(< 1)
select date,sum(amount) from record group by date11秒)
select count(*) from record where date >'19990901' and place in ('BJ','SH')< 1秒)
---- 分析:---- 是一个合理的合索引。它将date列,使SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最
---- 5.总结----
缺省情况下建立的索引是非群集索引,但有它并不是最佳的;合理的索引设计要建立在种查询的分析和预测上。
一般来
.有大量重复值、且常有范围查询between, >,< >=,< =)和order bygroup by生的列,可考建立群集索引;
.常同存取多列,且列都含有重复值可考建立合索引;
.合索引要尽量使关键查询形成索引覆盖,其前列一定是使用最繁的列。
二、不充份的接条件:
例:表card7896行,在card_no上有一个非聚集索引,表account191122行,在account_no上有一个非聚集索引,看在不同的表接条件下,两个SQL行情况:
select sum(a.amount) from account a,card b where a.card_no = b.card_no20秒)
select sum(a.amount) from account a,card b where a.card_no = b.card_no and a.account_no=b.account_no< 1秒)
---- 分析:---- 在第一个接条件下,最佳查询方案是将account作外表,card作内表,利用card上的索引,其I/O次数可由以下公式估算
account上的22541+(外account191122*card对应表第一行所要找的3=595907I/O
在第二个接条件下,最佳查询方案是将card作外表,account作内表,利用account上的索引,其I/O次数可由以下公式估算:外card上的1944+(外card7896*account对应一行所要找的4= 33528I/O
,只有充份的接条件,真正的最佳方案才会被行。
总结
1.多表操作在被实际执行前,查询优化器会根据接条件,列出几可能的接方案并从中找出系统开销最小的最佳方案。接条件要充份考虑带有索引的表、行数多的表;内外表的选择可由公式:外表中的匹配行数*表中一次找的次数确定,乘最小最佳方案。
2.行方案的方法-- set showplanon,打showplan选项,就可以看到序、使用何索引的信息;想看更详细的信息,需用sa角色dbcc(3604,310,302)
分享到:
评论

相关推荐

    数据库索引整理 重建 工具

    SQL Server 数据库索引整理 重建 工具 针对SQL Server数据库(2000,2005,2008,2012),对指定的数据库进行索引的重建整理,从而提前数据库的查询效率。 此工具用C#编译,环境为Net FrameWork3.5 此工具是自动进行...

    数据库索引设计和优化

    数据库索引设计与优化是数据库管理系统中至关重要的一个环节,它直接影响到数据查询的效率、存储空间的使用以及系统的整体性能。在这个主题中,我们将深入探讨数据库索引的基础概念、设计原则、优化策略以及实际应用...

    数据库索引设计与优化.pdf

    《数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地...

    漫谈数据库索引漫谈数据库索引漫谈数据库索引

    1. 避免全表扫描:通过索引,数据库可以快速定位到数据,而无需遍历整个表。 2. 非聚集索引可以不访问数据页:在某些情况下,仅通过索引就能获取所需信息,减少I/O操作。 3. 分散数据插入:聚集索引使得插入操作更...

    数据库索引重建及修复

    数据库索引重建及修复语句

    高清完整版 数据库索引设计与优化

    高清完整版 数据库索引设计与优化 高清完整版 数据库索引设计与优化

    非常实用的数据库索引整理sql语句

    当建大型数据库时,一般要用在数据库中建立索引,然而索引使用时间长了,不但不会加快数据库的检索速度,反而会导致速度的减速,所以要每隔一段时间对索引进行优化和整理。通过这个数据库索整理工具,可不必进行设置...

    数据库索引设计原则.

    数据库索引设计原则 数据库索引设计原则是 Oracle 数据库管理系统中的一项重要技术,旨在提高数据库的查询效率和性能。以下是数据库索引设计原则的详细解释。 一、基本原则 数据库索引设计原则的基本原则是确保...

    数据库索引设计与优化

    数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化数据库索引设计与优化...

    数据库索引设计与优化.part1

    数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与优化.part1数据库索引设计与...

    数据库索引技术ppt

    数据库索引技术是数据库管理系统中的核心组成部分,它极大地提高了数据查询效率,使得在海量数据中查找特定信息变得迅速。下面将分别对标题和描述中提到的各个知识点进行详细阐述。 首先,我们来看“文件记录的组织...

    数据库 索引及优化

    例如,在执行查询 `SELECT * FROM table1 WHERE id = 44` 时,如果没有索引,系统需要逐行扫描整个表来找到满足条件的记录;而如果有索引(假设在 `id` 列上建立了索引),则可以直接通过索引找到该行的位置,从而极...

    数据库索引设计与优化.part2

    数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与优化.part2数据库索引设计与...

    Oracle数据库索引的维护

    3. **索引碎片整理**: - 当数据行被删除后,索引中可能会留下空闲空间,这会导致索引碎片化。可以通过压缩索引来减少碎片。 4. **索引的选择性调整**: - 选择性是指索引中唯一值的比例,较高的选择性意味着...

    数据库索引那些事(数据库索引原理)

    "数据库索引那些事(数据库索引原理)" 数据库索引是数据库的一种对象,它保存数据库表中一列或多列组合的排序。索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。数据库使用...

Global site tag (gtag.js) - Google Analytics