‘壹’ mysql 如何分配内存
我们仍然使用两个会话,一个会话 run,用于运行主 SQL;另一个会话 ps,用于进行 performance_schema 的观察:
主会话线程号为 29,
可以看到写入的线程是 page_clean_thread,是一个刷脏操作,这样就能理解数据为什么是慢慢写入的。
也可以看到每个 IO 操作的大小是 16K,也就是刷数据页的操作。
结论:
我们可以看到,
1. MySQL 会基本遵守 max_heap_table_size 的设定,在内存不够用时,直接将表转到磁盘上存储。
2. 由于引擎不同(内存中表引擎为 heap,磁盘中表引擎则跟随 internal_tmp_disk_storage_engine 的配置),本次实验写磁盘的数据量和实验 05中使用内存的数据量不同。
3. 如果临时表要使用磁盘,表引擎配置为 InnoDB,那么即使临时表在一个时间很短的 SQL 中使用,且使用后即释放,释放后也会刷脏页到磁盘中,消耗部分 IO。
‘贰’ 如何设置SQL服务器的内存分配
步骤如下:
点击Start > Run
键入WINMSD。
选择Memory选项。
记录下来计算的一个内存值物理存储器(k) SQL数据库的。
初始化SQL企业管理器。
选择为存储器分配将配置的数据库。
用鼠标右键单击在数据库并且选择配置。Server Configuration Options窗口打开。
选择Configuration选项。
移下来对内存行。有三列:“最低、最大数量、运行和当前内存分配”。
‘叁’ 如何使用SQL语句查询数据库及表的空间容量
--1、查看表空间的名称及大小
select
t.tablespace_name,
round(sum(bytes/(1024*1024)),0)
ts_size
from
dba_tablespaces
t,
dba_data_files
d
where
t.tablespace_name
=
d.tablespace_name
group
by
t.tablespace_name;
--2、查看表空间物理文件的名称及大小
select
tablespace_name,
file_id,
file_name,
round(bytes/(1024*1024),0)
total_space
from
dba_data_files
order
by
tablespace_name;
3.查看所有表空间使用情况
select
b.file_id
文件ID号,
b.tablespace_name
表空间名,
b.bytes/1024/1024||'M'字节数,
(b.bytes-sum(nvl(a.bytes,0)))/1024/1024||'M'
已使用,
sum(nvl(a.bytes,0))/1024/1024||'M'
剩余空间,
round(100
-
sum(nvl(a.bytes,0))/(b.bytes)*100,2)||
'%'
占用百分比
from
dba_free_space
a,dba_data_files
b
where
a.file_id=b.file_id
group
by
b.tablespace_name,b.file_id,b.bytes
order
by
b.file_id;
总有一款适合你!
‘肆’ SQL分配空间不足,请教如何解决
因SQL备份文件大小并不代表还原出来的数据库文件大小。有时候日志文件很大,其中大部分都是未使用的空间,而没有进行收缩就进行备份的话,备份文件中记录的还是日志文件的大小,在还原的时候就还是很大。你可以执行restore filelistonly来查看备份中文件的大小。比如你的备份文件是d:\db.bak,语句就是restore filelistonly from disk='d:\db.bak'在结果集中,size是文件的字节数。如果很大,最好还原到有足够空间的分区,注意要加move选项。
‘伍’ SQLServer中能手动给使用的表分配内存吗如果可以,如何分配
不能,SQL Server的内存分配是SQL引擎自动分配的,我们只能更改最大值最小值。
在服务器属性里改。
SQL Server占用的内存主要由三部分组成:
数据缓存(Data Buffer)、执行缓存(Procere Cache)、以及SQL Server引擎程序。
其中引擎程序占用的缓存比较固定,也是必须占用的一部分。除此之外,执行缓存是执行的语句解析后存储的地方,而数据缓存则是查询结果等缓存的地方。这两个部分是动态调整的,都不是用户可以支配的。
‘陆’ sql 备注的一列 长度定义 nvarchar(max)合适吗 数据库是怎么分配空间的
没问题,varchar和nvarchar是不定长的,数据库会根据存放的实际字节分配长度的,不会直接分配4000字节。除了存放英文字母的时候会占用两个字节,有点浪费。
char和nchar是定长的,不够的部分会自动补齐,分配指定字节长度的空间
‘柒’ 关于sql server数据库分配空间的问题
哈哈,居然有这样的问题,我都从来没有遇到过。可能数据库严重超过你原来注册的限制容量2048,你先把数据库收缩一下,然后再试一下扩容吧。
要是还不行,把数据分离了,然后再附加上去,呵呵。
‘捌’ SqlServer是如何管理,分配存储空间的呢
Sql Server 区管理(GAM,SGAM)
大家都知道Sql Server 中数据文件存储的最小单位是页面(Page),但实际SQLSERVE并不是以页面为单位给数据分配空间的,Sql Server默认的存储分配单位是盘区(Extend)。这样做的主要原因是为了避免频繁的读写IO,提升性能。在表或其它对象分配存储空间,不是直接分配一个8K的页面,而是以一个盘区(Extend)为存储分配单位,一个盘区为8个页面(Size = 8*8K=64K)。
这样,对区得操作就会非常频繁,也要求Sql Server有自己的一套系统管理着数量众多的区。其中最突出的出一个问题,那就是在存储那些只有少量数据,不足8K的对象,如果也是分配给一个盘区,就会存在存储空间上的浪费,降低了空间分配效率。
为解决上述问题,SQLSERVER提供了一种解决方案,定义了两种盘区类型,统一盘区和混合盘区。
全局分配映射表 (GAM):统一盘区,GAM 页记录已分配的区。每个 GAM 包含 64,000 个区,相当于近 4 GB 的数据。GAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区可用;如果位为 0,则区已分配。
共享全局分配映射表 (SGAM):由多个对象共同拥有该盘区,SGAM 页记录当前用作混合区且至少有一个未使用的页的区。每个 SGAM 包含 64,000 个区,相当于近 4 GB 的数据。SGAM 用一个位来表示所涵盖区间内的每个区的状态。如果位为 1,则区正用作混合区且有可用页。如果位为 0,则区未用作混合区,或者虽然用作混合区但其所有页均在使用中。
在实际为对象分配存储盘区时,为了提高空间利用率,默认的情况下,如果一个对象一开始大小小于8个页面,就尽量放在混合盘区中,如果该对象大小增加到8个页面后,SQLSERVER会为这个对象重新分配一个统一盘区。
据区当前的使用情况,GAM 和 SGAM 中每个区具有以下位模式:
第0个bit为保留字节,始终为0
第1个bit表示该页面是否已分配,我们知道GAM页用来管理区是否已分配,但一个区包含8个页面,所以用该bit用来准确定位该区的某个页面是否已分配出去了。
第2个bit表示该页面是否混合分区的一个页面。
第3个bit表示该页面是否是一个IAM(索引分配映射)页面。
第4个bit表示该页面中是否包含幻影或已删除记录,这有助于SQL Server定期清理幻影或已删除记录。
第5~7个页面表示该页面的空间使用率情况。
‘玖’ SQL数据库怎么为每个用户分配不同的空间
在UserTB里加多一个字段[user]存放在User里的用户名,然后用筛选where [user]='A' --如果是A用户,其它用户类似
或是用筛选建立视图也行
‘拾’ sql 2000数据库文件可分配空间最大可为多少
跟操作系统对文件的管理有关,fat32最大4G,fnt为硬盘剩余空间。