什么是索引创建策略?
是否可以在SQL Server的同一列上创建多个非聚集索引?
如何在同一列上创建群集和非群集?
非常抱歉,但是索引对我来说很混乱。
有没有办法找出SQL Server中估计的查询执行时间?
这些词很合逻辑,您会很快学会它们。:)
用外行的术语来说,SEEK意味着寻找记录的精确位置,这是当您要搜索的列被索引并且过滤器(WHERE条件)足够准确时,SQL Server会执行的操作。
SCAN意味着更大范围的行,在该行中查询执行计划者估计,与单独查找每个值相比,获取整个范围的速度更快。
是的,您可以在同一字段上拥有多个索引,有时这是一个非常好的主意。播放索引并使用查询执行计划程序确定会发生什么(SSMS中的快捷键:Ctrl + M)。您甚至可以运行同一查询的两个版本,执行计划程序将轻松显示每个版本占用了多少资源和时间,从而使优化变得非常容易。
但是,请进一步扩展一下,假设您有一个这样的地址表,它有超过10亿条记录:
CREATE TABLE ADDRESS
(ADDRESS_ID INT -- CLUSTERED primary key ADRESS_PK_IDX
, PERSON_ID INT -- FOREIGN KEY, NONCLUSTERED INDEX ADDRESS_PERSON_IDX
, CITY VARCHAR(256)
, MARKED_FOR_CHECKUP BIT
, **+n^10 different other columns...**)
现在,如果要查找人员12345的所有地址信息,则PERSON_ID上的索引是完美的。由于该表在同一行上具有其他数据的负载,因此创建一个非聚集索引来覆盖所有其他列以及PERSON_ID将会效率低下且占用空间。在这种情况下,SQL Server将对PERSON_ID中的索引执行索引SEEK,然后使用该索引对ADDRESS_ID中的聚集索引进行键查找,然后从该行返回同一行所有其他列中的所有数据。
但是,假设您要搜索城市中的所有人员,但是不需要其他地址信息。这次,最有效的方法是在CITY上创建索引,并使用INCLUDE选项覆盖PERSON_ID。这样,一次索引查找/扫描将返回您需要的所有信息,而无需诉诸于CLUSTERED索引来检查同一行上的PERSON_ID数据。
现在,假设这两个查询都是必需的,但由于有10亿条记录,因此仍然相当繁重。但是有一个特殊的查询需要非常快。该查询希望地址为MARKED_FOR_CHECKUP且必须居住在纽约的所有人员(忽略任何检查手段,这无关紧要)。现在,您可能想在MARKED_FOR_CHECKUP和CITY上创建第三个过滤索引,INCLUDE覆盖PERSON_ID,并且过滤器说CITY ='New York'和MARKED_FOR_CHECKUP =1。该索引将非常快,因为它只覆盖查询满足这些确切条件的数据,因此与其他索引相比,要通过的数据只有一小部分。
(这里的免责声明,请记住,查询执行计划器不是愚蠢的,它可以将多个非聚集索引一起使用以产生正确的结果,因此上面的示例可能不是最好的,因为很难想象何时需要3个不同的索引涵盖了同一列,但我敢肯定您的想法。)
索引的类型,它们的列,包括的列,排序顺序,过滤器等完全取决于情况。您将需要进行覆盖索引以满足几种不同类型的查询,以及专门为单个重要查询创建的自定义索引。每个索引都占用HDD上的空间,因此,使无用的索引很浪费,并且每当数据模型发生变化时都需要额外的维护,尽管这样会浪费磁盘碎片整理和统计信息更新操作的时间...所以您不想只对所有对象都使用索引要么。
实验,学习和制定最适合您需求的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句