SQLSERVER索引介绍

一、SQLSERVER索引类型?

1、聚集索引;

2、非聚集索引;

3、包含索引;

4、列存储索引;

5、无索引(堆表);

二、如何创建索引?

索引示例:

建表

create table t_test

(

id int identity(1,1),

name nvarchar(50),

[no] varchar(50),

[score] int,

created datetime

)

数据初始化

declare @i int = 1

while(@i <= 10000)

begin

insert into t_test(name,no,created,score)

select 'name_' + CAST(@i as varchar),'20190101-'  + CAST(@i as varchar),DATEADD(day,@i,'2019-01-01'),CAST( rand() * 100 as int)

set @i = @i + 1

End

堆表

sp_helpindex t_test

select * from sysindexes where id = OBJECT_ID('t_test') -- indid = 0 堆表,1 聚集索引,2 列存储索引,大于等于3 常规索引;

查看执行计划

select * from t_test where id = 5000

添加主键(聚集索引)

alter table t_test add constraint PK_t_test primary key(id)

查看执行计划

select * from t_test where id = 10

非聚集索引

create index ix_created on t_test(created)

select * from t_test where created between '2019-01-08' and '2019-01-15'

包含索引

create unique index uix_no on t_test(no) include(name)

查看和对比执行计划

select * from t_test where no = '20190101-100'

select name,no from t_test where no = '20190101-100'

排序字段加入索引

查看执行计划

select * from t_test where created between '2019-01-08' and '2019-02-01'

select * from t_test where created between '2019-01-08' and '2019-02-01'

order by score desc

创建索引

create index ix_created_score on t_test(created,score)

三、如何检查索引是否被用到?是否还有索引未创建?

1、当前指定表的索引使用情况

declare @table as nvarchar(100) = 'crm_customer';

SELECT

(

select name

from sys.indexes

where object_id = stats.object_id and index_id = stats.index_id

) as index_name

,*

FROM sys.dm_db_index_usage_stats as stats

where object_id = object_id(@table)

order by user_seeks desc, user_scans desc, user_lookups desc

2、当前表可能缺失的索引

select d.*

, s.avg_total_user_cost

, s.avg_user_impact

, s.last_user_seek

,s.unique_compiles

from sys.dm_db_missing_index_group_stats s

,sys.dm_db_missing_index_groups g

,sys.dm_db_missing_index_details d

where s.group_handle = g.index_group_handle

and d.index_handle = g.index_handle

and object_id = object_id('SCM_Loan_Loan')

order by s.avg_user_impact desc

字段说明:

avg_total_user_cost:可通过组中的索引减少的用户查询的平均成本

avg_user_impact:该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。

unique_compiles:将从该缺失索引组受益的编译和重新编译数

四、SQL Trace查看实时数据

五、扩展一Profiler的常用功能

列筛选:ClientProcessID,Duration,Reads,TextData

六、扩展二通过DMV分别找出最耗时、最耗CPU、调用最频繁的语句

-- 最耗时的sql

declare @n int

set @n=500 ;

with cte1 as

(

select a.*,t.*

from sys.dm_exec_query_stats a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

where t.dbid >= 5

)

select

t.dbid,db_name(t.dbid) as dbname, a.total_worker_time,a.avg_time_ms,a.execution_count,a.cache_count,

replace(replace(t.text,CHAR(10),' '),CHAR(13),' ') as text

from

(

select top(@n)

plan_handle,

sum(total_worker_time) / 1000 as total_worker_time ,

sum(execution_count) as execution_count ,

count(1) as cache_count,

(sum(total_worker_time) / sum(execution_count) ) / 1000 as avg_time_ms

from cte1

group by plan_handle

order by avg_time_ms desc

) a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

where avg_time_ms > 200

order by avg_time_ms desc

Go

-- 调用最频繁的sql

declare @n int

set @n=500 ;

with cte1 as

(

select a.*,t.*

from sys.dm_exec_query_stats a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

where t.dbid >= 5

)

select

t.dbid,db_name(t.dbid) as dbname,

a.execution_count,a.total_worker_time,a.avg_time_ms,a.cache_count,

replace(replace(t.text,CHAR(10),' '),CHAR(13),' ') as text

from

(

select top(@n)

plan_handle,

sum(total_worker_time) / 1000 as total_worker_time ,

sum(execution_count) as execution_count ,

count(1) as cache_count,

(sum(total_worker_time) / sum(execution_count) ) / 1000 as avg_time_ms

from cte1

group by plan_handle

order by avg_time_ms desc

) a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

order by execution_count desc

go

-- 最耗cpu的sql

declare @n int

set @n=500 ;

with cte1 as

(

select a.*,t.*

from sys.dm_exec_query_stats a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

where t.dbid >= 5

)

select

t.dbid,db_name(t.dbid) as dbname,

a.total_logical_reads,a.avg_reads,a.total_logical_writes,a.avg_writes,a.execution_count,

a.total_worker_time,a.avg_time_ms,a.cache_count,

replace(replace(t.text,CHAR(10),' '),CHAR(13),' ') as text

from

(

select top(@n)

plan_handle,

sum(total_logical_reads) as total_logical_reads,

(sum(total_logical_reads) / sum(execution_count) ) as avg_reads,

sum(total_logical_writes) as total_logical_writes,

(sum(total_logical_writes) / sum(execution_count) ) as avg_writes,

sum(execution_count) as execution_count,

count(1) as cache_count,

sum(total_worker_time) as total_worker_time ,

(sum(total_worker_time) / sum(execution_count) ) / 1000 as avg_time_ms

from cte1

group by plan_handle

order by ( (sum(total_logical_reads) / sum(execution_count) ) + (sum(total_logical_writes) / sum(execution_count) ) ) desc

) a

cross apply sys.dm_exec_sql_text(a.plan_handle) t

order by (avg_reads + avg_writes) desc

go

技术分享会(二):SQLSERVER索引介绍的更多相关文章

  1. DockOne技术分享(二十):Docker三剑客之Swarm介绍

    [编者的话]Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是更好的帮助用户管理多个Docker Engine,方便用户使用,像使用Docker Engine一样使用容器 ...

  2. 【转】apache kafka技术分享系列(目录索引)

    转自:  http://blog.csdn.net/lizhitao/article/details/39499283   估计大神会不定期更新,所以还是访问这个链接看最新的目录list比较好 apa ...

  3. 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践

    本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...

  4. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...

  5. 关于启用 HTTPS 的一些经验分享(二)

    转载: 关于启用 HTTPS 的一些经验分享(二) 几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个 ...

  6. 认识SQLServer索引以及单列索引和多列索引的不同

     一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使 ...

  7. [知识库分享系列] 二、Web(高性能Web站点建设)

    知识库分享系列: [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍 此知识库之所以为 Web 系列,因为和 .NET 没有完全的关系,其中的技术和实践实用于各 ...

  8. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  9. UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制

    本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...

随机推荐

  1. 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1052 首先膜拜题解orz,表示只能想到二分... 贪心就是每一次找到一个最小的能包围所有点的矩阵,然 ...

  2. 根据List<SqlParameter>返回sql条件(where后)

    /// <summary> /// 根据参数列表返回sql条件(where后) /// </summary> /// <param name="list&quo ...

  3. hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. RabbitMQ之Exchange-4

    RabbitMQ消息模型的核心思想是生产者不会将消息直接发送给队列.生产者通常不知道消息将会被哪些消费者接收,按照刚开始里介绍的rabbitMQ中所画的,生产者不是直接将消息发送给Queue么认识会交 ...

  5. angularJs多文件上传

    <input type="file" id="file{{$index}}" class="file{{$index}}" ngf-s ...

  6. 权限模块_整体方案说明_设计实体&映射实体_实现初始化权限数据的功能

    权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个 ...

  7. kotlin正式由Goole公布为Android的最新开发语言

    那么,现在大家开发Android的话一般来说都是直接用Java,这个没错吧(高手除外).嗯,那么用力那么久的Java,不知道大家是否有想过Java的不足,已经很多可以优化的地方呢.当然,新修订的版本中 ...

  8. OOXML,XLSX分析

    07以上的xlsx是使用了OOXML和zip,将后缀修改为.zip,就可以看到文件,主要分析xl目录下的文件,如图: 主要数据文件在xl目录下面 styles.xml里面存放着excel的样式数据 很 ...

  9. Xamarin绑定微信SDK 实现分享功能

    从开始做这一块的工作开始,就开始找各种的资料,最后还是老老实实的去看官方文档. 对于Xamarin.Android的绑定属于纯jar的绑定,这个难度较小,添加Bindings Library,将lib ...

  10. java 从服务器下载文件并保存到本地

    昨天在做一个项目时,用到了从服务器上下载文件并保存到本地的知识,以前也没有接触过,昨天搞了一天,这个小功能实现了,下面就简单的说一下实现过程: 1.基础知识          当我们想要下载网站上的某 ...