虽然索引重建至少需要与当前索引索引相同的数据文件空间量(因为将创建索引的副本)
我对与重组相关的 SQL Server BOL 的阅读只涉及叶级,并且只需要一个 8KB 的页面,
任何人都可以用简单的技术术语解释重组是如何工作的(内部机制)..?
当查询或存储过程的执行计划大于 8000 字节时,它将使用 MPA(多页分配器),而不是使用缓冲池中的计划缓存,它使用缓冲池外的内存。此行为在 SQL 2012 中有所更改,并且 MPA 和 SPA 是缓冲池的一部分。但我使用的是 SQL 2008 R2 标准版。
多页分配是否意味着将一次分配两个或更多 8K 页或将分配大小大于 8K 的页以保存查询的执行计划?
我对术语有点困惑,因为包括BOL在内的官方 Microsoft SQL Server 文档指的是您使用 sp_create_plan_guide proc 创建的计划指南。计划冻结是相同的还是略有不同?在这里阅读 Erland 的精彩文章
有两种设置计划指南的方法,一种是通用方法,另一种是快捷方式,也称为计划冻结。SQL 2005 中引入了一般计划指南,而 SQL 2008 中添加了计划冻结。
我正在阅读计划冻结是当您使用sp_create_plan_guide_from_handle创建指南时
寻求对所用术语的澄清,计划指南和计划冻结是一回事还是指将执行计划粘贴在缓存中的方式略有不同?
我对这个主题的了解表明 perf counter SQL Server:Memory Manager: Total Server Memory 只给你缓冲池内存。在名为 sys.dm_os_process_memor 的 DMV 中有一个名为 physical_memory_in_use 的列,它为您提供物理工作集。
但我不确定...
是否有 DMV 或性能计数器可以告诉我在 64 位 Windows 操作系统上运行的 64 位 SQL Server 2008 R2 和 SQL 2012 的 SQL Server 进程使用的总物理内存(缓冲池 + 非缓冲池,即 MemToLeave)?
sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012
SQL Server 中 MPA(多页分配)的使用者是什么?
我知道数据页总是 8K。是否存在数据/索引页使用 MPA 的情况?执行计划可以使用 MPA 是有道理的,因为它们可以超过 8 KB。
有一个博客这里是建议使用MPA,但它指的是存储过程(一个500个参数)。在附加的屏幕截图中,我看到一个使用大约 11 MB 的执行计划;这使用 MPA 吗?有没有办法确认执行计划的内存分配正在使用多页分配?

我的困惑是实际使用 MPA(多页分配器)的原因。我发布的链接中的示例显示了一个复杂的执行计划,它将需要超过 8 KB 的连续分配。
下面的答案表明有很多东西可以使用 MPA,例如链接服务器或扩展存储过程。出于某种原因,我不能同意。例如,扩展存储过程可以是使用 HeapAlloc 的 C++ 代码,SQL 服务器几乎无法控制它来管理其内存(它必须在 Windows 操作系统级别)。
即使在 SQL 2012 中,扩展存储过程仍然消耗缓冲池之外的内存,因此它与多页分配无关。这同样适用于链接服务器,尤其是当您使用第三方提供商(例如 ORACLE)时。
是否在 SQL 2008 r2 上运行 UPDATE Statistics 并对 5000 万行(非分区)的大表进行全面扫描?我正在尝试确认以下行为。
a) 在整个运行过程中是否有任何锁定?不确定,但我认为没有锁,但是 sr。dba 告诉我它需要模式修改锁(嗯...)
b) 导致阻塞——我不这么认为
c) 造成大量 IO——因为每一页都将被读入内存并污染数据页缓冲区缓存。所以通常你应该在下班时间这样做。
我正在阅读 Christian Bolton、Brent Ozar 的一本关于 SQL 2008 内部结构和故障排除的书,以及已故 Ken Henderson 写的一本旧书,我对 SQL 服务器的动态内存管理器感到困惑和好奇。
有人可以确认我对 SQL Server 动态内存管理的理解是正确的吗?
在 SQL Server 2005/2008/2008R2 x64 中
a) 锁占用的最大内存量限制为缓冲池内存(最大服务器内存)的 60%。通过禁用锁升级并进行大量插入,我可以看到 SQL Server 在抛出错误号 1204(锁内存不足)之前可以占用多达 60% 的缓冲池内存
b) 计划缓存大小限制为
a) Number of plans in cache -- 160K
b) Plan Cache upper limit: 75% of server memory from 0-4GB + 10% of server memory from 4Gb-64GB + 5% of server memory > 64GB.
Run Code Online (Sandbox Code Playgroud)
一旦达到此阈值,SQL Server 将开始从缓存中驱逐执行计划,直到 SQL Server 不再看到内部计划缓存压力
c) 工作区内存限制为最大服务器内存的 75%,除非被资源调控器覆盖,否则单个查询不能超过(可用的最大工作区内存 75%)的 25%。
我的问题是
在惰性编写器开始将页面逐出内存之前,数据库页面缓存占用的最大内存是否有限制?它是如何控制的?通过查看缓冲区中的空闲页数……** …
如果您有多个 SQL Server 实例运行在同一个 Windows Server 系统上,
a) 缓冲池是否共享多个实例?
b) 运行 DBCC DROPCLEANBUFFER 或 DBCC FREEPROCCACHE 有什么影响?这只会影响您运行命令的 SQL Server 实例,还是 Windows 框上的所有实例都会刷新 SQL Server 缓存?
使用在 Windows Server 2008 R2 SP1 上运行的 SQL Server 2012 Enterprise Edition SP1 对于 SQLOS 上的每个逻辑处理器核心,都有一个分配给它的调度程序。这些调度程序可以被视为状态“VISIBLE ONLINE”sys.dm_os_schedulers
工作线程(任务)可以在调度程序上运行,并且这些线程(任务)可以具有各种状态,例如基于等待队列
a) 暂停在等待队列中等待资源可用
b) 可运行队列(主要是 FIFO,除非受资源调控器控制)或
c) 当前在调度程序上运行。
我的问题是说例如一个任务(SELECT在这种情况下是查询)首先进入调度程序(我们称之为调度程序 A)但发现它必须等到页面被带入内存(IO 操作)它现在被放入等待队列在挂起状态下,一旦 IO 完成,该特定工作线程(任务)就会发出信号并按到达该队列的顺序放入可运行队列。
任务是否总是必须转到调度程序A来完成其时间片,或者它可以切换其上下文,现在可以在没有可运行任务的任何空闲调度程序(我们称之为调度程序B)上运行?如果有上下文切换,它的作用是什么?
在我管理的 SQL 服务器实例中;我在 SQL 服务器错误日志中看到很多活动和消息,例如备份或事务日志备份已完成等。我们在一个实例中有很多数据库,有时错误日志消息的数量也很多。
作为一名偶然的 DBA,我可以使用什么方法或脚本来过滤指定日期范围的错误日志,或者从大量信息消息中查找或过滤令人不安的错误?
我想问一下,是否有可以用来过滤错误日志的 T-SQL 脚本或 DMV?
在 SQL 2008 R2 中,我将更新一个将影响 2500 万行的表,该表当前正在复制(事务复制)。为了最大限度地减少对复制的影响,我可以创建一个存储过程,将更新语句包装在存储过程中并为复制添加这个存储过程吗?
通过在执行存储过程时执行此操作,它将复制存储过程的执行。我的问题是 SQL Server 如何知道只复制存储的 proc 执行(即实际的 exec myupateproc t-sql 命令)而不是在发布者上更新的底层表数据(即实际复制 2500 万条更新语句)?