从 MySQL 5.1 开始,数据不再需要完全在内存中。
我读过索引列(我认为整个索引结构)必须仍在内存中(MySQL High Availability,2010,第 533 页,“MySQL Cluster 将所有索引列保留在主内存中”)。
鉴于此,如果没有足够的内存(即,一个巨大的数据库(> 100GB 或 1TB),在具有低内存配置的服务器上运行(例如,2 个数据节点,每个节点具有 1GB 的 RAM))会发生什么情况?
我需要进行大量的统计分析才能向用户提供一些数据。目前,我从 mysql 捕获数据并通过PHP数组处理它们。但是,mysql 临时表要好得多(比 PHP 数组效率更高、速度更快;显然是由于它们的机制)。
我的暂定解决方案是在每次请求(即连接)时形成一个临时表来导入和处理数据。但是,我不确定同时创建多个临时表是否有缺点?
这会给mysql服务器带来问题吗?或者我可以在众多同时请求中使用它作为 PHP 数组的替代方案?
我决定减少本地开发人员实例的内存分配,并被告知以下命令完成了这项工作;
alter system set memory_max_target = 512M scope = spfile;
Run Code Online (Sandbox Code Playgroud)
我猜是这样,因为我无法再启动有问题的 Oracle 实例。这是我尝试以非 DBA 用户身份连接时遇到的错误;
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Run Code Online (Sandbox Code Playgroud)
以 SYSDBA 身份连接时,我得到以下信息;
Connected to an inactive instance.
SQL>startup nomount;
ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET
SQL>alter system set memory_max_target = 2G scope = spfile;
ORA-01034: ORACLE not available
Run Code Online (Sandbox Code Playgroud)
(“连接到非活动实例。”是我对本地化错误消息的翻译,可能不完全正确) 所以,我处于 catch 22 情况,我无法在不启动的情况下更改内存参数,我可以不启动。
有没有办法离线更改这些参数?
Windows 2008R2 Enterprise 上的 SQL Server 2008 R2 标准版(64 位)
即使在大量使用情况下 - CPU 超过 80% 数分钟
专用 SQL Server
将服务帐户设置为在内存中锁定
这是正常的吗?
我可以测试什么?
我可以让 SQL Server 使用更多内存吗?
在这个用例中,最小内存和最大内存的正确设置是什么?
该服务器有 8GB 内存,双 Intel Xeon 处理器,运行 Windows Server 2008 R2 / Sql Server 2008 标准版。它正在运行多个大小从 30GB 到 5GB 的数据库。
最初将内存使用设置为默认设置(min=0 max=2,147,483,647)。在这些设置中,sqlservr.exe 占用了大部分内存使用量,并且服务器最终需要每天或两天重新启动。一开始它会正常运行,但在一天之内开始在简单的操作上超时,比如使用主键查找记录。
我已经更改了 min=4,096 和 max=6,144。这导致仅使用 1.4GB 内存。但是,现在所有四个 CPU 都以 50-60% 的 CPU 使用率持续运行。尽管服务器要稳定得多,但任务的执行时间大约要长 1/3。
是否可以在正在运行的查询中获取已用内存?
就像是:
mysql> SELECT MEMORY_PEAK as memory; #return memory usage by mysql before run query
mysql> SELECT id FROM table WHERE id>2; #run query
mysql> SELECT MEMORY_PEAK as memory; #return memory usage by mysql after run query
Run Code Online (Sandbox Code Playgroud)
并返回类似(返回 17kb)的内容:
+----------+
| memory |
+----------+
| 20100 |
+----------+
+------+
| id |
+------+
| 3 |
+------+
+----------+
| memory |
+----------+
| 2026767 |
+----------+
Run Code Online (Sandbox Code Playgroud)
或者
mysql> USAGE SELECT id FROM table WHERE id>2;
并返回类似(返回 17kb)的内容:
+---------+
| USAGE …Run Code Online (Sandbox Code Playgroud) I've been running a function on the database that is going into each table, ALTER COLUMN on all columns of a certain data type, and CAST to remove trailing zeros. About 115 tables varying from a few thousand records to a few hundred thousand records. It has been running for almost 24 hours and my approximate calculation until time of completion is about 58 hours.
I have htop up and checking on it regularly.
I should mention this is a …
我有一个带有 5 个实例的生产盒。
版本:SQL Server 2014 SP3 企业版。
我发现即使机器分配了大约 400GB 的内存,所有 5 个实例的组合MAX MEMORY设置也小于 200GB。
实例不会受到内存压力的影响,但是由于我们已经分配了该内存,所以不使用它是一种浪费。
我想将其增加到更高的值,为操作系统保留 10%(某些实例的分配将高于其他实例)。
不过,我以前从来没有对这个设置做过这么大的增加。
我知道这是一个不需要重启的动态设置,但是,我想知道以下几点:
我们没有启用内存设置中的锁定页面,也没有启用跟踪标志 834。
考虑来自 Microsoft SQL 文档页面的以下信息:
SQL Server 数据库引擎优化位列的存储。如果表中有 8 个或更少位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。
请参阅:https : //docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017
所以,如果我创建一个这样的新表:
CREATE TABLE MyTable (
Id int PRIMARY KEY,
Value1 bit,
Value2 bit,
Value3 bit,
Value4 bit,
Value5 bit,
Value6 bit,
Value7 bit,
Value8 bit)
Run Code Online (Sandbox Code Playgroud)
...然后一行中的所有位列(Value1、Value2、...Value8)应占用一个字节。或者?
当我们仔细观察时,一行的 Value1 字段内部可以包含值 0、1 或 NULL。这意味着该字段实际上是三态值或三元值。2 个这样的值可以表示 3*3=9 个值的字典。8 个这样的值是一个包含 6561 个值的字典。
如果我们考虑这样一行的内存占用,8 位应该占用一个字节。这意味着这一字节编码 6561 个值而不是 256 个值。这显然是错误的。
因此,要么 MS SQL 文档具有误导性,要么我们在这里谈论一些量子计算。当然是前者,但我真正想知道的是这个问题的答案:可空位(当然,SQL Server 位默认可以为空)是如何真正存储在 SQL Server 底层结构中的?
我们有一台 256 GB RAM 的机器。
SQL Server 的最大服务器内存设置为 180 GB。
在 180 GB 中,SQL Server 通常使用:
缓冲区高速缓存命中率 - 始终徘徊在 99.9% 以上。
页面预期寿命是相当高的数字。
数据库数据文件的总大小 - 650 GB。
数据增长速度约为每天 500-1500 MB(但是!较旧的数据每 6-8 个月就会删除一次,因此基本上数据文件的增长速度要慢得多)。
需要将SQL Server迁移到另一台机器。当 SQL Server 2022 发布时,就以它为目标。
它是混合 OLTP 和 OLAP 类型的工作负载,许多应用程序使用相同的数据库;大部分 RAM 被缓存的数据库页面使用,这意味着 SQL Server 不必一直从磁盘读取它。
感觉新机器 128 GB 就足够了,最大服务器内存设置为 ~ 110 GB,为操作系统留下 18-13 GB。
目标服务器将位于 Azure VM 中,您无法独立地扩展 …
memory ×10
sql-server ×5
mysql ×3
centos ×1
cpu ×1
hardware ×1
mysql-5.5 ×1
ndbcluster ×1
null ×1
optimization ×1
oracle ×1
oracle-11g ×1
postgresql ×1