• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

永远有李

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

使用SQL Server 索引中的包含性列的索引(Include)

当创建非聚集索引以包含某个查询时,可以在索引定义中包含非键列,以包含查询中未用作主搜索列的那些列。这样可以提高性能,因为查询优化器可以在索引中找到需要的所有列数据,而不用访问表或聚集索引。

抓取出来的执行SQL如下,40W的数据Inner Join 3W的数据:

declare @p11 int
set @p11=15
declare @p12 int
set @p12=1
exec SP_GSP_Get_Data_Paged @Tables=N'QRY_WORKITEM INNER JOIN MV_XSDD ON ROOTPROCINSTID = MV_XSDD."ProcessInstanceID"',@Fields=N' MV_XSDD."SalesOrderCode", MV_XSDD."BTypename", MV_XSDD."SaleToName", MV_XSDD."CustomField2", MV_XSDD."LSBMZD_BMMC", MV_XSDD."LSWLDW_DWMC",QRY_WORKITEM.STARTEDDATE,QRY_WORKITEM.PROCESSINSTANCEID,QRY_WORKITEM.ACTIVITYDEFINITIONID ,

QRY_WORKITEM.PROCESSDEFINITIONID ,QRY_WORKITEM.WORKITEMID,QRY_WORKITEM.WORKTYPE',@PK=N'WORKITEMID',

@Filter=N'QRY_WORKITEM.Participant = ''25ef7e1c-f205-4982-a684-1b6b1ab210f7'' and QRY_WORKITEM.State=''2'' AND QRY_WORKITEM.BIZPROCID = ''6c62d818-9d4f-47db-b63c-264b0982ced3''',@Sort=N'STARTEDDATE',@PageSize=220,@PageNumber=1,@AppendantTables=N'',@AppendantFilter=N'QRY_WORKITEM.Participant = ''25ef7e1c-f205-4982-a684-1b6b1ab210f7'' and QRY_WORKITEM.State=''2'' AND QRY_WORKITEM.BIZPROCID = ''6c62d818-9d4f-47db-b63c-264b0982ced3''',@AppendantSort=N'',@RecordCount=@p11 output,@RevisedPageNumber=@p12 output

 

具有包含性列的索引

 

在 SQL Server 2005 中,可以通过将非键列添加到非聚集索引的叶级别来扩展非聚集索引的功能。通过包含非键列,可以创建覆盖更多查询的非聚集索引。这是因为非键列具有下列优点:

  • 它们可以是不允许作为索引键列的数据类型。 
  • 在计算索引键列数或索引键大小时,数据库引擎不考虑它们。

当查询中的所有列都作为键列或非键列包含在索引中时,带有包含性非键列的索引可以显著提高查询性能。这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

CREATE NONCLUSTERED INDEX [WORKITEM_CHA_ID] ON [WORKITEM] 
(
[PARTICIPANT] ASC,
[STATE] ASC,
[BIZPROCID] ASC
)
INCLUDE ( [WORKITEMID],
[STARTEDDATE],
[ROOTPROCINSTID])

GO

 

新增上这个索引后,查询提高到1秒

posted on 2013-04-09 11:41  永远有李  阅读(2725)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3