大部分的论坛和榜样的网上总是建议同时拥有ALLOW_SNAPSHOT_ISOLATION并READ_COMMITTED_SNAPSHOT设置为ON,每当别人问快照,行版本或类似的问题。
我想这两种设置中的 SNAPSHOT 一词都有些令人困惑。我认为,为了让数据库引擎对 READ_COMMITTED 默认行为使用行版本控制而不是锁定,无论设置如何,数据库READ_COMMITTED_SNAPSHOT都设置为 ON 。ALLOW_SNAPSHOT_ISOLATION
该ALLOW_SNAPSHOT_ISOLATION设定被设定为ON只允许快照隔离启动事务(例如SET TRANSACTION ISOLATION级快照)时无论的READ_COMMITTED_SNAPSHOT设置。
将这两个设置设置为 ON 的唯一原因是它需要具有 READ COMMITTED 行版本控制和 快照隔离。
我的问题是,我的理解在某种程度上是错误的吗?并且这两个设置必须始终一起设置为 ON(特别是对于 READ COMMITTED 行版本控制)?
我正在寻找处理 SQL Server 2012 可用性组中计划的 SQL Server 代理作业的最佳实践。也许我错过了一些东西,但是在目前的状态下,我觉得 SQL Server 代理并没有真正与 SQL2012 的这个强大功能集成在一起。
如何让计划的 SQL 代理作业知道节点切换?例如,我有一个在主节点上运行的作业,它每小时加载数据。现在,如果主要服务器出现故障,我如何激活现在成为主要服务器的辅助服务器上的作业?
如果我总是在辅助上安排作业,它会失败,因为辅助是只读的。
sql-server sql-server-2012 sql-server-agent availability-groups
我开始学习执行计划,并且对哈希匹配的工作原理以及为什么在简单连接中使用它感到困惑:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)

据我了解,顶部索引扫描的结果变为可散列的,底部索引聚集扫描中的每一行都被查找。我至少在某种程度上了解哈希表是如何工作的,但我对在这样的示例中究竟哪些值进行了哈希处理感到困惑。
我认为它们之间的公共字段,即 id 被散列是有意义的——但如果是这种情况,为什么要散列一个数字?
增加一列(nvarchar)的宽度一定会删除表格吗?
换句话说,在有活跃用户的生产环境中,宽度可以改变吗?
我认为如果大小增加(而不是减少),这将不是问题。
我试图从数据库中删除一个主体,但不能,因为它拥有一个架构。但是,当我去编辑用户时,取消选中架构的框是蓝色的并且无法移除。如何从这些架构中删除主体?
我正在使用我从远程 Pg 数据库写入 SELECT 的代码自动生成一些查询,并插入到本地 SQL Server 数据库中。但是,其中之一正在生成此错误:
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]字符串或二进制数据将被截断。(SQL-22001) [状态是 22001 现在是 01000]
[Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止。(SQL-01000) 在 .\insert.pl 第 106 行。
我如何找出哪个列产生了该错误并且缺少输入的长度?有没有办法做到这一点而不用蛮力猜测所有varchar?
哪个是获取我刚刚通过插入生成的标识值的最佳选择?这些语句对性能有什么影响?
SCOPE_IDENTITY() MAX()TOP 1IdentityColumn FROM TableNameORDER BY IdentityColumn DESC我正在使用 SQL Server 2012。我想在将用户添加到数据库之前检查用户是否存在。
这是我测试过的:
USE [MyDatabase]
GO
IF NOT EXISTS (SELECT name
FROM [sys].[server_principals]
WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
CREATE USER [IIS APPPOOL\MyWebApi AppPool]
FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Run Code Online (Sandbox Code Playgroud)
但是,SELECT name FROM [sys].[server_principals]如果该用户存在于MyDatabase.
如何检查用户是否存在于MyDatabase?
我有两个具有相同名称、类型和索引键列的表。其中一个具有唯一的聚集索引,另一个具有非唯一的.
测试设置
设置脚本,包括一些真实的统计数据:
DROP TABLE IF EXISTS #left;
DROP TABLE IF EXISTS #right;
CREATE TABLE #left (
a char(4) NOT NULL,
b char(2) NOT NULL,
c varchar(13) NOT NULL,
d bit NOT NULL,
e char(4) NOT NULL,
f char(25) NULL,
g char(25) NOT NULL,
h char(25) NULL
--- and a few other columns
);
CREATE UNIQUE CLUSTERED INDEX IX ON #left (a, b, c, d, e, f, g, h)
UPDATE STATISTICS #left WITH ROWCOUNT=63800000, PAGECOUNT=186000;
CREATE …Run Code Online (Sandbox Code Playgroud) join sql-server sql-server-2014 sort-operator sql-server-2017
我正在使用 SQL SERVER 2008 R2
我刚刚在 SQL 中遇到 APPLY 并且喜欢它如何解决如此多情况下的查询问题,
我使用 2 个左连接来获得结果的许多表,我能够获得 1 个外部应用。
我的本地数据库表中有少量数据,部署后代码应该在至少 20 倍大的数据上运行。
我担心对于大量数据,外部应用可能需要比 2 个左连接条件更长的时间,
谁能告诉我 apply 究竟是如何工作的,以及它如何影响非常大数据的性能,如果可能的话,每个表的大小有一些比例关系,比如与 n1^1 或 n1^2 成比例......其中 n1 是表中的行数1.
这是带有 2 个左连接的查询
select EC.*,DPD.* from Table1 eC left join
(
select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
group by member_id,parent_gid,child_gid,LOB,group_gid
) DPD2 on DPD2.parent_gid = Ec.parent_gid
AND DPD2.child_gid = EC.child_gid
AND DPD2.member_id = EC.member_id
AND DPD2.LOB = EC.default_lob
AND DPD2.group_gid = EC.group_gid
left join
Table2 dpd on dpd.parent_gid = dpd2.parent_gid
and …Run Code Online (Sandbox Code Playgroud)