SQL中键集游标选择执行计划的方式和影响因素

php中文网
发布: 2016-06-07 17:54:37
原创
1255人浏览过

上次我们在《 游标脚本性能问题解决与分析 》讨论过动态游标的执行计划如何选择并且介绍了几种游标的基本知识。本文我们接着研究键集游标选择执行计划的方式和影响因素。 这这里我们通过一个简单的实验来对比测试并且说明结果。 准备如下测试环境 : CREATE T

上次我们在《游标脚本性能问题解决与分析》讨论过动态游标的执行计划如何选择并且介绍了几种游标的基本知识。本文我们接着研究键集游标选择执行计划的方式和影响因素。

这这里我们通过一个简单的实验来对比测试并且说明结果。

准备如下测试环境:

CREATE TABLE [dbo].[test_cursor](

[number] [int] IDENTITY(1,1) NOT NULL,

[name] [varchar](500) NULL,

[xtype] [varchar](500) NULL,

[type] [varchar](500) NULL,

[parent_obj] [varchar](500) NULL,

[crdate] [datetime] NULL,

[id] [varchar](500) NULL,

[sysstat] [int] NULL,

CONSTRAINT [PK_test_cursor] PRIMARY KEY CLUSTERED

(

[number] ASC

)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

) ON [PRIMARY]

反复运行下面的Insert语句15次以构造测试数据: 

insert into test_cursor (name,xtype,type, parent_obj,crdate,id,sysstat) select name,xtype,type, parent_obj,crdate,id,sysstat from AdventureWorks.dbo.sysobjects.

然后,为该表创建如下索引,

Pandora Avatars
Pandora Avatars

可以制作100多种独特风格的头像

Pandora Avatars 102
查看详情 Pandora Avatars

create index i_test_cursor_1 on test_cursor (id, crdate) include (number, name,xtype,type,parent_obj,sysstat)

create index i_test_cursor_2 on test_cursor(id,crdate)

执行以下Select语句,我们能得到下面的执行计划和统计信息:

SELECT * FROM test_cursor WHERE id>'92' ORDER BY crdate  --index seek on i_test_cursor_1

Table 'test_cursor'. Scan count 1, logical reads 17, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Rows                    Executes             StmtText                                                                                                            

-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------

992                      1                        SELECT * FROM [test_cursor] WHERE [id]>@1      ORDER BY [crdate] ASC

992                      1                        |--Sort(ORDER BY:([aa].[dbo].[test_cursor].[crdate] ASC))                                                         

992                      1                        |--Index Seek(OBJECT:([aa].[dbo].[test_cursor].[i_test_cursor_1]), SEEK:([aa].[dbo].[test_cursor].[id] > '92')

SELECT * FROM test_cursor WHERE id>'92' ORDER BY number -index seek on i_test_cursor_1

Table 'test_cursor'. Scan count 1, logical reads 17, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Rows                    Executes              StmtText                                                                                                                               

-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------

992                     1                          SELECT * FROM [test_cursor] WHERE [id]>@1 ORDER BY [number] ASC                                                                       

992                     1                          |--Sort(ORDER BY:([aa].[dbo].[test_cursor].[number] ASC))                             

992                     1                          |--Index Seek(OBJECT:([aa].[dbo].[test_cursor].[i_test_cursor_1]), SEEK:([aa].[dbo].[test_cursor].[id] > '92') ORDERED FORWARD)

以上两个ad-hoc的语句都是使用了我们创建的index  test_cursor迅速的定位和返回相应的行

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号