5.3.1 使用索引INCLUDE
在这个技巧中,将展示如何在非聚集索引中包含非键列。覆盖查询(covering query)是指其引用的所有列均能在非聚集索引中找到的查询。这个方案经常会带来出众的查询性能,因为SQL Server不需要从聚集索引或堆中检索实际的数据--它只需要读取在非聚集索引中存储的数据。但是它的缺点是最多只能包含16列或900字节的索引键。
这个问题的一个解决方案是新引入的关键字INCLUDE,它允许添加最多1 023个非键列到非聚集索引,通过创建覆盖索引帮助提升查询性能。这些非键列没有存储在索引的所有级别上,而只是存在于非聚集索引的叶级别上。
使用INCLUDE的CREATE NONCLUSTERED INDEX的语法如下:
CREATE NONCLUSTERED INDEX index_name ON table_or_view_name ( column [ ASC | DESC ] [ ,...n ] ) INCLUDE ( column [ ,... n ] ) 第一个列列表是键索引列,在INCLUDE之后的列列表是非键列。在这个示例中,将新的大型对象数据类型列添加到TerminationReason表中。删除并重建在DepartmentID上的既有索引,这次添加新的非键值到索引中:
ALTER TABLE HumanResources.TerminationReason ADD LegalDescription varchar(max) DROP INDEX HumanResources.TerminationReason.NI_TerminationReason_TerminationReason_DepartmentID CREATE NONCLUSTERED INDEX NI_TerminationReason_TerminationReason_DepartmentID ON HumanResources.TerminationReason (TerminationReason, DepartmentID) INCLUDE (LegalDescription)
解析
这个技巧演示了增强非聚集索引有效性的新技术。示例从创建新的varchar(max)数据类型列开始。因为它的数据类型,不可以在索引中将它当作键值来使用,但在关键字INCLUDE中使用它将允许你引用新的大型对象数据类型。然后使用INCLUDE和新的非键列删除并重建表TerminationReason上的既有索引。
只可以对非聚集索引使用INCLUDE(在覆盖查询上派得上用场),并且仍然不可以包含废弃的image、ntext以及text数据类型。如果额外的非键值使索引大小增长得太显著,你可能会损失一些覆盖查询可以给予的查询性能,因此要确认测试比较之前和之后的性能。
分享到:
相关推荐
SQL Server 索引中 include 的魅力(具有包含性列的索引) SQL Server 索引中 include 的魅力(具有包含性列的索引)是指在非聚集索引中添加非键列,以扩展索引的功能,提高查询性能。通过将非键列添加到非聚集索引...
详细解说了索引与视图的相关内容
标题中的“对索引Include子句的深入分析”是指探讨PostgreSQL数据库中创建索引时的一个特性,即在`CREATE INDEX`语句中使用`INCLUDE`子句。这个子句允许用户将某些列添加到索引的叶子节点,但不包含在B-Tree部分,以...
2. 包含列:通过ALTER INDEX添加INCLUDE子句,将非关键列加入到非聚集索引中,以实现部分覆盖索引。 五、全文索引 SQL Server 2005支持全文索引,适用于文本和大型对象的模糊搜索。通过建立全文目录、索引和查询,...
【SqlServer 索引自动优化工具】是一种针对大型数据库中大量表进行索引优化的解决方案。在描述中提到的情况,项目目标是优化一万多个表的索引,包括完善有效索引和移除无效索引,但因人力资源有限,手动操作不可行,...
本文将详细介绍如何通过SQL查询来查看这些索引,并解释其背后的原理。 #### 一、理解自动创建的索引 在SQL Server中,系统可能会根据某些操作自动为表创建索引,这类索引通常带有前缀`_wa_sys`,用以区分手动创建...
【SQL Server 2012列存储索引技术】 SQL Server 2012 引入了一种创新的索引技术——列存储索引,它显著提升了数据仓库的查询性能,尤其是在决策支持类查询中,可以实现大约10倍的性能提升。列存储索引的核心理念...
- `INCLUDE`:指定非键列用于包含索引。 #### 创建视图 创建视图提供数据的抽象层,使用`CREATE VIEW`命令。 **语法示例:** ```sql CREATE VIEW [视图名称] AS SELECT [列名称列表] FROM [表名称] WHERE [条件]; ...
可以通过在CREATE INDEX语句中使用INCLUDE子句来指定覆盖索引。 5. 创建适量的索引,过多的索引会增加写操作的开销,因为索引需要随着数据的变化进行更新。 总的来说,理解索引的原理和注意事项对于有效管理和优化...
本篇主要通过一个小例子介绍了如何使用索引来优化SQL查询。 首先,我们创建了一个名为`site_user`的表,包含`id`(主键)、`name`、`code`和`date`四个字段。接着,插入了8万条模拟数据。在进行SQL优化之前,先通过...
- 在SQL Server 2005及以后版本中,可以使用`INCLUDE`关键字来指定额外的字段,这些字段不会影响索引的结构,但会在索引中存储以减少查询时的表扫描。 - 示例: ```sql CREATE INDEX IX_TableName_...
在SQL Server 2008中,索引有了新的改进和特性,这其中包括了筛选索引的应用。筛选索引是一种特殊的非聚集索引,允许在创建索引时指定一个过滤条件,这样只有满足该条件的数据行才会被纳入索引中。 **1. 筛选索引...
- **SQL0022W:** 表示查询可能无法使用索引。 - **SQL0023N:** 表示表不存在。 - **SQL0024N:** 表示未指定目标表。 - **SQL0025W:** 表示执行计划可能受到限制。 - **SQL0026N:** 表示未知错误。 - **SQL0028C:** ...
本文将详细介绍如何在Visual C++(VC)中建立与SQL Server的连接,包括所需的库、API函数、步骤以及可能遇到的问题。 首先,我们需要知道的是,VC++通过ODBC(Open Database Connectivity)或OLE DB接口来连接SQL ...
本文将详细介绍SQL Server上的一个奇怪的Deadlock及其分析方法。 Deadlock的产生原因 在本文中,我们遇到了一个奇怪的Deadlock问题,它的产生原因与索引和锁机制有关。在SQL Server中,索引可以提高查询性能,但...
优化这种查询的方法可能是创建一个包含所有需要列的非聚集索引,或者在索引定义中使用INCLUDE子句添加额外的列。 总的来说,理解书签查找并学会避免它对于提升SQL Server的查询性能至关重要。通过合理设计索引、...
在SQL Server中,索引是数据库性能优化的关键要素,它们加快了数据检索速度,减少了对全表扫描的依赖。本文将深入探讨一种特殊类型的非聚集索引——聚焦过滤索引,这是一种在SQL Server 2008及更高版本中引入的新...
例如,通过优化索引使用、调整查询顺序等方式,提升查询速度,降低服务器负载。这对于大型数据库系统的维护和性能调优至关重要。 再者,SQL Assistant还提供了丰富的模板库。开发人员可以根据需要选择预设的SQL模板...
在SQL Server中,当面临查询性能问题时,优化索引是一项关键任务。索引缺失是导致查询速度变慢的常见原因之一。SQL Server提供了一些工具和动态管理视图(DMV)来帮助识别和解决这个问题。本文主要关注如何利用DMV来...