我试图INSERT...SELECT用 JDBC 在 MySQL 中执行一个相当大的,我得到以下异常:
Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
Run Code Online (Sandbox Code Playgroud)
由于我实际上并没有返回 ResultSet 对象,因此我认为 Java 堆空间应该不是问题。但是,无论如何我都试图提高它,但没有任何好处。然后我尝试在 MySQL Workbench 中执行该语句,我得到了基本相同的结果:
Error Code 5: Out of memory (Needed 1073741816 bytes)
Run Code Online (Sandbox Code Playgroud)
我应该有足够的 RAM 来完成这些操作(足以容纳我从中选择的整个表格),但我猜我需要调整各种设置以利用我的所有内存。我正在使用Windows Server 2008 AMI运行 Amazon EC2高内存双超大实例。我尝试摆弄 my.ini 文件以使用更好的设置,但据我所知,我可能会让事情变得更糟。这是该文件的转储:
[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M …Run Code Online (Sandbox Code Playgroud) 我很好奇 SQL Server 的缓冲池如何受到压缩数据表的影响。
内存中的数据是像在磁盘上一样被压缩,还是完全解压?
如果数据被压缩存储在缓冲池中,那么在执行语句时,给定时间内存中保存了多少瞬时解压数据;一行/页、整个表(假设有足够的空闲页来保存数据),还是“视情况而定”?
我在本地计算机上安装了 SQL Server 沙箱。我已将 SQL Server 实例可以使用的内存设置为 1000 mb。运行密集操作时,内存使用量上升到 1000 mb。当操作结束时,SQL Server 仍然持有内存。如何释放这个内存预留?
有没有办法找出表在 SQL Server(2005 及更高版本)中占用了多少内存?
例如,假设我有一个包含 3000 万条记录的表。我想知道当前缓冲区缓存中有多少属于该表的页面,包括索引、数据和文本/图像页面。
我找到了 Pinal Dave 的这个查询,但似乎这个查询只返回由索引分配的页面(无论是集群的还是非集群的)。
设置:
该服务器用于 ETL 处理。我们刚刚在此服务器中安装了更多 RAM,总共 240GB RAM。SQL Server 服务是唯一真正运行的东西。
内存在 BIOS、OpenManage 和 Windows 中显示良好。
如果我将 SQL Server 配置为使用 70/100GB 的最小/最大内存,我们没有问题。但是,一旦我将其增加到 120/150GB,当我运行我们的 ETL 进程之一时,我会收到以下错误:
无法为数据库 'tempdb' 中的对象 '<临时系统对象:422234507706368>' 分配空间,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。(消息 1105,状态 2,过程未知,第 1 行)
在更改内存配置之前,我们从未遇到过这个问题。重新配置回原来的70/100GB后,我们没有收到这个错误。
我尝试过的事情:
我不知道是什么导致了这个问题。
我已经在环境中的几个 SQL Server 实例上安装了监控软件。我试图找到瓶颈并解决一些性能问题。我想知道某些服务器是否需要更多内存。
我对一个计数器感兴趣:页面预期寿命。在每台机器上看起来都不一样。为什么在某些情况下它会经常更改,这意味着什么?
请查看上周在几台不同机器上收集的数据。你能对每个实例说些什么?
大量使用的生产实例(1):

适度使用的生产环境 (2)

很少使用的测试实例(3)

大量使用的生产实例 (4)

适度使用的测试实例(5)

大量使用的数据仓库 (6)

编辑:我为所有这些服务器添加了 SELECT @@VERSION 的输出:
Instance 1: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Instance 2: Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
Oct 19 2012 13:38:57
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: …Run Code Online (Sandbox Code Playgroud) sql-server memory sql-server-2008-r2 sql-server-2012 page-life-expectancy
我想使用Oracle的自动内存管理,限制在4GB左右。(过去的经验表明,这对于我的开发 PC 来说已经足够了,而且比这更容易了解任何性能问题。)
我相信这些是要遵循的说明:
简而言之,要启用自动内存管理,请设置 memory_target 和(可选)memory_max_target。前一个参数应该是一个动态值,后者是一个更难的限制,只能在停止/启动数据库时更改。
我将这些设置为 sysdba:
SQL> alter system set memory_target = 4G scope = spfile;
System altered.
SQL> alter system set memory_max_target = 8G scope = spfile;
System altered.
Run Code Online (Sandbox Code Playgroud)
并检查值
SQL> show parameter target;
Run Code Online (Sandbox Code Playgroud)
范围可以只是当前正常运行时间的“内存”、“spfile”或“两者”;我选择 spfile,因为我将重新启动:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
Run Code Online (Sandbox Code Playgroud)
然而,这太简单了:
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 13104M
Run Code Online (Sandbox Code Playgroud)
恢复并不难,但在我看来,如何通过内存调整也不是很明显,所以我将在下面发布我所做的事情,高级海报可以纠正/粉碎我。无论哪种情况,我都认为将它放在一个地方很好。
我在以下服务器上安装了 2 个 sql server 和 SSIS 实例。
请注意 RAM 量接近 384 GB
这是我应用于 2 个实例的最大和最小内存设置。我假设两个实例将使用相同数量的资源,如果真的是这样,184,320 MB 也就是 180 GB 是设置内存的一个很好的起始数字?
我会为 SSIS 分配多少内存?
我从 System Center Operations Manager (SCOM) 收到错误消息。
如何解决这个错误?
SQL DB 2012 Engine Stolen Server Memory 过高。
我运行查询并得到这个计数器:
???????????????????????????????????????????????
? Stolen Server Memory (MB) ? 7354.773437 ?
? Lock Memory (MB) ? 106.195312 ?
? Free Memory (MB) ? 64.632812 ?
? Connection Memory (MB) ? 24.203125 ?
? Log Pool Memory (MB) ? 14.085937 ?
? Optimizer Memory (MB) ? 2.351562 ?
? Granted Workspace Memory (MB) ? 1.296875 ?
? Cursor memory usage ? 0.000000 ?
? Cursor memory …Run Code Online (Sandbox Code Playgroud) 我最近将最大内存从默认(无限制)降低到 20 GB。这会清除计划缓存中最旧的查询吗?
memory ×10
sql-server ×8
cache ×1
compression ×1
jdbc ×1
mysql ×1
oracle-12c ×1
plan-cache ×1
ssis ×1
ssis-2014 ×1
windows ×1