我很好奇 SQL Server 的缓冲池如何受到压缩数据表的影响。
内存中的数据是像在磁盘上一样被压缩,还是完全解压?
如果数据被压缩存储在缓冲池中,那么在执行语句时,给定时间内存中保存了多少瞬时解压数据;一行/页、整个表(假设有足够的空闲页来保存数据),还是“视情况而定”?
我有一个 SQL Server 2005 Standard x64,它在过去几个月中遇到了 TempDB DDL 争用问题。服务器将在等待资源 2:1:103 上发生争用(等待类型为 PAGELATCH_EX)。
当服务器负载正常时,该问题似乎偶尔会发生。我一直在监视“破坏临时表”的比率,当我们在 2:1:103 出现 PAGELATCH_EX 问题时,它可以跳到 5,000+。从我读过的内容来看,这个计数器大部分时间应该是 0,但我们的大部分时间似乎都保持在 300-1100 之间。只有当系统上的用户很少时,计数器才会变为 0。
如何缩小导致 tempdb 上 DDL 争用的范围,而不必在大海捞针中寻找针头?
一般设置并行性的最佳实践是什么?我知道 SQL Server 默认0使用所有可用的处理器,但是在什么情况下您要更改此默认行为?
我记得在某处读到过(我必须寻找这篇文章),对于 OLTP 工作负载,您应该关闭并行性(将 maxdop 设置为1)。我不认为我完全理解你为什么要这样做。
您什么时候将 maxdop 保持到 SQL Server (0)?您何时会关闭并行性 (1)?您何时会明确说明特定数量的处理器的 maxdop?
什么导致并行?
我在 SQL 2008 中有一份工作,它运行一个存储过程来备份所有数据库。这通过 sql server 代理作业每天运行。
它每天都成功退出,但有时只有在备份了几个数据库后才成功退出。每次可以是不同数量的数据库。大多数情况下,它会成功备份所有数据库,但有时会成功备份 2 次,有时会成功备份 5 次,等等。
我在作业历史记录、事件查看器或 sql server 日志中没有看到任何错误。
备份是在本地磁盘上进行的,尽管该文件夹是可扩展存储卷上文件夹的“连接点”。
操作系统是 Windows 2003 64 位运行 Sql Server 2008 网络版 64 位作为在 Vmware ESXi 5 主机上运行的虚拟机。
存储过程:
ALTER PROCEDURE [dbo].[backup_all_databases]
@path VARCHAR(255)='c:\backups\'
AS
DECLARE @name VARCHAR(50) -- database name
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
DECLARE @dbIsReadOnly sql_variant -- is database read_only?
DECLARE @dbIsOffline sql_variant -- is database offline?
DECLARE db_cursor CURSOR FOR
SELECT name …Run Code Online (Sandbox Code Playgroud) 我有一个删除语句,它在存储过程中运行时使用了一个错误的计划,但在临时运行时选择了一个更好的计划。
我已经为查询使用的表重建了所有索引并删除了所有缓存。优化器仍然为存储过程选择了错误的计划。
我想知道为什么优化器对存储过程使用不同的执行计划而不是临时 SQL。
更新:我想它毕竟一定是参数 - 当我运行带有硬编码变量的临时代码时,我可以获得具有正确值的“坏”计划(它是一个日期,值是一岁似乎产生了“好”的计划)。现在尝试通过使用查询提示在 proc 上强制执行“好”计划。
解决方案:我最终通过使用 OPTIMIZE FOR UNKNOWN 提示获得了我想要的计划。
我在本地计算机上安装了 SQL Server 沙箱。我已将 SQL Server 实例可以使用的内存设置为 1000 mb。运行密集操作时,内存使用量上升到 1000 mb。当操作结束时,SQL Server 仍然持有内存。如何释放这个内存预留?
我有一个长时间运行的事务(称为 T1),它对 SQL Server 2008 R2 中的表执行一些删除、更新和插入操作。同时,另一个进程会定期从该表中运行 select 语句。
在默认隔离设置下(我认为是 READ COMMITTED?),T1 会阻止任何 select 语句运行,直到事务提交或回滚。
我希望看到的是,即使在事务正在进行时,select 语句也能对一致的数据起作用。我相信 SNAPSHOT 隔离可以提供帮助,但不确定我是否朝着正确的方向前进。这是该应用程序的最佳隔离级别吗?
其次,我无法控制调用 select 语句的进程,但我可以控制调用 T1 的 .NET 应用程序。select 语句和 T1 都需要更改任何隔离级别,还是仅将 T1 标记为具有不同的隔离级别就足够了?
我有一个供内部使用的键列,它只是一个递增的整数,但我想要第二个唯一的列,它是一个 UUID,但我不知道如何调用默认值的函数(以便 SQL服务器正在创建 UUID 而不是 java),有没有可以为此向我建议的文档?
如何截断 SQL Server 2008 数据库中的事务日志?
什么是可能的最佳方法?
我从博客中尝试了以下方法:
1)从设置数据库到简单恢复,缩小文件,再设置完全恢复,实际上是丢失了宝贵的日志数据,无法及时恢复。不仅如此,您还将无法使用后续日志文件。
2) 缩小数据库文件或数据库增加碎片。
你可以做很多事情。首先,使用以下命令开始进行适当的日志备份,而不是截断它们并经常丢失它们。
BACKUP LOG [TestDb] TO DISK = N'C:\Backup\TestDb.bak'
GO
Run Code Online (Sandbox Code Playgroud)
删除 SHRINKING 文件的代码。如果您进行适当的日志备份,您的日志文件通常(同样通常,特殊情况除外)不会变得很大。
我的主管对在流程中使用触发器犹豫不决,因为如果恰逢网络中断,流程将无法完成。SQL Server 是否在调用过程的事务中包含触发器?如果没有,实现这一点的最佳方法是什么?
sql-server ×10
memory ×2
backup ×1
compression ×1
ddl ×1
locking ×1
logs ×1
parallelism ×1
performance ×1
tempdb ×1
transaction ×1
trigger ×1