我在这里读到每行将存储一些额外的数据,因此我们可能会看到性能下降,但还有哪些其他风险?
例如。这会影响数据库的恢复吗?我们还需要做些什么来利用这一点吗?
我计划执行这些命令:
ALTER DATABASE DatabaseName SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE DatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON
Run Code Online (Sandbox Code Playgroud)
我相信这会让我们更接近 oracle,如果一个事务正在更新其他事务仍然可以读取旧数据。这样对吗?
我正在研究这个,因为我厌倦了 SQL Server 2005 中的锁定问题。我希望这可以减少我们的用户看到的偶尔的死锁,帮助我们的应用程序的整体性能并鼓励我们的开发人员在没有害怕。
我们有一个客户的 bak 文件,我们已将其转移到我们的开发人员办公室进行问题调查。备份当前为 25GB,还原的数据库大小大致相同,但需要 100GB 才能还原。我相信这是因为数据库设置为具有 75GB 的事务日志大小。恢复数据库后,我们可以缩小日志文件,但有没有办法在恢复中做到这一点?
我们有一个 sql-server 2005 数据库,我们定期将它从我们的客户站点转移到我们的站点。这需要很长时间,因为我们没有直接连接,必须通过基于 Web 的文件传输应用程序传输文件。数据库目前大约有 10GB,但我们不需要所有数据 - 大部分数据位于审计表和包含可以重新生成的计算值的表中。
我曾考虑创建一个文件组来保存审计表,并希望我可以备份和恢复主文件组。我可以正常备份,但在恢复时出现错误,提示我没有将其恢复到同一个数据库。是否可以使用文件组将数据库的一部分还原到不同的服务器?有一个更好的方法吗?
我有一个大的删除存储过程,并且在删除不会删除任何内容的情况下重现了死锁。
看起来遇到死锁的存储过程的部分是这样的(更改了表名):
DELETE d
FROM Table1 d
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = oeh.EntityId
Run Code Online (Sandbox Code Playgroud)
在我看来,尝试从这个大表中删除时,两个删除操作同时运行并且彼此死锁。对于这些项目,我知道不会有非常大的表 table1、table2、table3 的记录。
我想知道这是否可以通过更改为:
DELETE d
FROM Table1 d WITH(rowlock)
inner join dbo.Table2 orc on orc.id = d.Table2Id
inner join dbo.Table3 orr on orr.id = orc.Table3Id
inner join Table4 oeh on oeh.id = orr.Table4Id
inner join @deleteEntities de on de.id = …Run Code Online (Sandbox Code Playgroud) 客户希望我们的应用程序更快地处理更多数据,因此安排与他们的 dba 会面以讨论选项。
此应用程序会生成大量用于报告的数据。在每次运行之前,删除该项目的旧数据,执行计算,然后插入新数据。在繁忙时期,用户会排队数百个这样的生成任务,我们同时运行多达 30 个。每次运行可能会创建 60K 行。
dba 建议我们可以将应用程序更改为使用 30 个分区(例如,每个线程一个)以减少插入和删除期间线程之间的锁定。他们建议在标准 sql 中我们可以做类似的事情
INSERT INTO schema.table.partition (...) VALUES (...)
Run Code Online (Sandbox Code Playgroud)
我在msdn 文档中没有看到这种语法,这意味着更改这个应用程序很痛苦,但是否有可能做到这一点?据我了解,我们会改为使用分区函数基于表的列进行分区?
我已经阅读了创建分区函数文档,但我不完全确定如何创建一个函数来满足我们的需求。更糟糕的是,我还没有企业版来尝试这个,所以我为不正确的语法道歉。
我在想,例如,如果我们有一个 items 表和一个包含该项目数据的 itemdata 表,我们可能会通过基于类似的函数拆分数据来对 itemdata 表进行分区itemid mod 30。这会将项目 1 放在分区 1 中,将项目 2 放在分区 2 中,等等。我不确定我们是否可以在分区函数、方案、表声明中执行此操作,或者我们是否需要创建一个计算列并使用价值观条款?也不确定我们是否会看到任何性能改进?
这就是我认为我们可以实现的方式:
CREATE PARTITION FUNCTION SplittingItemIds_PFunc(decimal(18,0)) AS
RANGE LEFT FOR VALUES
(0,1,2,3, ... ,29)
CREATE PARTITION SCHEME SplittingItemIds_Scheme
AS PARTITION SplittingItemIds_PFunc
ALL TO ([PRIMARY]);
CREATE TABLE ItemData
(
Id decimal(18,0),
ItemId decimal(18,0),
...
)
ON …Run Code Online (Sandbox Code Playgroud) 这是我们的一位客户提出的问题。现在我已经给出了一个通用的回应,我们将支持这一点,但是他们应该为我们提供一个测试环境。
我们的应用程序使用 .net,我们允许客户端使用数据库实例名称和用户名/密码配置我们的服务器服务(我们使用 sql-server 身份验证)。
据我所知,他们需要做的就是使用集群实例名称而不是数据库服务器的主机名配置我们的应用程序。阅读Microsoft 提供的先决条件似乎对我们来说是完全透明的。
这样对吗?我们还需要对连接字符串进行其他更改吗?还有其他问题吗?
sql-server ×6
backup ×2
deadlock ×1
delete ×1
export ×1
locking ×1
partitioning ×1
performance ×1
restore ×1
transaction ×1