导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

关于索引的问题

guhuan 2003-12-08 04:31:28
在学习SQL的过程中,感觉索引的建立对一个数据库的效率高低至关重要,但有几个问题一直不清楚,想请大家帮忙一下,在此先谢过了。
  
  1、是否查询时where中可能用到的字段最好都设上索引
  2、为什么要做复合索引,它的优点是什么
  3、聚合索引和非聚合索引的区别是什么,各有什么优点
  4、为什么要有主索引
顺便问一下:各种数据库的SQL语句是否通用
...全文
25 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shuiniu 2003-12-08
慢慢看,呵呵!
回复
Rotaxe 2003-12-08
1:不一定,有的查询你在where 可能用到的字段都设上索引但SQL server还是用表扫描或聚合索引扫描,比如select * from orders where ordersdate>'1998-05-01'
而select * from orders where ordersdate='1998-05-01'就会使用索引查找
回复
lynx1111 2003-12-08
1、是否查询时where中可能用到的字段最好都设上索引
并不是索引越多越好,group by order by 字段最好建索引

  2、为什么要做复合索引,它的优点是什么
所谓复合索引指使用多个字段值来建立一个索引,这对于一些频繁使用的拥有多个查询条件的
复杂查询语句非常有效如:
select customer_id customer where first_name=“lynx”and last_name="chen"
那么将first_name和last_name两个字段建立一个复合索引将会使这个查询语句达到最高效率。但是同时,进行更新操作将会消耗更多时间。同时复合索引将占更多磁盘空间。

  3、聚合索引和非聚合索引的区别是什么,各有什么优点
当定义一个索引为聚簇索引时,数据库实际按照该索引的顺序来排列基本标中的数据。这意味着按照局促索引莱检索数据将获得最佳性能。
建立非聚簇索引时,不会改变基本标中的数据,而是以指针指向实际的数据。
所以一个表只能有一个聚簇索引,可以有多个非聚簇索引。
一般在主关键字建立句簇索引。
  4、为什么要有主索引
我想你是想说主键或主关键字。因为主键是唯一的,起标识作用。常在查询中扮演重要角色。

顺便问一下:各种数据库的SQL语句是否通用
标准sql是通用的,但是个大型数据库都对标准sql进行了扩展,如:Transact_sql,pl/sql
经过扩展的一般是不通用的!
回复
realgz 2003-12-08
写错字了
4、一般主索引确定了记录的物理排序,并经常用来强制数据完整性 ,如pk
回复
设计索引
当 Microsoft® SQL Server™ 2000 执行查询时,查询优化器会对可用的数据检索方法的成本进行评估,从中选用最有效的方法。SQL Server 可以扫描表,如果索引存在则使用索引。当 SQL Server 执行表扫描时,它从表的第一行开始逐行查找,将符合查询条件的行提取出来。当 SQL Server 使用索引时,它会查找查询所需的行的存储位置,并只提取出所需的行。

在考虑是否为一个列创建索引时,应考虑被索引的列是否以及如何用于查询中。索引对下列查询很有帮助:

搜索符合特定搜索关键字值的行(精确匹配查询)。精确匹配比较是指查询使用 WHERE 语句指定具有给定值的列条目。例如:
WHERE emp_id = 'VPA30890F'

搜索其搜索关键字值为范围值的行(范围查询)。范围查询是指查询指定其值介于两个值之间的任何条目。例如:
WHERE job_lvl BETWEEN 9 and 12



WHERE job_lvl >= 9 and job_lvl <= 12

在表 T1 中搜索根据联接谓词与表 T2 中的某个行匹配的行(索引嵌套循环联接)。


在不进行显式排序操作的情况下产生经排序的查询输出,尤其是经排序的动态游标。


在不进行显式排序操作的情况下,按一种有序的顺序对行进行扫描,以允许基于顺序的操作,如合并联接和流聚合。


以优于表扫描的性能对表中所有的行进行扫描,性能提高是由于减少了要扫描的列集和数据总量(该查询有覆盖索引可供使用)。


搜索插入和更新操作中重复的新搜索关键字值,以实施 PRIMARY KEY 和 UNIQUE 约束。


搜索已定义了 FOREIGN KEY 约束的两个表之间匹配的行。
使用 LIKE 比较进行查询时,如果模式以特定字符串如"abc%"开头,使用索引则会提高效率;如果模式以通配符如"%xyz"开头,则索引不起作用。

在很多查询中,索引可以带来多方面的好处。例如,索引除了可以覆盖查询外,还使得可以进行范围查询。SQL Server 可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。另外,SQL Server 会自动确定利用哪些索引进行查询,并且能够在表被改动时确保该表的所有索引都得到维护。

其它索引设计准则
设计索引时还要考虑的其它准则包括:

一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能,因为 SQL Server 有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。


覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列都包含在同一个索引中。例如,如果在一个表的 a、b 和 c 列上创建了组合索引,则从该表中检索 a 和 b 列的查询被视为覆盖的查询。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了 I/O 总量。尽管给索引添加列以覆盖查询可以提高性能,但在索引中额外维护更多的列会产生更新和存储成本。


对小型表进行索引可能不会产生优化效果,因为 SQL Server 在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。


应使用 SQL 事件探查器和索引优化向导帮助分析查询,确定要创建的索引。为数据库及其工作负荷选择正确的索引是非常复杂的,需要在查询速度和更新成本之间取得平衡。窄索引(搜索关键字中只有很少的列的索引)需要的磁盘空间和维护开销都更少。而另一方面,宽索引可以覆盖更多的查询。确定正确的索引集没有简便的规则。经验丰富的数据库管理员常常能够设计出很好的索引集,但是,即使对于不特别复杂的数据库和工作负荷来说,这项任务也十分复杂、费时和易于出错。可以使用索引优化向导使这项任务自动化。有关更多信息,请参见索引优化向导。


可以在视图上指定索引。有关更多信息,请参见设计索引视图。


可以在计算列上指定索引。有关更多信息,请参见在计算列上创建索引。
索引的特征
在确定某一索引适合某一查询之后,可以自定义最适合具体情况的索引类型。索引特征包括:

聚集还是非聚集


唯一还是不唯一


单列还是多列


索引中的列顺序为升序还是降序


覆盖还是非覆盖
还可以自定义索引的初始存储特征,通过设置填充因子优化其维护,并使用文件和文件组自定义其位置以优化性能。

回复
1、是否查询时where中可能用到的字段最好都设上索引

不是,是经常用到的字段最好设上索引


3、聚合索引和非聚合索引的区别是什么,各有什么优点
聚合索引和非聚合索引的区别是:表中记录的存储顺序是按聚合索引来存储的.
聚合索引会影响记录的存储速度.但效率最高.每个表中只能有一个聚合索引.
非聚合索引不会影响记录的存储速度,效率略低于聚合索引

4、为什么要有主索引
数据库表通常有一列或列组合,其值用来唯一标识表中的每一行。该列称为表的主键。
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
回复
realgz 2003-12-08
1、可能要进行大量扫描的 where 要索引
2、简单理解为建立在几个有排序优先级列上的索引 ,优点啊?相当于进行了一次 order by clol1,...coln的操作做索引,就是在按照序列排序列顺序搜索的时候很有效。
3、一个是影响物理排序顺序,另一个不影响物理排序顺序。聚合索引因为影响了物理排序顺序,所以定位会更快,但更新的时候可能性能句下降了,而且在一张表内只能有一个决定物理顺序的聚合索引
4、一般主索引确定了记录的物理排序,并经常用来强制时间完整性 ,如pk

另外:符合 ansi标准的一般通用,扩展语法未必。


再另外:一本数据库原理可能是你目前最需要的书。
这些答案感觉可以得70分了。
回复
sunshareforever 2003-12-08
聚集索引
在创建聚集索引时,将会对表进行复制,对表中的数据进行排序,然后删除原始的表。因此,数据库上必须有足够的空闲空间,以容纳数据复本。

默认情况下,表中的数据在创建索引时排序。但是,如果因聚集索引已经存在,且正在使用同一名称和列重新创建,而数据已经排序,则会重建索引,而不是从头创建该索引,以自动跳过排序操作。重建操作会检查行是否在生成索引时进行了排序。如果有任何行排序不正确,即会取消操作,不创建索引。

唯一索引
创建唯一索引可以确保任何生成重复键值的尝试都会失败。如果创建的单个查询导致添加了重复的和非重复的键值,SQL Server 会拒绝所有的行,包括非重复的键值。例如,如果一个单个的插入语句从表 A 检索了 20 行,然后将它们插入到表 B 中,而这些行中有 10 行包含重复键值,则默认情况下所有 20 行都将被拒绝。不过,在创建该索引时可以指定 IGNORE_DUP_KEY 子句,使得只有重复的键值才被拒绝,而非重复的键值将被添加。在上面的例子中,将只会拒绝 10 个重复的键值,其它 10 个非重复的键值将被添加到表 B 中。

如果有任何重复的键值,便不能创建唯一索引。例如,如果要在 a 列和 b 列上创建唯一的组合索引,而表中有两行的 a 列同为值 1,b 列同为值 2,则无法创建唯一索引。


回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告