有没有办法找到两个 SQL Server 数据库(仅限架构)中的差异。一个是本地的,第二个是在客户的站点。我们遇到运行一些报告的水晶报表和一些未执行的代码的问题,看起来模式不匹配。
我可以在两个数据库上运行相同的命令并比较结果以判断差异在哪里吗?
我有以下架构(名称已更改),我无法更改:
CREATE TABLE MyTable (
Id INT NOT NULL PRIMARY KEY,
ParentId INT NOT NULL
);
ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id);
Run Code Online (Sandbox Code Playgroud)
也就是说,每条记录都是另一条记录的子项。如果记录的ParentId等于其Id,则该记录被视为根节点。
我想运行将找到所有循环引用的查询。例如,随着数据
INSERT INTO MyTable (Id, ParentId) VALUES
(0, 0),
(1, 0),
(2, 4),
(3, 2),
(4, 3);
Run Code Online (Sandbox Code Playgroud)
查询应该返回
Id | Cycle
2 | 2 < 4 < 3 < 2
3 | 3 < 2 < 4 < 3
4 | 4 < 3 < 2 < 4
Run Code Online (Sandbox Code Playgroud)
我为 SQL …
我正在尝试提高以下查询的性能:
UPDATE [#TempTable]
SET Received = r.Number
FROM [#TempTable]
INNER JOIN (SELECT AgentID,
RuleID,
COUNT(DISTINCT (GroupId)) Number
FROM [#TempTable]
WHERE Passed = 1
GROUP BY AgentID,
RuleID
) r ON r.RuleID = [#TempTable].RuleID AND
r.AgentID = [#TempTable].AgentID
Run Code Online (Sandbox Code Playgroud)
目前我的测试数据大约需要一分钟。我对这个查询所在的整个存储过程的更改的输入量有限,但我可能会让他们修改这个查询。或者添加索引。我尝试添加以下索引:
CREATE CLUSTERED INDEX ix_test ON #TempTable(AgentID, RuleId, GroupId, Passed)
Run Code Online (Sandbox Code Playgroud)
它实际上使查询所需的时间增加了一倍。我用非聚集索引得到了同样的效果。
我尝试按如下方式重新编写它,但没有任何效果。
WITH r AS (SELECT AgentID,
RuleID,
COUNT(DISTINCT (GroupId)) Number
FROM [#TempTable]
WHERE Passed = 1
GROUP BY AgentID,
RuleID
)
UPDATE [#TempTable]
SET Received = r.Number
FROM [#TempTable]
INNER JOIN r …Run Code Online (Sandbox Code Playgroud) 使用带有拉取订阅者的 SQL 2008 R2 事务复制,当我们添加一篇文章时,我想避免创建整个快照(数据库约为 80 GB,因此这需要几个小时)。
从这篇文章 中,我已经看到了如何通过关闭即时同步来使用部分快照来做到这一点,但这对我们不起作用。
理想情况下,我只想将它作为我们的 db 脚本的一部分运行来创建表,所以如果我们想要复制它,我们会这样做:
Create Table ...
sp_addArticle ...
sp_PushThisToOurSubscribersNow
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中有一个 ID、一个值和一个日期。此表中有许多 ID、值和日期。
记录会定期插入到此表中。ID 将始终保持不变,但有时值会发生变化。
我如何编写一个查询,该查询将为我提供 ID 以及该值更改的最近时间?注意:该值将始终增加。
从这个样本数据:
Create Table Taco
( Taco_ID int,
Taco_value int,
Taco_date datetime)
Insert INTO Taco
Values (1, 1, '2012-07-01 00:00:01'),
(1, 1, '2012-07-01 00:00:02'),
(1, 1, '2012-07-01 00:00:03'),
(1, 1, '2012-07-01 00:00:04'),
(1, 2, '2012-07-01 00:00:05'),
(1, 2, '2012-07-01 00:00:06'),
(1, 2, '2012-07-01 00:00:07'),
(1, 2, '2012-07-01 00:00:08')
Run Code Online (Sandbox Code Playgroud)
结果应该是:
Taco_ID Taco_date
1 2012-07-01 00:00:05
Run Code Online (Sandbox Code Playgroud)
(因为 00:05 是最后一次Taco_Value更改。)
我们有一个包含 2.3B 行的表。我们想将一列从 NOT NULL 更改为 NULL。该列包含在一个索引中(不是聚集索引或 PK 索引)。数据类型没有改变(它是一个 INT)。只是可空性。声明如下:
Alter Table dbo.Workflow Alter Column LineId Int NULL
Run Code Online (Sandbox Code Playgroud)
该操作在我们停止之前需要超过 10 次(我们甚至还没有让它运行完成,因为它是一个阻塞操作并且花费的时间太长)。我们可能会将表复制到开发服务器以测试实际需要多长时间。但是,我很好奇是否有人知道 SQL Server 在从 NOT NULL 转换为 NULL 时在幕后做了什么?此外,受影响的索引是否需要重建?生成的查询计划并不表明发生了什么。
有问题的表是集群的(不是堆)。
sql-server sql-server-2008-r2 alter-table database-internals
我正在根据不是主键的列对表进行分区?我今天阅读了一些关于分区列是否必须是主键的一部分的相互矛盾的信息。我的直觉说不,但我不是 100% 确定。所以问题...
我在 SQL Server Central 线程中看到完整备份是否会截断日志?完整备份不会截断日志:
不会。完整备份或差异备份都不会截断事务日志。- Lynn Pettis
否 - 完整备份不会截断日志。-查德克劳馥
那么完整备份和仅复制完整备份有什么区别呢?
对于日志备份,只有复制备份可以防止日志链在不截断日志的情况下中断。那么什么是仅复制完整备份?
我有一个包含数据的现有表:
dbo.Test (col1,col2,col3....) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我需要将此表更改为这样分区:
dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)
Run Code Online (Sandbox Code Playgroud)
我怎样才能在不删除和重新创建表格的情况下实现这一目标?
我有两个 SQL 代理作业,它们计划以不同的时间间隔运行。第一个作业每天运行一次完整备份。第二个作业每十五分钟运行一次事务日志备份。
随着数据库的增长,完整备份的时间比原计划的要长(即使有压缩)。我从我的日志中注意到事务日志备份现在同时运行。
我是否应该更改事务日志备份的计划,以便在运行完整备份时不运行?有关系吗?
sql-server ×10
backup ×2
partitioning ×2
alter-table ×1
foreign-key ×1
replication ×1
schema ×1
t-sql ×1