首页 > 数据库 >SQL Server性能优化(2)获取基本信息

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

时间:2025-01-11 16:54:21浏览次数:1  
标签:index 索引 -- object Server 获取 SQL NULL id

以下常用的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 name

OPEN Info_cursor

FETCH NEXT FROM Info_cursor 
INTO @tablename 

WHILE @@FETCH_STATUS = 0
BEGIN

if 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 = @tablename

FETCH NEXT FROM Info_cursor 
INTO @tablename 
END

CLOSE 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'

标签:index,索引,--,object,Server,获取,SQL,NULL,id
From: https://www.cnblogs.com/cairangdela/p/18665864

相关文章

  • Packet for query is too large . You can change this value on the server by setti
    如果写入大数据时,因为默认的配置太小,插入和更新操作会因为max_allowed_packet参数限制,而导致失败。mysql根据max_allowed_packet参数来限制server接受的数据包大小。当一个MySQL客户或mysqld服务器得到一个max_allowed_packet个字节长的包,它发出一个Packettoolarge错误并终......
  • MySQL账号被锁定
    #创建一个用户mysql>createuserkeme@'localhost'identifiedby'123456';#给一个只读权限mysql>grantselecton*.*tokeme@'localhost';#可以从本地登录[root@mysql-150~]#mysql-ukeme-p123456#把keme@'localhost'给lock......
  • HANA常用的功能性sql
    1、SQL去掉字符串左侧0replace(ltrim(replace(“WERKS”,‘0’,’‘)),’',‘0’);2、exists用法–exists判断引导的子句是否有结果集返回,有返回结果集条件成立,反之,不成立;–判断A表对应字段的数据在C表中是否存在EXISTS(SELECT1FROMTABLE01ASCWHEREA.SAP_DATE......
  • 升级MySQL
    本章介绍升级MySQL安装的步骤。升级是一个常见的过程,当您在同一MySQL版本系列中获取bug修复或主要MySQL版本之间的重要功能时。您首先在一些测试系统上执行此过程以确保一切顺利进行,然后在生产系统上执行此过程。在下面的讨论中,必须使用具有管理权限的MySQL帐户运行的MySQL命......
  • 免费送源码:Java+ springboot+MySQL springboot开放实验室管理系统 计算机毕业设计原创
    摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是使用动态网页开发技术java作为系统的开发语言,MySQL作为后台数据库。整个开发过程首先对开放实验......
  • (免费送源码)计算机毕业设计原创定制:Java+ssm+MySQL springboot家政服务平台管理系统
     摘  要在社会快速发展的影响下,家政迅速发展,大大增加了家政服务信息管理的数量、多样性、质量等等的要求,使家政的管理和运营比过去十年更加困难。依照这一现实为基础,设计一个快捷而又方便的家政服务平台管理系统是一项十分重要并且有价值的事情。对于传统的家政服务信息管......
  • (免费送源码)计算机毕业设计原创定制:Java+ssm+MySQL SSM汽车租赁系统
     摘要随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了汽车租赁系统通过错峰停车达到车位利用率最大化。基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬件设计和系统实现三方面进行详细阐述。该......
  • (免费送源码)计算机毕业设计原创定制:Java+B/S+MySQL SpringBoot高校学生档案管理系统
     摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对高校学生档案管......
  • 【MySQL基础篇重点】十一、事务管理(超级干货,你需要的都在这!)
    文章目录Ⅰ.初识事务1、问题引入2、什么是事务3、为什么会出现事务4、事务的版本支持5、事务的提交方式Ⅱ.事务常见操作方式1、准备工作2、正常情况:证明事务的开始与回滚3、异常情况一:证明未`commit`,客户端崩溃,`MySQL`自动会回滚(隔离级别设置为==读未提交==)4、异常情......
  • MySQL 权限详解
    All/AllPrivileges权限代表全局或者全数据库对象级别的所有权限Alter权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。如果是rename表名,则要求有alter和drop原表,create和insert新表的权限Alterroutine权限代表允许修改或者删除存储过程、函数的权限......