SQL Server 2012 中是否有针对数据压缩功能的任何特定增强?
上次我检查 SQL Server 2008 R2 引入了对 Unicode 字符的支持,因此具有NCHAR
数据类型(CLOBS 和 BLOBS 除外)的列现在可以利用 SQL Server 中的压缩技术。
SQL Server 2012 中是否有针对数据压缩功能的任何特定增强?
上次我检查 SQL Server 2008 R2 引入了对 Unicode 字符的支持,因此具有NCHAR
数据类型(CLOBS 和 BLOBS 除外)的列现在可以利用 SQL Server 中的压缩技术。
当尝试使用 T-SQL 以编程方式使用扩展事件时,出于某种原因将 SQL Server 2012 与 SP1 一起使用。我看不到智能感知工作?只是想检查一下这是我的问题还是 MS 尚未支持扩展事件和其他一些事情的智能感知。
无法在SQL Server BOL中找到任何特定于扩展事件智能感知支持的内容
例如,创建一个新的事件会话,没有事件在 SQL Server 的智能感知中弹出?我知道这是 SQL Server 2008 首次引入智能感知的情况。
在具有 64 GB RAM 的服务器上使用带有 SP2 的 SQL 2008 R2。考虑到 SQL Server 仅限于仅与数据库引擎相关的服务,我已将最大服务器内存设置为 58GB。我有一个关于设置最小服务器内存的问题
如果我将最小服务器内存设置为 48 GB,这是否意味着
a) 如果 Windows 向 SQL 发送内存不足通知 - SQL 服务器将修剪其所有池并尝试将内存使用量保持在 48 GB 内存?
b) 在 Windows 进行激进的工作集修剪的情况下——它会将 SQL 服务器的内存使用量保留为 48 GB,从而为 SQL 的内存使用量设置一个“下限”。
c) 对最小服务器内存有什么建议吗?
搜索网络——互联网上有大量关于最大服务器内存的信息,但我读过的只有几个地方(Brent Ozar 博客的配置最佳实践)将最小服务器内存设置为服务器上总可用 RAM 的 50%。
我有点好奇,具有 128 GB 数据库 RAM 大小的 SQL 2012 企业版之一是 370 GB 并且还在增长,锁 (OBJECTSTORE_LOCK_Manager) 内存管理员使用的内存量显示为 7466016 KB。我还可以通过查看 perf counter 来确认select * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'
但是,当我运行查询
select count(*) from sys.dm_tran_locks
它仅显示 16 个锁。那么什么是使用超过 7 GB 的锁。有没有办法找出来?
这是否意味着一旦为锁分配了内存,SQL 还没有释放它?在过去的 1 小时内,我没有看到超过 500 的锁计数,但锁内存保持不变。
最大服务器内存为 106 GB,我们不使用内存中的锁定页面,并且在过去 12 小时内我没有看到任何内存压力或错误日志中的任何错误。可用 MBytes 计数器显示超过 15 GB 的可用内存。
活动监视器始终显示 0 个等待任务,因此显然没有阻塞。
考虑到 SQL 服务器锁需要大约 100 字节的内存 7 GB 是很多内存并试图找出谁在使用它。
我运行服务器仪表板按锁计数报告顶级事务,它说“当前系统上没有运行任何锁定事务。但是,锁内存仍然如上所述显示。数据库在夜间最忙。
SQL Server 中 MPA(多页分配)的使用者是什么?
我知道数据页总是 8K。是否存在数据/索引页面使用 MPA 的情况?执行计划可以使用 MPA 是有道理的,因为它们可以超过 8 KB。
这里有一个博客建议使用 MPA,但它指的是存储过程(一个有 500 个参数的过程)。在随附的屏幕截图中,我看到一个使用大约 11 MB 的执行计划;这使用 MPA 吗?有没有办法确认执行计划的内存分配是使用多页分配?
我的困惑是实际使用 MPA(多页分配器)。我发布的链接中的示例显示了一个复杂的执行计划,它将需要超过 8 KB 的连续分配。
下面的答案表明有很多东西可以使用 MPA 的链接服务器或扩展存储过程。出于某种原因,我不能同意。例如,扩展存储过程可以是使用 HeapAlloc 的 C++ 代码,SQL 服务器几乎无法控制它来管理其内存(它必须在 Windows 操作系统级别)。
即使在 SQL 2012 中,扩展存储过程仍然会消耗缓冲池之外的内存,因此它与多页分配无关。这同样适用于链接服务器,特别是如果您使用第三方提供商(例如 ORACLE)。
我对这个主题的了解表明 perf counter SQL Server:Memory Manager: Total Server Memory 只为您提供缓冲池内存。在名为 sys.dm_os_process_memor 的 DMV 中有一个名为 physical_memory_in_use 的列,它为您提供物理工作集。
但我不确定...
是否有 DMV 或性能计数器可以告诉我 SQL Server 进程在 64 位 Windows 操作系统上运行的 64 位 SQL Server 2008 R2 和 SQL 2012 使用的总物理内存(缓冲池 + 非缓冲池,即 MemToLeave)?
在 SQL 2008 R2 中,我将更新一个将影响 2500 万行的表,该表当前正在复制(事务复制)。为了尽量减少对复制的影响,我可以创建一个存储过程,将更新语句包装在存储过程中并添加这个存储过程进行复制吗?
通过在执行存储过程时执行此操作,它将复制存储过程的执行。我的问题是 SQL 服务器如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的基础表数据(即实际复制 2500 万条更新语句)?
我试图了解在哪里为 SQL Server 2012 中引入的间接检查点画一条细线。
根据我的理解
SQL Server 会设置检查点以将脏页刷新到磁盘,但检查点之间的频率或时间间隔取决于许多因素。它由称为恢复间隔的服务器级别配置控制,此设置的默认值为零,这意味着在相当繁忙的系统中,SQL 服务器可以每分钟执行一次检查点,并且可以导致数据库恢复时间少于一分钟。
SQL Server 2012 引入了间接检查点——这反过来又可以让您控制单个数据库的恢复间隔。
在较高级别上,此设置似乎是一件好事,它允许通过执行更频繁的检查点而不是执行可能导致底层 IO 子系统泛滥的定期检查点来平衡磁盘 IO
现在我的问题是
a) 间接检查点是否考虑了脏缓冲区的数量而不是通常自动检查点使用的事务的数量?
b) 我一直在许多博客中发现间接检查点设置非常危险,因为
它会使您的 IO 系统非常繁忙。上述博客中的以下陈述是否属实?
Checkpoint 通常在单次写入操作中将大块数据最佳地写入磁盘,最大可达 256KB,具体取决于缓存中需要刷新到磁盘的连续脏页的数量。一旦通过将目标恢复时间设置为非零值来打开间接检查点功能,检查点写入将变成单页写入,8KB 写入。
c) 间接检查点设置是否更适合数据仓库与 OLTP 类型的工作负载?在开始利用间接检查点之前,您会考虑哪些 SQL 数据库场景?
使用在 Windows Server 2008 R2 SP1 上运行的 SQL Server 2012 Enterprise Edition SP1 对于 SQLOS 上的每个逻辑处理器内核,都有一个分配给它的调度程序。这些调度器可以被视为状态“在线可见”sys.dm_os_schedulers
工作线程(任务)可以在调度程序上运行,并且这些线程(任务)可以具有各种状态,例如基于等待队列
a) 挂起在等待资源可用的队列中
b) 可运行队列(主要是 FIFO,除非由 Resource Governor 控制)或
c) 当前在调度程序上运行。
我的问题是,例如一个任务(SELECT
在这种情况下是查询)首先进入调度程序(我们称之为调度程序 A),但发现它必须等到页面被带入内存(IO 操作),它现在被放入等待队列在挂起状态下,一旦 IO 完成,特定工作线程(任务)就会收到信号,并按照到达该队列的顺序放入可运行队列。
任务是否总是必须转到调度程序A以完成其量程,或者它可以切换其上下文并且现在可以在没有可运行任务的任何空闲调度程序(我们称之为调度程序B)上运行?如果有上下文切换,它的作用是什么?
我有一个在 SQL 2008 R2 企业版上运行的 OLTP SQL 数据库,它在投入生产后的几个月内可能相当繁忙(5000 批/秒)。查看服务器配置我对设置 MAXDOP 有疑问,但是现在我发现作为该论坛的普通读者普遍共识是对于需要并行操作的任务(例如索引重建和更改成本阈值)将服务器范围的 MAXDOP 设置保留为 0并行度到更高的数量(15 或 20 而不是默认的 5)。
但是,此服务器具有 NUMA 节点并基于这些 MS 支持文章 http://support.microsoft.com/kb/329204
http://support.microsoft.com/kb/2023536
为防止代价高昂的外部内存访问,建议设置 MAXDOP = 物理处理器中的内核数。
此服务器有 2 个物理处理器,每个插槽上有 16 个逻辑(8 个物理)内核。该MS支持KB建议的指南是否仍然有效?
我知道一切都需要尝试和测试,但我的目标是将 MAXDOP 设置为最佳理论值,并在以后需要时进行调整。基于它我应该将 MAXDOP 设置设置为 8 吗?
我对术语有点困惑,因为包括BOL在内的 Microsoft SQL Server 官方文档指的是您使用 sp_create_plan_guide proc 创建的计划指南。计划冻结是一样的还是略有不同?在这里阅读 Erland 的精彩文章
有两种设置计划指南的方法,一种是通用方法,另一种是快捷方式,也称为计划冻结。通用计划指南是在 SQL 2005 中引入的,而计划冻结是在 SQL 2008 中添加的。
我正在阅读计划冻结是当您使用sp_create_plan_guide_from_handle创建指南时
寻求对所用术语的澄清,计划指南和计划冻结是同一回事,还是它们指的是将执行计划粘贴在缓存中的方式略有不同?
当事务日志截断已多次排队但由于某些原因(可能是打开的事务、复制、当前正在运行完整备份)无法截断日志时,有什么方法可以主动通知 DBA。
考虑到客户端应用程序使用 BEGIN TRAN 启动事务并执行大量更新的场景,它未能在设定时间内获取必要的锁(因为另一个事务正在阻塞)并且超时(在 .net commandtimeout 中设置为默认 30秒并且在客户端应用程序中没有错误处理)并在 SQL Server 上留下一个打开的事务,这反过来防止日志截断。现在每次运行日志备份时,它都无法截断日志,因为您有一个打开的(已处理的)事务。我承认我们可以通过多种方式订阅日志增长事件,但想知道是否有内置于 SQL Server 中的东西在日志截断已多次排队但无法截断时发出通知。
根据 Christian Bolton、Brent Ozar 等人关于 SQL Server 2008 Internals and Troubleshooting(从伊利诺伊州当地图书馆借来)的阅读书籍。我试图在 SQL Server 上寻求理解和确认,并在网络上进行大量搜索,如果有人我将不胜感激可以确认或更正我的理解。
每个需要查询内存授权的查询或操作都需要工作空间内存。在使用排序、哈希匹配连接、并行(不确定)、批量插入(不确定)、索引重建等的一般查询中,将需要查询工作区内存。
工作区内存是 SQL Server 缓冲池的一部分(它作为缓冲池的一部分分配),最大工作区内存是分配给缓冲池的内存的 75%。默认情况下,单个查询不能获得超过 25% 的工作区内存(在 SQL 2008/SQL 2012 中 - 由开箱即用的资源调控器默认工作负载组控制)。
寻求确认我的理解
1)考虑具有 48 GB RAM 和最大服务器内存配置为 40 GB 的系统,这是否意味着最大工作空间内存限制为 30 GB,并且单个查询无法获得超过 10 GB 的工作空间内存(查询内存)。因此,如果您有一个错误的查询正在处理 10 亿行正在执行大规模哈希联接并且需要超过 10 GB 的内存(工作空间内存),它甚至会关心通过这个内存授予队列还是立即溢出到磁盘?
2) 如果执行大规模排序操作的查询已分配 5 MB 的工作空间内存,并且在查询执行期间,如果查询优化器意识到由于统计信息错误或缺少索引,该查询实际上需要30 MB的工作空间内存将立即溢出到 tempdb。即使系统在执行期间有大量可用的工作空间内存,一旦查询在执行期间超过了授予的工作空间内存,它也必须溢出到磁盘。我的理解正确吗?
在运行 SQL Server 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能的影响有多大。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)保留为默认的 4 KB 而不是 64 KB。SQL 服务器已安装。
是否值得痛苦——卸载 SQL——用 64 KB 集群大小格式化驱动器并重新安装 SQL 服务器?
可能重复:
SQL Server 备份是单线程还是多线程?
SQL Server 是否为每个备份设备(备份文件)使用单独的编写器线程,或者仅当您跨多个备份卷(驱动器号、LUN 或安装点)对备份进行条带化时才使用单独的线程?
例如,我们在这里获得三个写入线程还是
backup database dbName to DISK = 'D:\file1.bak',
DISK = 'D:\file2.bak',
DISK = 'D:\file3.bak'
或以下加快备份速度,因为您正在写入不同的卷
backup database dbName to DISK = 'D:\file1.bak',
DISK = 'E:\file2.bak',
DISK = 'F:\file3.bak'
在上面每个盘符是一个单独的 IO 路径。我了解 IO 吞吐量对于备份速度也非常重要。
我们有几个 SQL 2005 实例正在被虚拟化并升级到运行 VMWare vSphere 5.1 的 SQL 2008 R2。
我们的 VMWare 管理员告诉我,在我们的组织中,他们不会为来宾过度分配内存。根据他的说法,尽管 VMWare 建议为在虚拟机上运行的 SQL 服务器启用“内存中的锁定页面”。
是否为在虚拟机上运行的 SQL Server 启用了“内存中的锁定页面”?
在传统的 SQL Server 集群中,当发生故障转移时,连接到 SQL Server 故障实例的所有客户端都会失去连接,并且每个客户端都必须重新建立与故障转移集群实例的新连接。
AlwaysON 可用性组是否缓解了这个问题?SQL Server 2012 AlwaysON 可用性组的故障转移对连接到 SQL Server 的客户端是否透明?
在 SQL Server 2008 R2 安装过程中,我看到“客户端工具连接”和“客户端工具向后兼容性”安装选项的复选框。它说这些是客户端服务器通信的组件。谁能解释这些组件是什么?当您选择这些组件时,实际安装在服务器上的是什么。
从 SQL Server 2005 和所有更高版本开始,企业版包括一个称为“快速恢复”的功能。
a) 快速恢复是否使用多个操作系统线程来执行“重做”操作?
b) SQL Server 是并行写入事务日志并产生多个线程,还是日志是按顺序写入的,因此只有一个线程用于写入事务日志?
工作区内存(缓冲池的一部分)是否仅限于 Hash Join、Sort 等?
如果我有一个确实使用嵌套循环连接(没有排序或散列)的查询,它不会使用工作区内存吗?
返回 100 行的简单查询的工作表将在哪里创建?在 Tempdb..