标签: sql-server

在sql-server中开启读提交快照有什么风险?

我在这里读到每行将存储一些额外的数据,因此我们可能会看到性能下降,但还有哪些其他风险?

例如。这会影响数据库的恢复吗?我们还需要做些什么来利用这一点吗?

我计划执行这些命令:

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 中的锁定问题。我希望这可以减少我们的用户看到的偶尔的死锁,帮助我们的应用程序的整体性能并鼓励我们的开发人员在没有害怕。

sql-server-2005 sql-server transaction

78
推荐指数
5
解决办法
8万
查看次数

检查约束只有三列之一为非空

我有一个 (SQL Server) 表,其中包含 3 种类型的结果:FLOAT、NVARCHAR(30) 或 DATETIME(3 个单独的列)。我想确保对于任何给定的行,只有一列有结果,其他列是 NULL。实现这一目标的最简单的检查约束是什么?

这样做的背景是试图改进将非数字结果捕获到现有系统中的能力。使用约束向表中添加两个新列以防止每行超过一个结果是最经济的方法,但不一定是正确的方法。

更新:抱歉,数据类型混乱。可悲的是,我不打算将指示的结果类型解释为 SQL Server 数据类型,只是通用术语,现在已修复。

sql-server constraint

75
推荐指数
3
解决办法
5万
查看次数

如何确定哪个查询正在填满 tempdb 事务日志?

我想知道如何识别实际填充 TEMPDB 数据库事务日志的确切查询或存储过程。

sql-server-2005 sql-server-2008 sql-server tempdb transaction-log

75
推荐指数
3
解决办法
19万
查看次数

如何在 SQL Server 2008 中强制删除数据库

我正在尝试强制删除数据库,但是在删除数据库后,当我尝试重新创建数据库时,出现错误

无法创建文件 C:\Program Files.....[databasename].mdf 因为它已经存在

这是我强制删除数据库的查询

Use master;
ALTER database [databasename] set offline with ROLLBACK IMMEDIATE;
DROP database [databasename];
Run Code Online (Sandbox Code Playgroud)

我明白,上面的查询正在删除数据库,但它没有删除.ldf.mdf文件。如何彻底删除数据库?

正常查询

Drop database [databasename] ; //deletes the database completely, including the ldf and mdf's.
Run Code Online (Sandbox Code Playgroud)

如何强制删除数据库,同时删除.mdf.ldf文件?

sql-server-2008 sql-server

75
推荐指数
1
解决办法
16万
查看次数

MERGE 目标表的一个子集

我正在尝试使用MERGE语句从表中插入或删除行,但我只想对这些行的一个子集进行操作。的文档MERGE有一个措辞非常强烈的警告:

仅指定目标表中用于匹配目的的列很重要。也就是说,指定目标表中与源表的相应列进行比较的列。不要试图通过在 ON 子句中过滤掉目标表中的行来提高查询性能,例如通过指定 AND NOT target_table.column_x = value。这样做可能会返回意外和不正确的结果。

但这正是我必须做的事情才能完成我的MERGE工作。

我拥有的数据是一个标准的项目到类别的多对多连接表(例如,哪些项目包含在哪些类别中),如下所示:

CategoryId   ItemId
==========   ======
1            1
1            2
1            3
2            1
2            3
3            5
3            6
4            5
Run Code Online (Sandbox Code Playgroud)

我需要做的是用新的项目列表有效地替换特定类别中的所有行。我最初的尝试是这样的:

MERGE INTO CategoryItem AS TARGET
USING (
  SELECT ItemId FROM SomeExternalDataSource WHERE CategoryId = 2
) AS SOURCE
ON SOURCE.ItemId = TARGET.ItemId AND TARGET.CategoryId = 2
WHEN NOT MATCHED BY TARGET THEN
    INSERT ( CategoryId, ItemId )
    VALUES ( 2, ItemId ) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql merge

74
推荐指数
1
解决办法
8万
查看次数

SQL Server MAXDOP 设置算法

在设置新的 SQL Server 时,我使用以下代码来确定设置的良好起点MAXDOP

/* 
   This will recommend a MAXDOP setting appropriate for your machine's NUMA memory
   configuration.  You will need to evaluate this setting in a non-production 
   environment before moving it to production.

   MAXDOP can be configured using:  
   EXEC sp_configure 'max degree of parallelism',X;
   RECONFIGURE

   If this instance is hosting a Sharepoint database, you MUST specify MAXDOP=1 
   (URL wrapped for readability)
   http://blogs.msdn.com/b/rcormier/archive/2012/10/25/
   you-shall-configure-your-maxdop-when-using-sharepoint-2013.aspx

   Biztalk (all versions, including 2010): 
   MAXDOP = 1 is only required on the BizTalk …
Run Code Online (Sandbox Code Playgroud)

sql-server configuration maxdop

74
推荐指数
5
解决办法
6万
查看次数

编写一个简单的银行模式:我应该如何保持我的余额与他们的交易历史同步?

我正在为一个简单的银行数据库编写架构。以下是基本规格:

  • 数据库将存储针对用户和货币的交易。
  • 每个用户每种货币都有一个余额,因此每个余额只是针对给定用户和货币的所有交易的总和。
  • 余额不能为负。

银行应用程序将专门通过存储过程与其数据库通信。

我希望这个数据库每天接受数十万个新事务,以及更高数量级的平衡查询。为了非常快速地提供余额,我需要预先汇总它们。同时,我需要保证余额永远不会与其交易历史相矛盾。

我的选择是:

  1. 有一个单独的balances并执行以下操作之一:

    1. 将事务应用于transactionsbalances表。TRANSACTION在我的存储过程层使用逻辑来确保余额和交易始终同步。(由杰克支持。)

    2. 将交易应用到transactions表并有一个触发器,balances用交易金额为我更新表。

    3. 将交易应用到balances表中,并有一个触发器transactions为我在表中添加一个新条目,其中包含交易金额。

    我必须依靠基于安全的方法来确保在存储过程之外不能进行任何更改。否则,例如,某些进程可以直接将事务插入transactions表中,并且在该方案1.3下相关余额将不同步。

  2. 有一个balances索引视图,可以适当地聚合事务。存储引擎保证余额与其交易保持同步,因此我不需要依赖基于安全的方法来保证这一点。另一方面,我不能再强制余额为非负数,因为视图——甚至索引视图——不能有CHECK约束。(由丹尼支持。)

  3. 只有一个transactions表,但有一个额外的列来存储该交易执行后立即生效的余额。因此,用户和货币的最新交易记录也包含其当前余额。(下面由Andrew建议;由garik提出的变体。)

当我第一次解决这个问题时,我阅读了 两个讨论并决定了 option 2。作为参考,您可以在此处查看它的基本实现。

  • 您是否设计或管理过这样的具有高负载配置文件的数据库?你对这个问题的解决方案是什么?

  • 你认为我做出了正确的设计选择吗?有什么我应该记住的吗?

    例如,我知道对transactions表的架构更改需要我重建balances视图。即使我正在归档事务以保持数据库较小(例如,将它们移到其他地方并用摘要事务替换它们),每次架构更新时都必须重建数千万个事务的视图,这可能意味着每次部署的停机时间会显着增加。

  • 如果索引视图是要走的路,我如何保证没有余额为负?


归档交易:

让我详细说明一下存档交易和我上面提到的“摘要交易”。首先,在像这样的高负载系统中,定期存档将是必要的。我想保持余额与其交易历史之间的一致性,同时允许将旧交易转移到其他地方。为此,我将用每个用户和货币的金额摘要替换每批存档交易。

因此,例如,此交易列表:

user_id    currency_id      amount    is_summary
------------------------------------------------
      3              1       10.60 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 database-design sql-server aggregate materialized-view

70
推荐指数
5
解决办法
7万
查看次数

如何将调试按钮添加到 SSMS v18?

Debug按钮出现在此版本的 SSMS 上: 在此处输入图片说明

但它不存在于版本 18,预览 4: 在此处输入图片说明

我尝试了多种方法将Debug按钮添加到我的 SSMS,但没有成功。

有没有办法将Debug按钮添加到 SSMS v18?

sql-server ssms

67
推荐指数
2
解决办法
10万
查看次数

索引搜索与索引扫描

查看运行缓慢的查询的执行计划,我注意到有些节点是索引查找,有些是索引扫描。

索引查找和索引扫描有什么区别?

哪个表现更好?

SQL 如何选择一个?

我意识到这是 3 个问题,但我认为回答第一个会解释其他问题。

performance index sql-server-2005 sql-server execution-plan

66
推荐指数
4
解决办法
6万
查看次数

如何使用表值函数连接表?

我有一个用户定义的函数:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end
Run Code Online (Sandbox Code Playgroud)

现在我想在另一张桌子上加入这个,就像这样:

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1
Run Code Online (Sandbox Code Playgroud)

换句话说,所有的Foo记录,其中SomeCriterion1,我想看到的Foo IDDesc,旁边的值Field1,并Field2认为从返回ut_FooFunc的的输入Foo.ID

这样做的语法是什么?

join sql-server syntax sql-server-2012 functions

66
推荐指数
1
解决办法
12万
查看次数