据我了解,使用 Read Committed Snapshot,读者不会阻止作者,而作者不会阻止读者。唯一可能发生的阻塞是编写器阻塞编写器。默认情况下,我们的数据库设置为 Read Committed Snapshot。但是,我们有很多用户使用 WITH (NOLOCK) 发出查询(出于不良习惯)。如果我理解正确,使用 WITH (NOLOCK) 的查询会更改隔离级别。当在查询中使用它时,读取器现在是否可以阻止尝试更新正在读取的数据的进程?
有谁知道如何在特定数据库(特定于数据库,而不是服务器级别)上找到批处理请求/秒?
这是在特定数据库上查找事务/秒的方法。
DECLARE @Counter bigint
SELECT @Counter = cntr_value FROM sys.dm_os_performance_counters
WHERE counter_name = 'Transactions/sec'
AND object_name='SQLServer:Databases'
AND instance_name ='VirendraTest' -- Your DB Name
-- Wait for 1 second
WAITFOR DELAY '00:00:01'
SELECT cntr_value = @Counter FROM sys.dm_os_performance_counters
WHERE counter_name ='Transactions/sec'
AND object_name ='SQLServer:Databases'
AND instance_name ='VirendraTest' -- Your DB Name
Run Code Online (Sandbox Code Playgroud) 我有一个供应商数据库,我想对其使用更改数据跟踪,但不能,因为他们的表都没有定义主键。这些表确实有唯一索引,但它们没有定义为 PK 约束。在我看来,鉴于它们已经是唯一索引,使它们成为主键将是一件安全的事情(即不会干扰或更改软件操作)。
谁能告诉我我的理解是正确的还是遗漏了什么?
我从 Excel 粘贴了一个公式并粘贴到 SQL Server Management Studio。
一旦我执行它,我得到一个意想不到的结果:
SELECT (((10320238-2092189)/2092189)*100.0)/4.0 --returns 75.000000
Run Code Online (Sandbox Code Playgroud)
但是在对查询中的每个值添加精度后,它返回正确的结果:
SELECT (((10320238.0-2092189.0)/2092189.0)*100.0)/4.0 --returns 98.31866289250000
Run Code Online (Sandbox Code Playgroud)
为什么第一个查询不会带来 98% 的结果?的内部数据类型是10320238什么?是integer吗?
发动机是
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud) 有什么办法可以加快重新启用约束的速度?
作为更新我们仓库中几个表的工作的一部分,这是在几个小时内完成的,重新启用对所述表的约束可能需要一个多小时。其余的工作,即更新,大约需要 5 分钟。在更新开始之前禁用相同的约束是亚秒。
编辑
有问题的工作是在给定日期之前更新数据行上的 PK 和 FK,以防止这些记录出现在报告中。soft delete如果你愿意,一种记录方式。
大多数表格行大小均大于 130m 行,但超过 370m 行的除外。其他两个较小。
TableName rows
Table_1 371255778
Table_2 131703902
Table_3 131665535
Table_4 131665535
Table_5 131665535
Table_6 131665535
Table_7 19364988
Table_8 1458800
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令禁用每个表上的约束
ALTER TABLE database.dbo.table_name NOCHECK CONSTRAINT ALL;
以及以下再次重新启用它们
ALTER TABLE database.dbo.table_name WITH CHECK CHECK CONSTRAINT ALL;
没有同时运行的报告或其他作业。
是否需要很长时间才能重新启用约束预期行为,或者是否可以采取一些措施来加快速度?
提前致谢
据我所知,无论使用哪种隔离级别,SQL Server 在事务期间都会持有 X 锁。U锁呢?如果一个事务在 UPDATE 语句中读取了 100 条记录(U 锁)但只更新了 10 条记录,那么在更新完成后,如果 tran 仍然打开,我们会得到 90-U 和 10-X 吗?
回应以下大卫的回答:不,这些情况不相关(感谢您的回答!)。我无法发布代码,因为我手头没有电脑,但我将尝试简要描述这种情况。我有一堆。我更新了,更新了10条记录。问:我们会在 ... 点有任何 U 锁,还是在获得 X 锁后释放它们?谢谢!
Begin tran;
Update t
Set b = 10
Where a = 1;
...
Run Code Online (Sandbox Code Playgroud) 我知道,有人告诉我,微软在 MSDN 下有一个 per-dev doc 系统。具体来说,我正在寻找有关 WAL 日志内部格式的文档。这在任何地方都有记录吗?第三方肯定可以访问这个吗?
而且,无论如何,是否可以在不先付费的情况下知道 MSDN 记录的内容?
SQL Server 内部还有哪些其他文档来源?
作为处理发票的一部分,我们的第 3 方 ERP 创建、查询,然后在其中一个 ERP 数据库表上删除视图。
我们对此有不同的担忧,但我真的很好奇:CREATE 或 DROP 语句中的任何一个都需要对数据库或视图中涉及的表使用模式修改锁吗?
如果没有,进程中是否还有其他需要我们关注的锁类型?
试图按父项对没有共同组的每 X 行求和
declare @temp table(Row_ID int, amt DECIMAL(18,2))
insert into @temp values(1, 20)
insert into @temp values(2, 24)
insert into @temp values(3, 20)
insert into @temp values(4, 15)
insert into @temp values(5, 15)
Run Code Online (Sandbox Code Playgroud)
如果 X 行是 2,那么所需的结果是对 2 行求和并将总数放在行旁边。所以前 2 行总计为 44 ,接下来的 2 行为 35 ,剩下的 1 行总计为 15
Row_ID amt tot
1 20.00 44.00
2 24.00 44.00
3 20.00 35.00
4 15.00 35.00
5 15.00 15.00
Run Code Online (Sandbox Code Playgroud)
如果 X 行是 3,那么所需的结果
Row_ID amt tot
1 20.00 64.00
2 …Run Code Online (Sandbox Code Playgroud)