技术分享会(二):SQLSERVER索引介绍
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索引介绍的更多相关文章
- DockOne技术分享(二十):Docker三剑客之Swarm介绍
[编者的话]Swarm项目是Docker公司发布三剑客中的一员,用来提供容器集群服务,目的是更好的帮助用户管理多个Docker Engine,方便用户使用,像使用Docker Engine一样使用容器 ...
- 【转】apache kafka技术分享系列(目录索引)
转自: http://blog.csdn.net/lizhitao/article/details/39499283 估计大神会不定期更新,所以还是访问这个链接看最新的目录list比较好 apa ...
- 腾讯技术分享:GIF动图技术详解及手机QQ动态表情压缩技术实践
本文来自腾讯前端开发工程师“ wendygogogo”的技术分享,作者自评:“在Web前端摸爬滚打的码农一枚,对技术充满热情的菜鸟,致力为手Q的建设添砖加瓦.” 1.GIF格式的历史 GIF ( Gr ...
- 美团技术分享:深度解密美团的分布式ID生成算法
本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...
- 关于启用 HTTPS 的一些经验分享(二)
转载: 关于启用 HTTPS 的一些经验分享(二) 几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个 ...
- 认识SQLServer索引以及单列索引和多列索引的不同
一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使 ...
- [知识库分享系列] 二、Web(高性能Web站点建设)
知识库分享系列: [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍 此知识库之所以为 Web 系列,因为和 .NET 没有完全的关系,其中的技术和实践实用于各 ...
- iOS开发技术分享(1)— iOS本地数据存储
iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...
随机推荐
- HDU1717--小数化分数2
这道题是将输入的小数(有可能是无限循环小数)来化为分数.刚開始看到以为枚举(千万不要嘲笑我),可是感觉不正确. 所以百度了小数化为分数的方法,然后看到了各种方法,原来是这这样,在这我採用的是小数化为分 ...
- linux的tcz文件怎么安装?
.tcz文件是Tiny core linux 应用安装包文件启动Tiny core linux后,可以使用tce-load命令安装软件如: tce-load -i /tmp/bftpd.tcz 转自: ...
- jboss6.4 域模式自动部署
1.通过jenkins传递部署包到服务器,调用自动部署shell完成jboss6.4的域模式部署: 2.自动部署shell如下: 完成部署包重命名(从jenkins过来的包可能没有改名:). 调用jb ...
- windows 2003 发布遇到问题---分析器错误消息: 未能加载类型“YWPT.MvcApplication”。
问题如下: “/”应用程序中的服务器错误. ------------------------------------------------------------------------------ ...
- 第二十五篇:使用 sigaction 函数实现可靠信号
前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便. 那就是调用 sigaction ...
- Maven创建一个Web项目
我们可以通过命令行或者直接使用Eclipse创建一个maven webapp项目:通过命令行创建在命令行中输入如下格式的命令将会创建一个新的maven webapp项目:mvn archetype:g ...
- poj_1125 Floyd最短路
题目大意 N个股票经纪人,每个股票经纪人都会将得到的消息传播给另外一些股票经纪人,传播的速度均不固定,且从A传到B的速度和B传到A的速度不一定相等.给定一个消息,并不一定能够传遍所有的股票经纪人,因为 ...
- [素数个数模板] HDU 5901 Count primes
#include<cstdio> #include<cmath> using namespace std; #define LL long long ; bool np[N]; ...
- 【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组
题意:两道题差不多,都是给你一堆平面上的点,每个点有权值,然后m次询问求某一矩形区域内的点权和 题解:先离散化,然后将询问拆成左右两条线段,然后将点和这些线段一起按x坐标排序,在y轴上维护树状数组.然 ...
- PHP 预定义超全局数组/变量
1.超全局变量:不用定义声明即可用.PHP有九种 2.$_GET:通过参数传递给当前脚本的变量的数组 浏览器页面-->(http协议)->apache-->php module--& ...