云数据库 SQL Server
文档中心>云数据库 SQL Server>性能空间内存相关

性能空间内存相关

最近更新时间:2024-06-05 15:23:01

我的收藏

创建云数据库 SQL Server 实例需要多长时间?

正常情况下,单节点(原基础版)实例创建时间在20分钟左右。双节点(原高可用版/集群版)实例,创建时间都在3分钟左右。只读实例的创建时间与主实例的数据量有关,数据量越大,创建时间越长。如果主实例是空实例,创建实例需3分钟左右。如果超过这个时间,创建过程可能存在问题,请及时 提交工单 联系我们处理。

云数据库 SQL Server 实例对库的数量是否有限制?最多可建立多少个数据库?

云数据库 SQL Server 从性能考虑,建议单个 SQL Server 实例下创建的数据库个数不超过如下建议:
单节点(原基础版):理论上不会限制数据库的建立数量,建议不要超过100个。
双节点(原高可用版/集群版):在控制台会限制数据库的创建数量,建议不要超过70个。
虽然用户也可以通过 SSMS 工具连接实例创建数据库,通过 SSMS 创建的库,也会自动同步到备机,但是建议不要超过数据库数量创建限制,超过限制后易发生主备同步异常。如特殊情况需要咨询,请通过 在线支持 反馈。

云数据库 SQL Server 的 IOPS 有上限吗?

云数据库 SQL Server 对 IOPS 指标没有严格限制。只要 CPU 和内存没有限制,且实例本身没有锁和阻塞的情况下,理论上 IOPS 是没有上限的。

云数据库 SQL Server 为什么自己就会有一个 monitor 库?

monitor 库是系统自带数据库,用于收集数据库中的相关监控信息,对数据库性能不会有影响,也不会占用您的空间。

云数据库 SQL Server 如何跟踪死锁?

云数据库 SQL Server 可通过 SQL Profiler 去跟踪死锁情况。开启 Profiler 的方法为打开 SSMS,选择工具 > SQL Server Profiler,连接到数据库即可。另外需要注意,开启 Profiler 跟踪对性能会有较小的影响,也会占用空间,因此开启完请及时关闭。

如何查看云数据库 SQL Server 实例内存的使用情况?

您可在 SQL Server 控制台 实例的系统监控页,找到内存类别,通过最大内存、内存使用、内存使用率的监控指标,查看云数据库 SQL Server 的存储空间使用情况。

如何查看云数据库 SQL Server 实例中各个数据库的内存使用情况?

您可以通过客户端连接实例,详情请参见 从 Windows 云服务器连接 SQL Server 实例从本地连接 SQL Server 实例,例如:执行如下 SQL 语句(仅供参考),可查看实例中各个数据库的内存使用情况:
select count(*)*8/1024 as 'cache size(MB)',
case database_id
when 32767 then 'ResourceDb'
else DB_NAME(database_id)
end as 'database'
from sys.dm_os_buffer_descriptors
group by DB_NAME(database_id),
database_id
order by 'cache size(MB)' desc

云数据库 SQL Server 监控项中的内存使用一直占比很高?

云数据库 SQLServer 跟微软官方的 SQL server 内存机制保持一致,用到过多少,SQL Server 进程就会显示占用多少,不会自动释放,SQL Server 内部会自动进行交互。释放内存需要重启实例。
例如:一个实例分配了16GB内存,在刚使用时,可能只用到过8GB,SQL Server 进程就会占用8GB,然后实例在某次用到过16GB的时候,SQL Server 进程就会把16GB内存全部占用,然后内部再进行交互,新的缓存数据替换掉旧的缓存数据。进程占用了16GB,不代表这个时候 SQL Server 就使用了16GB的内存,可能只用了1GB。

如何查看云数据库 SQL Server 实例的存储空间使用情况?

您可在 SQL Server 控制台 实例的系统监控页,找到存储类别,通过已使用存储空间硬盘剩余容量百分比的监控指标,查看云数据库 SQLServer 的存储空间使用情况。

创建 SQL Server 数据库后,还没有写入数据或写入极少量数据,为什么存储空间监控显示是已经占用500MB数据?

腾讯云每个 SQL Server 数据库,会自动分配500MB的初始化空间,数据写入时,会优先写入到初始化空间中。因此您没有写入数据或写入极少量数据,存储监控也会显示500MB。

云数据库 SQL Server 删除数据后,存储空间未降低是怎么回事儿?

SQL Server 删除数据后,已经扩展的数据文件不会收缩,文件内部空闲的空间可以支撑后续插入、更新等操作。 例如您申请50GB的实例,某一个数据库写入50GB数据后再全部删除,这时候存储空间监控您已经使用了50GB,但您仍可以继续写入大量文件。

数据量超过了云数据库 SQL Server 实例的最大存储容量会有什么影响?

双节点(原高可用版/集群版)实例:实例存储数据量超过实例所购买的磁盘空间,将无法进行数据库导入,回档等功能,需扩容或在控制台删除部分数据库表释放存储空间。
单节点(原基础版)实例:实例存储数据量超过实例所购买的磁盘空间后,数据库将进入只读状态,只能读取,不能写入。进行扩容或在控制台删除部分数据库表释放存储空间,即可立即恢复读写。

造成云数据库 SQL Server 实例磁盘超用的原因都有哪些?

造成磁盘超用的原因可能有以下几点:
数据空间占用过大:随着业务的扩大,新数据不断插入,导致数据空间会一直增长。
日志文件占用过大:云上数据库会定时备份截断日志文件,长时间有事务未提交,同时数据库中有大量的更新、插入、删除操作,将可能导致记录事务日志过大。

数据量超过了云数据库 SQL Server 实例的最大存储容量该怎么办?

数据空间占用过大,您需要给数据库扩容或在控制台删除部分数据库表释放存储空间,删除数据之后可以在控制台进行数据库收缩操作。建议业务低峰期操作。详情请参见 调整实例规格删除数据库收缩数据库
日志文件占用过大,可能是因为存在长时间未结束的事物导致系统文件过大,您可以监控和清理执行时间过长的会话或事务。

SQL Server 的存储空间是否可以直接扩容?是否需要迁移数据?扩容有什么影响?

存储空间可以直接扩容。如果实例所在主机的存储空间够用,则不需要迁移数据,且扩容期间不会对业务造成任何影响。如果实例所在主机的存储空间不够用,系统会在拥有足够存储空间的主机上自动新建主备实例,并同步原实例数据,数据同步期间实例访问不受影响;迁移完成后会进行切换,切换时会发生秒级数据库连接闪断。 更多关于如何扩容存储空间以及扩容是否会闪断的影响,请参见 调整实例规格

云数据库 SQL Server 的磁盘是否支持缩容?

云数据库双节点(原高可用版/集群版)本地盘版:支持磁盘缩容。
云数据库双节点(原高可用版/集群版)云盘版:不支持磁盘缩容。
云数据库 SQL Server 的单节点(原基础版)云盘版:磁盘不支持缩容。

所购买的云数据库 SQL Server 的磁盘空间组成都有哪些?

1. 数据文件空间:即用户数据所占用的空间, SQL Server 的数据文件空间都是预分配的,所以您每建一个 DATABASE 都会占用近500M空间用以存储您的数据。
2. 事务日志文件空间:SQL Server 的每个 DATABASE 都有一个日志文件,数据库完整模式下会将事务日志写入日志文件。
3. 临时表文件:SQL Server 的 tempdb 占用的文件,复杂查询产生的临时表。

DDL 操作对磁盘空间的要求?

为了确保业务正常,您应该避免在业务高峰进行 DDL(Data Definition Language)等可能导致磁盘空间爆增的操作。必须进行 DDL 操作时,请务必确保磁盘空间大于等于表空间两倍大小+10GB,即:假设您的表空间为500GB,那么,您在进行 DDL 操作时,需确保磁盘空间大于等于500 * 2 + 10 = 1010GB。

如何查看云数据库 SQL Server 的业务数据库的数据文件大小?

登录 SQL Server 客户端,连接实例,关于如何连接实例,详情请参见 从 Windows 云服务器连接 SQL Server 实例从本地连接 SQL Server 实例。在查询框执行如下 SQL 查询语句(仅供参考),可查看业务数据库的数据文件大小:
CREATE TABLE #DBspace(
[DBname] [sysname] NOT NULL,
[DBsize] [decimal](18, 2) NULL,
[DataFileSize] [decimal](18, 2) NULL,
[LogFileSize] [decimal](18, 2) NULL,
[UnallocatedSize] [decimal](18, 2) NULL,
[ReservedSize] [decimal](18, 2) NULL,
[DataSize] [decimal](18, 2) NULL,
[IndexSize] [decimal](18, 2) NULL,
[UnusedSiz] [decimal](18, 2) NULL,
[AcquisitionTime] [datetime] NULL )
EXEC master.sys.sp_MSforeachdb @command1='use [?] ', @command2=N'
use [?];
DECLARE @pages FLOAT
DECLARE @dbsize FLOAT
DECLARE @logsize FLOAT
DECLARE @reservedpages FLOAT
DECLARE @usedpages FLOAT
SELECT @dbsize = SUM(CONVERT(BIGINT, CASE WHEN status & 64 = 0 THEN size ELSE 0 END)) ,@logsize = SUM(CONVERT(BIGINT, CASE WHEN status & 64 <> 0 THEN size ELSE 0 END))
FROM dbo.sysfiles
SELECT @reservedpages = SUM(a.total_pages) ,
@usedpages = SUM(a.used_pages) ,
@pages = SUM(CASE WHEN it.internal_type IN ( 202, 204, 207, 211,212, 213, 214, 215,216, 221, 222, 236 ) THEN 0 WHEN a.type <> 1 AND p.index_id < 2 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END)
FROM sys.partitions p
JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT JOIN sys.internal_tables it ON p.object_id = it.object_id
INSERT INTO #DBspace
select ''?'' ,
(( CONVERT (dec(15, 2), @dbsize)+ CONVERT (dec(15, 2), @logsize) ) * 8192 / 1048576 ),
(( CONVERT (dec(15, 2), @dbsize) ) * 8192 / 1048576 ),
(( CONVERT (dec(15, 2), @logsize) ) * 8192 / 1048576 ),
( (CASE WHEN @dbsize >= @reservedpages THEN ( CONVERT (dec(15, 2), @dbsize)- CONVERT (dec(15, 2), @reservedpages) )* 8192 / 1048576 ELSE 0 END )) ,
(( CONVERT (dec(15, 2), @reservedpages) ) * 8192 / 1048576 ),
(( CONVERT (dec(15, 2), @pages) ) * 8192 / 1048576) ,
(( CONVERT (dec(15, 2), @usedpages - @pages) ) * 8192/ 1048576) ,
(( CONVERT (dec(15, 2), @reservedpages - @usedpages) )* 8192 / 1048576),
(GETDATE()) '
SELECT * FROM #DBspace ORDER BY UnallocatedSize DESC
DROP TABLE #DBspace

如何查看云数据库 SQL Server 的业务数据库日志文件大小以及状态?

登录 SQL Server 客户端,连接实例,关于如何连接实例,详情请参见 从 Windows 云服务器连接 SQL Server 实例从本地连接 SQL Server 实例。在查询框执行如下 SQL 查询语句(仅供参考),可查看业务数据库日志文件大小及状态:
create table #T
(
[dbname] [nvarchar](100) NULL,
[logsize] [decimal](30, 2) NULL,
[logused] [decimal](30, 2) NULL,
[status] [int] NULL
)
INSERT INTO #T([dbname],[logsize],[logused],[status])
EXECUTE('dbcc sqlperf(logspace)')
select a.*,b.log_reuse_wait_desc from #T a inner join master.sys.databases b
on a.dbname = b.name order by a.logsize desc
drop table #T

如何查看云数据库 SQL Server 数据库中表的大小?

登录 SQL Server 客户端,连接实例,关于如何连接实例,详情请参见 从 Windows 云服务器连接 SQL Server 实例从本地连接 SQL Server 实例。在查询框执行如下 SQL 查询语句(仅供参考),可查看数据中表的大小:
USE [DBname]
GO
CREATE TABLE #Tablespace(
[TableName] [nvarchar](100) NOT NULL,
[Rows] [nvarchar](100) NULL,
[ReservedSize] [nvarchar](100) NULL,
[DataSize] [nvarchar](100) NULL,
[IndexSize] [nvarchar](100) NULL,
[UnusedSiz] [nvarchar](100) NULL )
INSERT INTO #Tablespace EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT * FROM #Tablespace
order by convert(int,replace(DataSize,'KB','')) desc,2 desc
DROP TABLE #Tablespace

云数据库 SQL Server 如何回收表空间?

云数据库 SQL Server 可通过收缩所有数据库文件来释放未使用的空间,详见 收缩数据库

云数据库 SQL Server 实例短时间内大量压入数据导致数据盘空间暴增的规避方法?

在双节点(原高可用版/集群版)的主备实例中,大量压入数据可能会导致主备实例间来不及同步,从而无法对日志进行截断收缩,最终使得数据盘空间暴增。建议在压入数据时,适当停止一段时间,等待数据的同步,分批进行。

怎么解决云数据库 SQLServer 查询运行缓慢的问题?

您可以通过以下几种方式进行解决:
1. 通过查看慢 SQL 日志来确定是否存在运行缓慢的 SQL 查询以及各个查询的性能特征,从而定位查询运行缓慢的原因。登录 SQL Server 控制台,在实例列表,单击实例 ID,进入慢查询日志页 查询和下载慢查询日志。 云数据库 SQL Server 也可以通过查询 DMV 视图,从而定位查询运行缓慢的原因。
2. 查看 CPU 使用率指标,协助定位问题。具体可参考 查看监控指标
3. 创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。
4. 多表关联查询时,关联字段要加上索引。
5. 尽量避免用 select* 语句进行全表扫描,可指定字段或者添加 where 条件。

云数据库 SQL Server CPU 使用率高问题如何排查?

引起实例 CPU 使用率升高的原因有:
1. 业务 SQL 不合理。有大量的 IO 读和逻辑计算(如:大量的编译和重编译,大量的排序和聚合操作,大量的表连接操作等)。 现象:存在慢查询,QPS 和 CPU 使用率曲线变化不吻合,检查消耗 CPU 的语句,存在 I/O 较大的语句。 排查与处理方法:通过下面的查询语句(或活动监视器里面的监控记录),结合慢查询定位到慢sql并进行分析优化。(建议:表上创建索引,语句尽量用到索引。SSMS 分析语句的实际执行计划,执行计划分析中也会给出一些优化建议,可以结合具体的业务进行优化。)
--查询实时会话CPU使用
SELECT C.text,DB_NAME(A.dbid) dbname,A.loginame,A.* FROM sys.sysprocesses A
CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) C
where status in ('runnable','suspended')
order by cpu desc
--查询CPU占用前20会话sql
SELECT TOP 20
total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)],
max_worker_time /1000 AS [最大执行时间(ms)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(CASE WHEN qs.statement_end_offset = -1
THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
AS [使用CPU的语法], qt.text [完整语法],
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
--ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC --(平均耗CPU最多的前20个SQL)
--ORDER BY total_worker_time DESC --(总耗CPU最多的前个SQL)
2. 实例的并行度设置的不合理。 现象:查询实例的当前会话可发现大量的同一个会话阻塞。等待类型为 CXPACKET。 说明:CXPACKET 指线程正在等待彼此完成并行处理。一般而言,CXPACKET 等待类型对于 SQL Server 是正常的,它指示 SQL Server 在执行查询时使用并行计划,与在串行化过程中执行的查询相比,它通常更快。 使用并行计划时,查询将在多个线程中执行,并且仅当所有并行线程都完成后,查询才能继续。这意味着查询将与最慢的线程一样快。但是当遇到简单查询并行度过高或者复杂查询的并行线程处理的数据包不均衡,就会出现不合理的并行执行计划或多个线程等待某个比较慢的线程造成 CXPACKET 等待。 排查与处理方法:
SELECT C.text,DB_NAME(A.dbid) dbname,A.loginame,A. wait_type,A.* FROM sys.sysprocesses A
CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) C
where spid in (select SPID from sys.sysprocesses where blocked <> 0 )
语句级别设置。通过实时查询或慢日志找到消耗大的语句 指定 OPTION ( MAXDOP 1 ) 取消并行处理。 例:SELECT * FROM TABLE WHERE L1='******' OPTION ( MAXDOP 1 )
从实例级别设置。查询当前实例的 MAXDOP 值 select * from sys.configurations where name like '%max%';

修改方法:可以在控制台参数配置中进行修改。

3. 业务高并发导致实例负载升高。 现象:可以通过监控明显看到实例的请求数,连接数和 CPU 使用率变化吻合。 处理方法:这类问题主要由于大量的请求导致,可以从优化业务逻辑减少每次请求的时间和提升实例规格两方面进行优化。

云数据库 SQL Server 如何查看当前连接以及其执行的 SQL?

登录 SQL Server 客户端,连接实例,关于如何连接实例,详情请参见 从 Windows 云服务器连接 SQL Server 实例从本地连接 SQL Server 实例
1. 通过 sys.sysprocesses 和 sys.dm_exec_sql_text 视图查询当前的连接和执行的 SQL。
SELECT C.text,DB_NAME(A.dbid) dbname,A.* FROM sys.sysprocesses A
CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) C
--where spid =
2. 通过 sys.sysprocesses 查询当前所有的连接。
DBCC INPUTBUFFER(spid)
SELECT * FROM sys.sysprocesses;
之后使用 DBCC 或者 sys.dm_exec_input_buffer 查询连接的具体 SQL。
DBCC INPUTBUFFER(spid)
SELECT * FROM sys.dm_exec_input_buffer(session_id, request_id);

云数据库 SQL Server 阻塞问题如何分析与处理?

问题现象:当您的业务经常出现运行缓慢但是实际的 SQL 单独执行却很快的时候,您的数据库中很大概率是出现了阻塞导致 SQL 执行变慢。 问题原因:阻塞出现的原因是有其他事物正在对请求的资源进行读写操作,当前的 SQL 操作需要等待其他事物释放资源锁才能继续进行读写操作。当出现等待的时候就会使业务端出现执行变慢的情况。 排查方法:
1. 通过 sys.sysprocesses 系统视图获取当前阻塞的相关会话。(blocked 为阻塞源的 spid,waitresource 为被阻塞的 session 等待的资源)。
select * from sys.sysprocesses where blocked <> 0
SELECT C.text,DB_NAME(A.dbid) dbname,A.loginame,A.* FROM sys.sysprocesses A
CROSS APPLY sys.dm_exec_sql_text(A.sql_handle) C
where spid in (select SPID from sys.sysprocesses where blocked <> 0 )
说明:
有时 sys.dm_exec_sql_text 可能获取不到具体的 SQL 文本,可以通过前面的 SQL 查询到阻塞的源和被阻塞的 spid。使用 DBCC 或者 sys.dm_exec_input_buffer 查询具体的 SQL。
2. 开启阻塞跟踪获取详细的阻塞信息,请参见 开启采集阻塞事件及死锁事件
优化建议:
2.1 如果阻塞已经影响到了业务可以及时 kill 阻塞的会话(kill spid)。
2.2 查看阻塞源是否为未提交的事物,若是请及时提交。
2.3 通过上面排查过程中查到的阻塞源 SQL。对相关的 SQL 和业务逻辑进行分析优化。(例如:阻塞源 SQL 执行时间很长可以分析执行计划看是否可以优化。业务逻辑是否合理,尽量保证资源的按顺序访问避免阻塞以及死锁)。
2.4 如果出现 select 的阻塞可以使用 with nolock 这个查询 hint,让查询语句避免申请锁,从而避免阻塞。(例如:select * from table with(nolock);)。