使用Filtered Indexes提高查询性能
2012-07-27 20:19
267 查看
通常我们会遇到这样的情况,一张表中包含上百万条的数据,但是每次我们只查询一小部分的数据。
比如一列只有少部分NULL值,每次我们都需要将Null值找出来进行处理。或者我们有状态标志位,需要取Flag对数据处理。 由于数据大部分是重复的,所以对于整个列做索引代价是非常大的,而且对查询性能提升可能不大。
庆幸的是微软提供了Filtered index。Filtered index引使用筛选谓词对表中的部分行进行索引,与全表索引相比,设计良好的筛选索引可以提高查询性能、减少索引维护开销并可降低索引存储开销。
下面是我做的一个测试:
CREATE TABLE [dbo].[test](
[test1] [varchar](100) NULL,
[test2] [varchar](100) NULL,
[test3] [varchar](100) NULL,
[test4] [varchar](100) NULL,
[test5] [varchar](100) NULL,
[flag] [char](1) NULL
) ON [PRIMARY]
flag列只有N和Y两个值。然后插入100W数据,Flag为N,插入5000条Flag为Y,然后对表进行查询:
select flag from test where flag ='Y'---用了7秒钟返回数据
查看执行计划提示缺失索引,建议的创建脚本如下:
CREATE NONCLUSTERED INDEX [ix_filter_flag]
ON [dbo].[test] ([flag])
因为我们只针对于Flag为Y的数据查询,如果使用建议脚本创建索引对性能不会有大的提升而且会增加数据库的负担。 所以我选择用Flitered index:
CREATE NONCLUSTERED INDEX [ix_filter_flag]
ON [dbo].[test] ([flag])
WHERE flag='Y' ;
创建完成后运行上面的语句,发现使用了Index seek,时间不超过一秒中就返回了所有结果。
但是如果想查询Flag为N的,仍然是Table Scan:
当然我们可能还需要查询其他的字段,创建索引的时候还可以配合Include使用。
使用Filtered index还有一些限制,更多信息可以参考MSDN:http://technet.microsoft.com/en-us/library/cc280372.aspx
比如一列只有少部分NULL值,每次我们都需要将Null值找出来进行处理。或者我们有状态标志位,需要取Flag对数据处理。 由于数据大部分是重复的,所以对于整个列做索引代价是非常大的,而且对查询性能提升可能不大。
庆幸的是微软提供了Filtered index。Filtered index引使用筛选谓词对表中的部分行进行索引,与全表索引相比,设计良好的筛选索引可以提高查询性能、减少索引维护开销并可降低索引存储开销。
下面是我做的一个测试:
CREATE TABLE [dbo].[test](
[test1] [varchar](100) NULL,
[test2] [varchar](100) NULL,
[test3] [varchar](100) NULL,
[test4] [varchar](100) NULL,
[test5] [varchar](100) NULL,
[flag] [char](1) NULL
) ON [PRIMARY]
flag列只有N和Y两个值。然后插入100W数据,Flag为N,插入5000条Flag为Y,然后对表进行查询:
select flag from test where flag ='Y'---用了7秒钟返回数据
查看执行计划提示缺失索引,建议的创建脚本如下:
CREATE NONCLUSTERED INDEX [ix_filter_flag]
ON [dbo].[test] ([flag])
因为我们只针对于Flag为Y的数据查询,如果使用建议脚本创建索引对性能不会有大的提升而且会增加数据库的负担。 所以我选择用Flitered index:
CREATE NONCLUSTERED INDEX [ix_filter_flag]
ON [dbo].[test] ([flag])
WHERE flag='Y' ;
创建完成后运行上面的语句,发现使用了Index seek,时间不超过一秒中就返回了所有结果。
但是如果想查询Flag为N的,仍然是Table Scan:
当然我们可能还需要查询其他的字段,创建索引的时候还可以配合Include使用。
使用Filtered index还有一些限制,更多信息可以参考MSDN:http://technet.microsoft.com/en-us/library/cc280372.aspx
相关文章推荐
- Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼
- 使用计算列提高查询性能
- 使用正确的筛选参数来提高查询性能
- CTE和WITH AS短语结合使用提高SQL查询性能
- 性能优化(一个)Hibernate 使用缓存(一个、两、查询)提高系统性能
- 使用正确的筛选参数来提高查询性能
- 使用VO和EO的AlternateKey特性提高查询性能
- EF Core 使用编译查询提高性能
- 使用查询改写提高查询性能
- 使用正确的筛选参数来提高查询性能
- 使用游标批量获取数据提高查询性能
- 使用查询改写提高查询性能
- 使用 XML 查询替换 ADO.NET 中的 IN ,提高查询性能
- 使用索引查询是否能提高查询的性能以及索引的优缺点
- LINQ – 使用DataLoadOptions 提高LINQ to SQL 查询性能
- 使用索引和统计特性来提高数据库的查询性能(转)
- 提高sql查询性能-使用instr函数替换like
- 使用各种查询选择来提高性能
- CTE和WITH AS短语结合使用提高SQL查询性能
- 使用索引不一定能提高查询性能