SQL Server性能优化(2)获取基本信息

news/2025/1/11 16:51:44/文章来源:https://www.cnblogs.com/cairangdela/p/18665864

以下常用的SQL语句有利于我们分析数据库的基本信息,然后根据查询的结果进行优化。

1. 查看索引碎片

    无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。下面是一些简单的查询索引的SQL。

基本概念参考:http://www.cnblogs.com/jinzhenshui/archive/2012/11/15/2771749.html

复制代码
----查看数据库中索引的情况---
SELECT OBJECT_NAME(dt.object_id),   si.name,   dt.avg_fragmentation_in_percent,   dt.avg_page_space_used_in_percent   
FROM  (SELECT object_id,   index_id,   avg_fragmentation_in_percent,   avg_page_space_used_in_percent   --FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, 'DETAILED')   FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'DETAILED')   WHERE index_id <> 0   ) AS dt --does not return information about heaps   
INNER JOIN sys.indexes si   ON si.object_id = dt.object_id   AND si.index_id  = dt.index_id
复制代码

注:sys.dm_db_index_physical_stats 的五个参数

database_id--要查看索引所在数据库,当前数据库ID我们可以用db_id()函数来取到
object_id--要查索引所在表的id,比如我们要查看表T1,可以用object_id('T1')来取到该表的ID
index_id--要查看索引的索引号,该索引也同样可以用object_id('索引名')来获取
partition_number--对象中的分区号。partition_number为int类型。有效的输入包括索引或堆的 partion_number 或 NULL
mode--在msdn中的解释是这样的:
函数的执行模式将确定为了获取此函数所使用的统计信息数据而执行的扫描级别。mode 被指定为 LIMITED、SAMPLED 或 DETAILED。此函数将遍历构成表或索引的指定分区的分配单元页链。
LIMITED:模式运行最快,扫描的页数最少。对于堆,它将扫描所有页,但对于索引,则只扫描叶级上面的父级别页。 
SAMPLED:模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用DETAILED模式代替 SAMPLED。 
DETAILED:模式将扫描所有页并返回所有统计信息。 
从 LIMITED 到 DETAILED 模式,速度将越来越慢,因为在每个模式中执行的任务越来越多。若要快速测量表或索引的大小或碎片级别,请使用 LIMITED 模式。它的速度最快,并且对于索引的IN_ROW_DATA 分配单元中的每个非叶级别,不返回与其对应的一行。

按msdn上面的说法,如果碎片比小于30%,我们可以重新组织索引,如果碎片比大于等于30%,我们可以选择重新生成索引。

结果如下:

image

同时,我们查看每个表的行数,占用空间,索引占用空间等情况,根据索引的大小,我们对数据库的信息有更深入的了解

复制代码
--查看每个表的行数,占用空间,索引占用空间等情况。
declare @tablename varchar(255)
declare @cmdsql varchar(500)DECLARE Info_cursor CURSOR FOR 
select name 
from dbo.sysobjects where OBJECTPROPERTY(id, N'IsTable') = 1 
and name not like N'#%%' order by nameOPEN Info_cursorFETCH NEXT FROM Info_cursor 
INTO @tablename WHILE @@FETCH_STATUS = 0
BEGINif exists (select * from dbo.sysobjects where id = object_id(@tablename) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
execute sp_executesql 
N'insert into tablespaceinfo exec sp_spaceused @tbname',
N'@tbname varchar(255)',
@tbname = @tablenameFETCH NEXT FROM Info_cursor 
INTO @tablename 
ENDCLOSE Info_cursor
DEALLOCATE Info_cursor
GO
复制代码

查询结果:Index_size为索引大小

image

2. 数据库占用空间等

sp_helpdb

image

3. 清空缓存进行查询分析,用于查看SQL运行的真实时间【生产环境禁用,否则后果自负

DBCC DROPCLEANBUFFERS    --关闭缓存,从缓冲池中删除所有缓冲区
DBCC FREEPROCCACHE        --关闭缓存,从过程缓冲区删除所有元素

4. 查看日志大小

    使用dbcc sqlperf(logspace)函数

image

那我们不能每次都这样执行命令来看,应该放到一个表中保存起来.先创建一个数据表

复制代码
create table dbo.LogSize
(dbname   nvarchar(50) not null,logsize  decimal(8,2) not null,logused  decimal(5,2) not null,status   int   null
)
复制代码

然后动态执行dbcc sqlperf(logspace)命令:

insert into dbo.LogSize
execute('dbcc sqlperf(logspace) with no_infomsgs'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867818.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【floorplan_mesh_project】运行Distributed package doesnt have NCCL built in处理

Distributed package doesnt have NCCL built in报错:修改E:\develop\anaconda3\envs\meshgpt\lib\site-packages\torch\distributed\distributed_c10d.py init_process_group,手动设置后端为gloo(第1116行)

[P3899 [湖南集训] 更为厉害]

P3899 [湖南集训] 更为厉害 [湖南集训] 更为厉害 题目描述 设 \(\text T\) 为一棵有根树,我们做如下的定义:设 \(a\) 和 \(b\) 为 \(\text T\) 中的两个不同节点。如果 \(a\) 是 \(b\) 的祖先,那么称“\(a\) 比 \(b\) 更为厉害”。 设 \(a\) 和 \(b\) 为 \(\text T\) 中的两…

BurpSuite实操之解码器功能使用

解码器是一个进行手动执行或对应用程序数据者智能解码编码的工具。此功能可用于解码数据找回原来的数据形式,或者进行编码和数据加密。由解码选项(Decode as)、编码选项(Encode as)、散列(Hash)构成.。编码、解码选项,目前支持URL、HTML、Base64、ASCI、十六进制、八进制、二…

sqoop--官方首页

https://sqoop.apache.org/

md学习DAY1

Markdown学习DAY1 标题 三级标题 四级标题 字体 粗体hello,world! 斜体hello,world! 斜体加粗hello,world! 废除hello,world! 引用选择疯狂包,成为包上包分割线图片超链接 点击跳转到疯狂包子的博客 列表A B CA B C表格姓名 性别 出生代码 public

CheeseTools:红队内网横向

免责声明 仅限用于技术研究和获得正式授权的攻防项目,请使用者遵守《中华人民共和国网络安全法》,切勿用于任何非法活动,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律连带责任项目介绍 这个库是基于已经存在的MiscTool制作的,所以非常…

2025 最新中国铁路路线地图 All In One

2025 最新中国铁路路线地图 All In One 中国铁路 12306 网站2025 最新中国铁路路线地图 All In One中国铁路 12306 网站高铁线路图中国高速铁路线路图 / 中国高铁线路规划图https://crh.gaotie.cn/ demosC3035 复 上海南 -> 亳州南 07:45 ~ 12:34 (04:49) 当日到达站序 站名…

JAVA-Day 12:方法的定义和调用

方法的定义和调用 方法定义的格式: public static void 方法名(){方法体(就是打包起来的代码)} 方法调用的格式: 方法名(); 定义调用一个方法用于个人介绍 public static void main(String[] args){myself(); } public static void myself(){System.out.println("小王同学…

PC电脑屏幕实时翻译工具-Translumo

点击上方蓝字关注我 前言 Translumo是基于.Net开发的、开源屏幕翻译器软件,它可以实时检测并翻译屏幕上所选区域中出现的文本,可检测视频中的字幕或图片中出现文字等 安装环境 [名称]:Translumo [大小]:500MB [版本]:0.9.6 [语言]:简体中文 [安装环境]:Windows 界面使用…

Text1-综合练习5

Text-综合练习5 产生十个1-100之间的随机数存入数组 求和 求平均数 找出有几个数字比平均值小 Random number1=new Random();Scanner number2=new Scanner(System.in);System.out.println("请输入要产生随机数的个数:");int n=number2.nextInt();int arr[]=new int […

Text1-综合练习6

Text-综合练习6 键盘录入n个数字,倒放他们的顺序 例如:输入1 2 3 4 5,输出5 4 3 2 1 Scanner EX=new Scanner(System.in);String arr[]=new String[100];String temp;int count=0;System.out.println("请输入要交换的数字:,以空格结束");for (int i = 0; i < 1…

Text1-综合练习2

Text-综合练习2 键盘录入一个大于2的整数,求它的平方根 结果省去小数部分保留整数 Scanner st=new Scanner(System.in);System.out.println("请输入一个大于2的整数:");int number1=st.nextInt();for(int i=1;i<number1;i++){//从1开始查找一直到number1的值int n…