标签: sql-server

SQL Server - 可能发生多少种类型的超时,以及如何发生?

使用 SQL Server 时,可以有多个应用程序主机访问它,每个应用程序可以有一个或多个连接。每个连接都可能有多个事务(如果我错了,请纠正我)。每个事务都可以执行查询或非查询 SQL。

根据我的经验,如果我查询一个被独占锁定的表,我很容易遇到超时。如果两个不同的应用程序锁定同一资源,我还看到 SQL Server 检测并抛出死锁异常而不是超时。我还显示了重建索引超时,这可能是由于有人仍然连接到表。

但是,我也遇到了一种死锁,SQL Server 没有检测到它或超时。在这个应用程序中,它打开了两个连接,两个独立的事务,其中第一个事务锁定了一个资源,第二个事务尝试访问相同的资源,但它没有关闭第一个事务。

有人会提供超时和/或死锁类型的列表,这将帮助我在处理应用程序时避免此类情况。

sql-server deadlock query-timeout

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

读取 DMV 时设置 READ UNCOMMITTED

我见过几个人SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在阅读系统 DMV 之前打电话。是否有任何理由这样做,假设您没有在同一事务中混合调用 DMV 和表?

sql-server dmv

12
推荐指数
2
解决办法
930
查看次数

为什么sql server需要先把count(*)结果转换成int再与int变量比较?

我的应用程序中有很多查询,其中在 have 子句中,我将 count 聚合函数与 int 变量进行了比较。在查询计划中,我可以在比较之前看到一个implicit_convert。我想知道为什么会发生这种情况,因为根据 sql server 文档,count 函数的返回类型是 int。那么为什么要进行隐式转换来比较两个 int 值呢?

以下是一个这样的查询计划的一部分,其中 @IdCount 被定义为一个 int 变量。

|--过滤器(WHERE:([Expr1022]=[@IdCount]))    
 |--计算标量(DEFINE:([Expr1022]=CONVERT_IMPLICIT(int,[Expr1028],0))) 
  |--Stream Aggregate(GROUP BY:([MOCK_DB].[dbo].[Scope].[ScopeID]) DEFINE:([Expr1028]=Count(*)))

sql-server-2008 sql-server

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

将列别名放在列定义的开头或结尾有什么区别吗?

我总是看到并将我的列别名写为

SELECT 1 as ColumnName
Run Code Online (Sandbox Code Playgroud)

但是今天遇到了一个使用的查询

SELECT ColumnName = 1
Run Code Online (Sandbox Code Playgroud)

这两个查询的执行方式有什么不同吗?或者 DBA 之间是否有关于使用哪一个的标准?

我个人认为,第二个会更容易阅读/(很好的例子保持更长的列定义在这里这篇文章),但我从来没有见过,所以今天很奇怪,之前使用的第二语法,如果有某种原因,我不应该使用它。

sql-server best-practices t-sql

12
推荐指数
2
解决办法
2353
查看次数

未使用索引视图 - SQL Server

我有一个带有多个连接的查询,它需要很长时间才能返回一个日期的数据。我已经创建了一个索引视图。在创建视图和索引时,我适当地设置了所有必需的选项。

我想利用索引视图的优势,如果我在其他地方有类似的查询或完全相同的查询,查询优化器会选择索引视图,以便提高性能。我尝试使用用于创建索引的完全相同的查询(带有额外的日期过滤器),但查询计划似乎没有改变。即使我在查询中显式使用视图,视图上的索引仍未使用。我只能让查询优化器使用带有 noexpand 提示的索引。请注意,我使用的是 SQL Server 企业版。

有什么建议?

index sql-server view materialized-view

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

用于“已归档但可用”数据的 SQL Server 数据库设计

我们有这个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称之为“访问”。为了讨论,假设它是一个医疗实践的数据库。

共有30个访问“类型”,例如程序、年度、随访、免疫等,每个访问“类型”都是“访问”的子表,例如“visit_immuno”。

该数据库自 2000 年以来已经积累了大约 12 年的数据。有人建议我们将大约 3 年的数据保留在“实时”版本中,而将其余的数据保留在“旧数据”数据库中。日期仅存储在“访问”表中,因为它是标准化的。Visit 表还包含一个ROWVERSION列和一个BIGINT伪标识(集群)列。出于所有意图和目的,假设集群键由 SEQUENCE (SQL Server 2012 Enterprise) 填充 - 我们将其命名为cid

visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也有一些更新,这将导致ROWVERSION列与ciddate列不同步- 简单地说,由于这个原因,ROWVERSIONcid不会制作合适的分区键。

从“实时”中删除数据的业务规则是visit.date必须大于 36 个月并且visit_payment必须存在子记录。此外,“old_data”数据库不包含任何基表,除了visit%.

所以我们最终得到:

直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%

该提案要求一个组合数据库,它是一个外壳,其中包含(除外)中所有基表的同义词以及跨两个数据库中的表联合所有的视图Live DBvisit%visit%

假设在Old-Data数据库中创建了相同的索引,查询会在 UNION-ALL视图上表现良好吗?什么类型的查询模式可能会影响 UNION-ALL视图的执行计划?

database-design sql-server sql-server-2012

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

DELETE 语句与 REFERENCE 约束冲突

我正在尝试删除所有用户,但出现错误:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

查询:

DELETE FROM [workdemo.no].[dbo].[M06Persons] 
WHERE ID > '13'
GO
Run Code Online (Sandbox Code Playgroud)

似乎我需要使用,on delete cascade;但我被卡住了。

sql-server t-sql

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

链接服务器风险

我正在实施一项新功能,该功能需要来自多台服务器上的数据库的数据。我只需要合并来自所有这些服务器的数据并对其进行排序。想到的两个选项是:

  1. 使用链接服务器并编写一个简单的查询来合并和排序将从一台服务器运行并从其他服务器收集数据的数据。

  2. 使用应用程序从所有服务器收集数据,并将其发送回 SQL Server 进行排序(不想在应用程序中实现排序)。

我们在 SQL Server 2008 r2 的主动/主动集群中运行我们的服务器。所有数据库都具有相同的权限,如果您有权访问一个数据库/服务器,则您对它们都有权限。这是一个面向公众的应用程序(需要用户登录)。

使用链接服务器有哪些风险?是否有任何我应该关注的安全漏洞?在主动/主动集群中运行链接服务器是否有任何问题?与替代方案相比,是否存在任何重大的性能问题?

关于链接服务器似乎有普遍的负面“嗡嗡声”,但我找不到任何具体的东西让我相信那里有任何真正的担忧。

performance sql-server-2008 security sql-server linked-server

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

SQL Server 事务备份与日志

我继承了一个中等规模的业务关键型 SQL Server 2008 数据库,并且正在尝试围绕备份计划进行思考。(我是开发人员,不是 DBA。)

我们的系统现在设置的方式有两个备份系统:

  1. 每周完整备份 ( .bak) 和每小时事务日志 ( .trn) 备份。我们保留了多组这些备份,并定期将它们运往异地。
  2. SQL Server 日志 ( .ldf),恢复模式设置为Full. 此文件与主.mdf文件位于不同的驱动器上,但不会备份。

如果发生紧急恢复(或将备份恢复到开发机器),我的程序是使用这些.bak文件,然后应用 .trn 文件。我们有一个脚本可以使这个过程相对简单。

我的问题:

  1. 是否可以从.ldf文件中恢复数据库?它到底是为了什么?
  2. 拥有这两个事务日志是不必要的冗余吗?
  3. 备份.ldf文件很重要吗?

sql-server backup

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

tempdb 日志文件的最佳实践

我在这里和那里阅读了许多关于如何配置 tempdb 数据文件的博客,但我没有找到有关tempdb 日志文件的任何信息。

这是我目前在 tempdb 中使用的策略:

  • 我已经使用了Paul Randal关于如何拆分我的 tempdb 数据文件的建议
  • 我已将 tempdb 数据文件的大小设置为最大值并禁用自动增长。例如,我有 100gb 的可用磁盘空间并将我的 8 个 tempdb 数据文件的大小设置为每个 10gb。这可以防止Brent Ozar 推荐的磁盘碎片,而且我的日志文件还有 20gb 可用空间。

但就像我说的,没有人在谈论tempdb 日志文件。我该怎么办?在我的设置中,此文件与 tempdb 数据文件位于同一位置。我应该与 tempdb 日志文件一起使用的大小和自动增长值是多少?

sql-server sql-server-2012 tempdb

12
推荐指数
2
解决办法
3万
查看次数