首页 技术 正文
技术 2022年11月16日
0 收藏 869 点赞 3,923 浏览 2776 个字

以下常用的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%,我们可以选择重新生成索引。

结果如下:

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

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

--查看每个表的行数,占用空间,索引占用空间等情况。
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为索引大小

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

2. 数据库占用空间等

sp_helpdb

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

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

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

4. 查看日志大小

    使用dbcc sqlperf(logspace)函数

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

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

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.cnblogs.com/jinzhenshui/archive/2012/11/15/2771749.htmlhttp://blog.csdn.net/fengyarongaa/article/details/8315693

http://www.cnblogs.com/lilycnblogs/archive/2011/03/31/2001372.html

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,030
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,859