小编Bra*_*adC的帖子

我怎么知道为什么某个表上的插入很慢?

我知道 SQL 表上的 INSERT 可能由于多种原因而变慢:

  • 表上存在 INSERT TRIGGERs
  • 许多必须检查的强制约束(通常是外键)
  • 在表中间插入一行时聚集索引中的页面拆分
  • 更新所有相关的非聚集索引
  • 阻止桌子上的其他活动
  • IO 写响应时间差
  • ......我错过了什么?

在我的特定情况下,我如何判断哪个负责?如何衡量页面拆分与非聚集索引更新与其他所有内容的影响?

我有一个存储过程,一次插入大约 10,000 行(来自临时表),每 10k 行大约需要 90 秒。这是令人无法接受的缓慢,因为它会导致其他 spid 超时。

我查看了执行计划,我看到了 INSERT CLUSTERED INDEX 任务和 FK 查找中的所有 INDEX SEEKS,但它仍然没有确切地告诉我为什么需要这么长时间。没有触发器,但该表确实有一些 FKey(似乎已正确索引)。

这是一个 SQL 2000 数据库。

sql-server insert sql-server-2000 database-tuning

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

我应该使用哪种 PowerShell 技术来与 SQL Server 通信?

我最终想使用 PowerShell 来替换我们用于 SQL 实例监视器的旧 KornShell 脚本。但是,我很难让我的大脑围绕 PowerShell 实际与 SQL Server 通信的所有不同方式。不确定这是否是全部,但我可以通过以下 5 种完全不同的方式查询 SQL 服务器的版本:

1. SQLConnection .NET 类

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=MyServer;Database=Master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "Select @@version as SQLServerVersion"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]
Run Code Online (Sandbox Code Playgroud)

2. WMI 提供程序

$sqlProperties = Get-WmiObject 
    -computerName "MyServer"
    -namespace root\Microsoft\SqlServer\ComputerManagement10
    -class SqlServiceAdvancedProperty
    -filter "ServiceName = 'MSSQLSERVER'"
$sqlProperties.VERSION
Run Code Online (Sandbox Code Playgroud)

3. SMO

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null
$smo-var = New-Object …
Run Code Online (Sandbox Code Playgroud)

monitoring sql-server powershell

30
推荐指数
1
解决办法
9331
查看次数

列与字段:我是否错误地使用了这些术语?

我在这里感到有点尴尬,我一直将术语“列”和“字段”完全互换使用,这在最近的技术讨论中引起了一些混乱。

但是,有人告诉我,这是不正确的,它应该是(将每个术语翻译成电子表格术语,忽略数据类型和所有其他使数据库有用的东西):

  • 数据库列:就像电子表格列
  • 数据库记录:就像一个电子表格行
  • 数据库字段:就像电子表格“单元格”(特定行的特定列)

这是正确的吗?我可以发誓,列和字段比这更可互换使用。我当然去过。

所以我们向表中添加字段,而是向表中添加,并且字段仅在谈论记录中的数据时才相关?

关于列与字段的其他想法?

编辑:澄清一下,当前上下文是 MS SQL Server。我在 SQL Server 之前的背景是 MS Access,这可能会影响我对这些术语的使用。

terminology fields

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

将表移动到另一个 SQL2008 数据库(包括索引、触发器等)

我需要将一大堆(100+)大(数百万行)表从一个 SQL2008 数据库移动到另一个数据库。

我最初只是使用导入/导出向导,但所有目标表都缺少主键和外键、索引、约束、触发器等(身份列也被转换为普通的 INT,但我想我只是错过了向导。)

这样做的正确方法是什么?

如果这只是几个表,我会回到源,编写表定义(包含所有索引等)的脚本,然后在目标上运行脚本的索引创建部分。但是有这么多表,这似乎不切实际。

如果没有太多数据,我可以使用“创建脚本...”向导来编写源代码,包括数据,但是 72m 行脚本似乎不是一个好主意!

sql-server-2008 sql-server migration

16
推荐指数
4
解决办法
3万
查看次数

如何确定 SQL 数据库文件中的已用/可用空间?

我通常使用以下方法来确定数据库的每个文件中的可用/已用空间:

Select *, fileproperty(name, 'SpaceUsed') as Used
From dbo.sysfiles
Run Code Online (Sandbox Code Playgroud)

这将返回页面中的总空间和已用空间,然后乘以 8 得到 KB(或除以 128.0 得到 MB)。

我找到了另一个脚本,而不是使用DBCC showfilestatsdbcc sqlperf(logspace)返回 TotalExtents 和 UsedExtents,然后可以乘以 64 得到 KB(或除以 16.0 得到 MB)。

忽略额外的列,这两个是否总是为空闲/总空间提供相同的值?怎么样sp_spaceused

它们的准确性是否都取决于最近的 DBCC UPDATEUSAGE?

是否有另一种更好的方法来确定已用/可用空间?(我需要这个脚本在 SQL 2000、2005 和 2008 服务器上工作)

部分相关:你能有一个部分分配的范围吗?(例如,仅分配了一个范围内的 8 个页面中的 3 个)

sql-server

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

作为 SQL Server DBA,我需要了解有关崩溃/幽灵漏洞的哪些信息?

如果您没有听说过,最近发现了一组相关漏洞,这些漏洞影响了过去十年中销售的几乎所有处理器。您可以在 InfoSec.SE 上找到有关崩溃/幽灵漏洞的更多技术细节

作为 SQL Server DBA,我需要了解什么?

如果我们不与其他公司共享我们的 SQL Server(或我们的虚拟机群),这是否仍然存在风险?

这只是一个操作系统补丁吗?或者是否有可用于解决此漏洞的 SQL Server 补丁/修补程序?将修补哪些 SQL Server 版本?

一些文章预测了 5-30% 的性能影响,尤其是在高度虚拟化的环境中。有什么方法可以预测对我的 SQL Server 的性能影响可能是什么?

sql-server patching

14
推荐指数
1
解决办法
2204
查看次数

如何在区分大小写的数据库中执行不区分大小写的 LIKE?

我的供应商要求数据仓库数据库区分大小写,但我需要对其进行不区分大小写的查询。

在区分大小写的数据库中,您如何将其编写为不区分大小写?

    Where Name like '%hospitalist%'
Run Code Online (Sandbox Code Playgroud)

sql-server collation like

14
推荐指数
3
解决办法
7万
查看次数

更改“sa”密码是否需要重新启动 SQL(在混合模式下)?

我们发现 SQL "sa" 帐户的使用方式不该使用,因此我们正在更改所有 SQL 实例的 sa 密码。

(我们有 SQL 2005 到 2017 服务器以混合身份验证模式运行。所有用户和应用程序都应该使用域帐户或非 sa SQL 帐户进行连接。我一直在监视,但没有发现任何其他应用程序、用户或非- 使用 sa 帐户的内部 spid。)

几个问题:

Q1:更改 sa 密码是否需要重新启动 SQL?

我发现一些参考资料说更改 sa 帐户密码后需要重新启动 SQL 服务:

真的吗?还是仅当我更改身份验证模式时?还是仅当我经常以 sa 身份登录时?

这个 SQL Server Central 线程甚至建议更改它可能会影响现有的 SQL 代理作业和其他东西;这是一个问题吗?或者仅当有人将 SA 帐户硬编码到 SSIS 包中时?

(以防万一,我们为 SQL 服务和 SQL 代理服务使用域帐户,为调用 SSIS 包或 PowerShell 脚本的作业使用域代理帐户。)

问题 2:我可以以“正常”方式更改 sa 密码吗?

我可以像重置任何其他帐户一样重置它吗?使用 SSMS,或更可能通过:

ALTER LOGIN sa WITH PASSWORD = 'newpass'; …
Run Code Online (Sandbox Code Playgroud)

security sql-server best-practices

14
推荐指数
2
解决办法
2994
查看次数

主数据库已损坏,实例无法启动 - 我有哪些选择?

帮助!我的主数据库损坏了,我什至无法使 SQL 实例联机!我有哪些选项可以让我的服务器备份?

我确实有 master 的备份,但是MSDN 页面“恢复 master 数据库”要求我以单用户模式启动实例,我做不到!

(注意:我不指定 SQL 版本的这个问题,以便作为更广泛适用的参考。在 DBA.SE 上有一些类似的问题,但没有涉及服务器无法启动的问题。)

sql-server corruption master-system-database

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

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

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

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

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

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

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

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

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

sql-server backup

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