标签: sql-server

这个while循环是否需要显式事务?

SQL Server 2014:

我们有一个非常大(1 亿行)的表,我们需要更新其中的几个字段。

对于日志运输等,我们显然也希望将其保持为一口大小的交易。

如果我们让下面运行一会儿,然后取消/终止查询,那么到目前为止所做的工作会全部提交,还是需要添加明确的 BEGIN TRANSACTION / END TRANSACTION 语句以便我们可以随时取消?

DECLARE @CHUNK_SIZE int
SET @CHUNK_SIZE = 10000

UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
where deleted is null or deletedDate is null

WHILE @@ROWCOUNT > 0
BEGIN
    UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01'
    where deleted is null or deletedDate is null
END
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql transaction sql-server-2014

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

找不到正在创建备份的进程

我们在客户服务器上安装了一个 SQL Server 2008 实例。客户的 IT 部门负责机器的各种备份。

SQL Server 日志显示每天晚上 7 点都有完整备份,但我们找不到在 SQL Server 中安排任何计划的证据。

我们联系的技术人员无法告诉我们是否有某种自动备份,他们只告诉我们整个机器正在备份。

使用我在这个论坛帖子中找到的脚本,我发现物理设备名称是一个 GUID,这意味着这是一个外部备份过程

USE [msdb]
GO 
SELECT 
    [bs].[database_name], 
    [bs].[backup_start_date], 
    [bs].[backup_finish_date], 
    [bs].Server_name,
    [bs].user_name AS [BackupCreator] ,
    [bmf].physical_device_name
FROM msdb..backupset bs  
INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] 
ORDER BY [bs].[backup_start_date] DESC
Run Code Online (Sandbox Code Playgroud)

这是上述查询中的一行:

db_name 2015-09-16 19:01:23.000 2015-09-16 19:01:28.000
SERVER_NAME NT AUTHORITY\SYSTEM
{424F084A-F35D-4A66-8FC7-0722778A859

此外,备份开始和完成日期仅跨越 5 秒,所以我想很明显这不是 sql server 的工作。

这是日志中的一行:

2015-09-03 19:02:30.71 备份
数据库备份。
数据库:db_name,创建日期(时间):2012/10/12(20:52:11),转储页面:3290021,
第一个 LSN:276028:152755:172,最后一个 LSN:276028:152827:1,转储设备数: 1、
设备信息:
(FILE=1, TYPE=VIRTUAL_DEVICE: {'{95380B0A-D50B-408F-B95F-1AB8975BA7F8}5'})。 …

sql-server-2008 sql-server backup

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

了解关闭“验证备份完整性”对 SQL 备份的影响/风险

目前我们对环境中的 SQL Server 2005/2008/2008R2/2012 服务器上的备份使用标准维护计划,并且始终选中“验证备份完整性”框。

有些备份运行时间很长,因此我建议关闭该选项,但管理层需要我记录此更改的影响和风险。

我了解此选项的使用和历史,对我来说似乎没有必要将备份作业的时间加倍(在我看来),任何可能发生的错误都可能发生在备份步骤期间,而不是在验证期间。

我错了吗?如果我备份到磁盘而不是流式传输磁带或其他东西,关闭它的风险是否最小?(如果相关,我们通过网络备份到 EMC DD-800 备份设备。)

是否有任何关于何时可以安全关闭此功能的官方 MS 建议?

您是否对环境中的每个备份运行“验证”?你抽查他们吗?

编辑:澄清一下,当您在维护计划中检查“验证备份完整性”时,SQL 将在每次备份后立即对每个数据库执行完整的RESTORE VERIFYONLY。这与原始备份一样是数据/IO 密集型,并且(基本上)使备份作业的总时间加倍。这是一样的使备份的“校验”选项(不能在向导中进行,因为据我所知)。

sql-server backup

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

从生产中仅刷新测试数据库中的几个表的最佳方法是什么?

我在 SQL Server 2008R2 中有一个非常大的生产数据库和一个非常大的测试环境数据库。两个数据库具有相似的表结构,但不同的用户/登录名/权限/角色。

我只需要定期从生产中刷新测试数据库中的几个表,大约每月一次。

我目前计划这样做的方式是

  1. 使用 BCP 实用程序从生产中导出我需要的表。
  2. 将 bcp 导出文件复制到测试服务器上
  3. 禁用我在测试中刷新的所有表的索引和约束
  4. 截断测试数据库表
  5. 使用 BCP 将数据加载回测试数据库表。
  6. 在测试中重建索引并重新启用约束

对于这么小的任务来说,这一切似乎有点太复杂了。它似乎也会产生很多重做(在 t-log 中)有没有更好的方法来做到这一点?

我想到的另一种方法是将备份从生产恢复到测试环境 - 但我遇到的问题是完整备份会非常大,我不需要刷新所有表,只需要刷新几个 - - 而且生产数据库中的用户和安全性与测试不同。如果我恢复整个数据库,这将被生产数据库中的安全设置覆盖。

sql-server-2008 sql-server

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

如何检查与 Sql Server 的连接是否加密?

在 SQL Server 中,我可以在协议设置中“强制加密”。如果我将该设置保留为“否”,则任何客户端仍可能需要加密。

我能以某种方式查看到数据库的哪些连接正在使用加密吗?

sql-server encryption connections

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

为什么此 UPDATE 因违反唯一键约束而失败?

我是一名“偶然”的 DBA,相对缺乏经验并且对这个问题感到困惑。

运行 MS SQL Server 2012。问题在于这个 UPDATE 语句:

UPDATE dbo.tAccts SET
       Ticket               = 'ARP.ExGE'
       , Method             = 'smtp'
       , AcctOwner          = 'r00417819'
       , DisplayName = '~AppLight HBSFax-Inactive'
       , Destination = 'r00417819@mail.ad.ge.com'
       , UpdatedBy          = SYSTEM_USER
       , UpdatedOn          = CAST(GetDate() AS DATE)
FROM dbo.vReclaimable
WHERE OHR_EmpStatus <> 'A'
Run Code Online (Sandbox Code Playgroud)

应该更新tAccts 表中由 vReclaimable 视图返回的行。

vReclaimable 视图基于 tAccts 表并返回 tAccts 中行的子集。

当我运行它时,它失败并显示唯一键错误:

(0 row(s) affected)
Msg 2627, Level 14, State 1, Line 67
Violation of UNIQUE KEY constraint 'UQ__tAccounts_DNIS.Method.Destination.Phones'. Cannot …
Run Code Online (Sandbox Code Playgroud)

sql-server constraint view update unique-constraint

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

在线时将 SQL Server 数据库移动到新磁盘

我有一个 1.4TB 的 SQL Server 数据库,它在磁盘 I/O 方面遇到了很大的困难。我们已经在服务器中安装了一个新的 SSD 阵列,它将解决我们所有的问题,我们只是在讨论移动数据库的最佳方式。理想情况下,如果我们可以在不停机的情况下完成这项工作,那就最好了。但是,如果要在两天性能不佳(例如复制数据时)与两小时停机时间之间进行选择,则后者可能更可取。

到目前为止,我们提出的解决方案是:

  • 简单的复制。使数据库脱机,复制文件,更改 SQL Server 中的位置并使其重新联机。粗略的数字估计这最多需要五个小时,这不是真的可以接受,但这是最简单的解决方案。

  • 块级复制。使用类似 rsync 的实用程序,我们在数据库启动时在后台复制文件。当我们准备好迁移时,我们使数据库脱机,使用此实用程序进行差异复制,然后将 SQL 服务器指向新文件并使其联机。这里的时间未知。我们不知道对 1.4TB 进行差异分析并复制它需要多长时间。我们的另一个担忧是块级副本会使文件处于 SQL Server 无法读取的某种状态,我们将浪费时间。

  • SQL 迁移。在新磁盘上创建一个新的 1.4TB SQL 数据文件并禁用所有其他文件的自动增长。然后依次对所有其他数据文件运行 DBBC SHRINKFILE(-file_name-, EMPTYFILE)。处理完所有数据后,我将在某个时间点使用预定窗口将 MDF 文件移至 SSD 并删除其他未使用的文件。我喜欢这个,因为它最大限度地减少了停机时间。但我不知道这需要多长时间,以及它在发生时是否会导致性能下降。

我们没有任何类型的负载和性能环境来测试这个。我可以验证这些策略是否适用于我们的暂存环境,但不是影响,而不是性能。

sql-server ssd

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

从哪里开始了解未知数据库

所以,标题总结了它。

我有一个包含 28 个表和 86 个必须进行逆向工程的存储过程的 SQL Server 数据库。我很确定有些表从未使用过,并且并非所有 proc 都使用过。

最大的问题是所有创建用于此数据库的 Windows 服务以及所有软件和数据库文档都丢失了,并且无处可寻设计整个系统的人。

我已经设法创建了一个 ER 图来帮助我理解这些关系,但是由于我没有数据库管理经验,我不知道应该从哪里开始。

如果不打算在这里问这种问题,我也很抱歉。

sql-server documentation

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

如何通过 UNPIVOT(循环连接)使用批处理模式?

我有以下形式的查询:

SELECT ...
FROM ColumnstoreTable cs
CROSS APPLY (
    SELECT *
    FROM (VALUES
        ('A', cs.DataA)
        , ('B', cs.DataB)
        , ('C', cs.DataC)
    ) x(Col0, Col1)
) someValues
Run Code Online (Sandbox Code Playgroud)

这从 Columnstore 支持的子查询 ( ColumnstoreTable) 中获取每一行并将这些行相乘。这本质上是一个UNPIVOT. 真正的查询比这更大。这部分查询会进入其他处理。

这里的问题是这CROSS APPLY是作为一个循环连接实现的,这是一个合理的选择。不幸的是,循环连接不支持批处理模式。

这部分查询对性能非常关键,我怀疑以批处理模式运行它可能对性能非常有益。

我怎样才能重写这个查询,这样我就不会退出批处理模式?

我确实尝试使用临时表而不是VALUES,但这并没有改变这样一个事实,即没有相等连接条件来进行哈希连接。

sql-server columnstore unpivot sql-server-2014 batch-mode

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

在一行的一个字段中存储多个值而不是作为单独的行存储多个值的可能好处

在我们上一次每周例会上,一个没有数据库管理背景经验的人提出了这个问题:

“会不会有一种情况证明将数据存储在行(字符串)而不是多行中是合理的?”

让我们假设有一个表,称为countryStates我们想要存储一个国家的州的位置;我将在这个例子中使用美国,为了懒惰,不会列出所有的州。

在那里我们会有两列;一个叫Country,另一个叫States。正如这里所讨论的,以及@srutzky 的回答所提出的,这PK将是ISO 3166-1 alpha-3定义的代码。

我们的表看起来像这样:

+---------+-----------------------+-------------------------------------------------------+
| Country | States                | StateName                                             |
+---------+-----------------------+-------------------------------------------------------+
| USA     | AL, CA, FL,OH, NY, WY | Alabama, California, Florida, Ohio, New York, Wyoming |
+---------+-----------------------+-------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

当向一位开发人员朋友提出同样的问题时,他说从数据流量大小的角度来看,这可能有用,但如果我们需要操纵这些数据,则不是。在这种情况下,应用程序代码必须有智能,可以在列表中转换此字符串(假设有权访问此表的软件需要创建一个组合框)。

我们得出的结论是这个模型不是很有用,但我怀疑可能有办法让它有用。

我想问的是,你们中是否有人已经以真正有效的方式看到、听到或做过这样的事情。

database-design sql-server denormalization

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