1:不一定,有的查询你在where 可能用到的字段都设上索引但SQL server还是用表扫描或聚合索引扫描,比如select * from orders where ordersdate>'1998-05-01'
而select * from orders where ordersdate='1998-05-01'就会使用索引查找
设计索引
当 Microsoft® SQL Server™ 2000 执行查询时,查询优化器会对可用的数据检索方法的成本进行评估,从中选用最有效的方法。SQL Server 可以扫描表,如果索引存在则使用索引。当 SQL Server 执行表扫描时,它从表的第一行开始逐行查找,将符合查询条件的行提取出来。当 SQL Server 使用索引时,它会查找查询所需的行的存储位置,并只提取出所需的行。
在考虑是否为一个列创建索引时,应考虑被索引的列是否以及如何用于查询中。索引对下列查询很有帮助:
搜索符合特定搜索关键字值的行(精确匹配查询)。精确匹配比较是指查询使用 WHERE 语句指定具有给定值的列条目。例如:
WHERE emp_id = 'VPA30890F'
搜索其搜索关键字值为范围值的行(范围查询)。范围查询是指查询指定其值介于两个值之间的任何条目。例如:
WHERE job_lvl BETWEEN 9 and 12
搜索已定义了 FOREIGN KEY 约束的两个表之间匹配的行。
使用 LIKE 比较进行查询时,如果模式以特定字符串如"abc%"开头,使用索引则会提高效率;如果模式以通配符如"%xyz"开头,则索引不起作用。
在很多查询中,索引可以带来多方面的好处。例如,索引除了可以覆盖查询外,还使得可以进行范围查询。SQL Server 可以在同一个查询中为一个表使用多个索引,并可以合并多个索引(使用联接算法),以便搜索关键字共同覆盖一个查询。另外,SQL Server 会自动确定利用哪些索引进行查询,并且能够在表被改动时确保该表的所有索引都得到维护。
其它索引设计准则
设计索引时还要考虑的其它准则包括:
一个表如果建有大量索引会影响 INSERT、UPDATE 和 DELETE 语句的性能,因为在表中的数据更改时,所有索引都须进行适当的调整。另一方面,对于不需要修改数据的查询(SELECT 语句),大量索引有助于提高性能,因为 SQL Server 有更多的索引可供选择,以便确定以最快速度访问数据的最佳方法。
覆盖的查询可以提高性能。覆盖的查询是指查询中所有指定的列都包含在同一个索引中。例如,如果在一个表的 a、b 和 c 列上创建了组合索引,则从该表中检索 a 和 b 列的查询被视为覆盖的查询。创建覆盖一个查询的索引可以提高性能,因为该查询的所有数据都包含在索引自身当中;检索数据时只需引用表的索引页,不必引用数据页,因而减少了 I/O 总量。尽管给索引添加列以覆盖查询可以提高性能,但在索引中额外维护更多的列会产生更新和存储成本。
对小型表进行索引可能不会产生优化效果,因为 SQL Server 在遍历索引以搜索数据时,花费的时间可能会比简单的表扫描还长。
1、可能要进行大量扫描的 where 要索引
2、简单理解为建立在几个有排序优先级列上的索引 ,优点啊?相当于进行了一次 order by clol1,...coln的操作做索引,就是在按照序列排序列顺序搜索的时候很有效。
3、一个是影响物理排序顺序,另一个不影响物理排序顺序。聚合索引因为影响了物理排序顺序,所以定位会更快,但更新的时候可能性能句下降了,而且在一张表内只能有一个决定物理顺序的聚合索引
4、一般主索引确定了记录的物理排序,并经常用来强制时间完整性 ,如pk