标签: sql-server-2012

对多个 tempdb 文件的建议

我想tempdb分成两个大小相同的文件,以提高数据库的性能。

我想知道这两个数据文件是否可以在同一个磁盘上,与日志和用户数据文件分开?

sql-server sql-server-2012 tempdb

6
推荐指数
1
解决办法
2281
查看次数

创建/更新代理帐户的 SQL Server 2012 凭据时出现“损坏的密钥”错误

在重新启动无响应的主机 WINTEL 服务器导致 SQL Server 2012 SP3 实例重新启动后,我有一个 SQL 代理日志传送复制作业(它使用代理帐户访问日志备份所在的 NAS 文件共享)因此错误而失败:

验证代理 MyDomain\MyProxyAccount 时出错,系统错误:用户名或密码不正确。

我试图将正确的密码重新应用到代理的凭据并重新创建一个新的凭据,但都因此错误而失败:

此操作所需的密钥似乎已损坏。(Microsoft SQL Server,错误:15507)

我读过一个 MSDN 页面,上面写着:

SQL Server 使用加密密钥来帮助保护存储在服务器数据库中的数据、凭据和连接信息。服务主密钥在 SQL Server 实例首次启动时自动生成,用于加密链接服务器密码、凭据和数据库主密钥。

我不确定如何继续。我的服务主密钥有问题吗?如果是这样,有人可以建议如何解决此问题或指导我在线进一步阅读吗?

更新:我发现 SQL Server 日志中的条目(在主机 WINTEL 服务器重新启动后重新启动实例时写入)进一步表明问题出在服务主密钥上:

无法使用其加密之一解密服务主密钥。服务主密钥初始化期间发生错误。

我仍然欢迎任何关于如何解决这个问题的建议......

authentication sql-server sql-server-2012

6
推荐指数
1
解决办法
2881
查看次数

在具有约 250 万行的表中查找缺失的数据间隙

我在一家经济咨询公司工作,我们所有的数据都保存在 SQL Server 11 (2012) 中。我们的数据基本上由一个日期列、一个原始数据列、几个计算列和一个具有用于区分每组数据和下一组数据的短代码的列组成。

我们有数千个这样的集合,它们都加载到同一个表中(总共约 250 万行),然后从查询中提取和排序。它们通常按日期排序,从第一个月开始,逐月移动到最后一个月。每个系列的开始和结束日期从一年到 100 多年不等。

最近,我们遇到了一些随机数据部分消失的问题。整行只是向上和离开,这使得找到这些丢失的行有点困难,而无需每个月都检查是否丢失了一个月,这对于 250 万行的表来说是一项有点不可能完成的任务。

我的老板让我编写一个查询/存储过程,它将查看这个巨大的表并查看哪些集合缺少行以及它们在哪里。

我一直在努力解决这个问题,这个问题有点超出我的 SQL 技能,我似乎无法在网络上的任何地方找到任何有类似问题的人。我将经历我已经拥有的东西,也许有人至少可以告诉我我是否朝着正确的方向前进,并可能提供一些关于我应该从哪里开始的见解。

我在网上找到的最佳解决方案是使用 CTE 创建一个临时日期表,然后将它们与原始表进行比较。如果我只是扫描一个特定数据集中的问题,这很有效,但我在同一个表中有许多数据集,所有数据集都有不同的开始和结束日期。所以我还是选择了它,希望我最终可以扩展它以搜索其中的很多。这是我的代码:

declare @startDate Date, @endDate Date 
set @startDate = '2000-01-01'
set @endDate = '2016-11-01'

;with GetDates As  
(  
select @startDate as TheDate
UNION ALL  
select DATEADD(MONTH,1, TheDate) from GetDates
where DATEADD(MONTH,1, TheDate) <= @endDate
)

SELECT TheDate,SHORTCODE,MonthYear 
From GetDates
LEFT OUTER JOIN VWTBL_INDICATOR
ON GetDates.TheDate=VWTBL_INDICATOR.MonthYear
AND VWTBL_INDICATOR.SHORTCODE='RMI WEST'
OPTION(MAXRECURSION 1000)
Run Code Online (Sandbox Code Playgroud)

'RMI West' 将是标记此特定数据集的短代码,它缺少从 2004 年 11 月到 2005 年 3 …

sql-server sql-server-2012 gaps-and-islands

6
推荐指数
2
解决办法
6294
查看次数

N次登录尝试失败后如何锁定sql登录

考虑我有一个名为 sql_login 的登录名。登录尝试失败sql_login后,我可以锁定登录吗5

当我们创建登录时,我们可以看到有一个名为密码策略检查图像的选项。但是没有提到锁定密码

在此处输入图片说明

N尝试登录失败后,Sql Server 中是否有锁定登录的选项

sql-server sql-server-2012 logins password

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

优化表/索引以获取最新行(按额外的一列过滤)

我有一个 SQL Server 表(SQL Server 2012 SP3 标准版),它存储了不同组织的一堆配置信息(基本上是文本 blob)。架构是这样的:

[ConfigurationID]       INT IDENTITY (1,1) NOT NULL,
[OrganizationID]        INT NOT NULL,
[TimestampUtc]          DATETIME NOT NULL,
[ConfigurationData]     NVARCHAR (MAX) NOT NULL,
[ChangedBy]             NVARCHAR (256) NOT NULL,
[Comment]               NVARCHAR (MAX) NOT NULL,
[ChangeType]            INT NOT NULL
Run Code Online (Sandbox Code Playgroud)

TimestampUtc会一直增加(我将永远不会成为插入“回过时”的条目到表),行永远不会被更新(我只插入新行)。对于某些OrganizationIDs 会有很多行,对于一些非常少,并且OrganizationID任何时候都可能会插入一个新行。

如果需要,我可以保证的唯一性TimestampUtc(但如果有一个不需要的解决方案会很棒)。

INSERT 相对较少(每天最多几十次,但通常比这少得多),读取非常频繁(基本上是对我的应用程序的每个 Web 请求)。

我的目标是:

  • 无论表的大小如何,获取给定ConfigurationData的最新信息都应该非常快TimestampUtcOrganizationID
  • INSERT 性能并不重要,但我想尽可能避免可怕的索引碎片(所以我对唯一聚集索引的第一个想法OrganizationID ASC, TimestampUtc DESC可能不是一个好主意)。

问题

我知道我可以非规范化并只将最新ConfigurationData值存储在一个表中,并将先前值的历史日志存储在另一个表中,但是仅使用一个表是否可以实现我的目标?最好的方法是什么?(即最好的索引结构是什么?我需要更改有关表架构等的任何内容吗?)

performance index database-design sql-server sql-server-2012

6
推荐指数
1
解决办法
125
查看次数

有多少 VLF 可能是坏的

我有一个大小为 840 GB 的数据库,其中有 948 个 VLF。另一方面,有一个大小为 1.6 TB 的有 320 个 VLF。这是否表明具有大量 VLF 的较小数据库实际上是一个问题?另外我们如何确定该数字太大或在OK范围内。

请建议

performance sql-server sql-server-2012

6
推荐指数
2
解决办法
3862
查看次数

部分唯一检查约束

我有一个正在迁移到 SQL Server 的旧 Access 表,其中有一个名为“LinkedID”的字段。这个字段在大约 5 年前大部分时间都没有使用,因此对于许多历史记录,它要么为空,要么默认为“00000000”。但是,展望未来,我们希望将其设置为不允许重复值(假设 1,000 条记录为空,500 条记录为“00000000”,大约 10,000 条是我们想要的实际唯一值)。

调查它,因为我有多个记录设置为“00000000”和多个为空,我知道我不能使用唯一约束。有没有一种方法可以创建一个检查约束来检查插入/更新的值是否唯一(如果不是全部为 0 或为空)?或者如果它不能通过检查约束工作,我的另一个想法是可能使用插入/更新触发器以某种方式验证数据?

sql-server constraint sql-server-2012 check-constraints

6
推荐指数
1
解决办法
899
查看次数

从包含 LOB 的表中删除数据不会减少表或数据库内部报告的数据量

运行 SQL Server 2012 标准,同时使用复制数据和日志传送。每隔几分钟创建一次事务日志备份。

这个问题与文件系统报告的空间量无关。

我们有一个包含四个 VARCHAR(max) 列的日志表。该表目前包含大约 180 GB 的数据。该表以每月大约 10 GB 的速度增长。

为了为未来的增长腾出空间,我最近删除了(在 36 小时内以块为单位)接近 30% 的数据。

根据表的大小和删除的行数,我预计表的大小将减少大约 55-60 GB。我通过抽取样本并计算平均行大小,然后将其乘以要删除的行数来验证这一点。但是,删除完成后,表大小并没有改变。

虽然我不希望缩小 .mdf 文件的大小,但我确实检查了数据库是否有任何可以缩小的可用空间,但可用空间为 0%。

所以 - 我很困惑。我已经验证我从表中删除的数据不再存在。我什至将它与备份进行了比较,以获得前后对比。数据库中的行数发生了变化,但表的数据空间并没有减少。

我的问题是:
1)为什么从表中删除数据没有减少表的大小?
2)我能做些什么来实际减少表格的大小?

编辑:

  • 我通过调用 sp_spaceused 'tablename' 来确定表使用的空间。
  • 我在调用 sp_spaceused 之前使用了 dbcc updateusage (0, tablename)。
  • 我不想释放磁盘空间 - 尽管分析表明有 0% 的空间可供回收。
  • 我已经使用( LOB_COMPACTION = ON )运行了一个索引重组。碎片率低于 1%。
  • 表不是堆。表定义如下。
 CREATE TABLE [dbo].[LARGE_LOG_TABLE](
  [ID] [varchar](36) NOT NULL,
  [DOC_ID] [varchar](36) NOT NULL,
  [REQUEST_DATA] [varchar](max) NULL,
  [REQUEST_DATA_XSLT] [varchar](max) NULL,
  [RESPONSE_DATA] [varchar](max) NULL,
  [RESPONSE_DATA_XSLT] [varchar](max) NULL, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 standard-edition

6
推荐指数
1
解决办法
1384
查看次数

为什么这说没有连接谓词?

我的执行计划发布在 PasteThePlan.com 上。在第二个嵌套循环警告没有联接谓词。我还是新手,所以我很困惑。那是因为我使用 CTE 来确定两个属性的值吗?这个演示表格用于更多的报告,我不想为这个非常独特的报告创建第二个。

这是查询:

WITH Accumulators AS
(
 SELECT DISTINCT AreaNum, SuperintendentNum, SuperName
   FROM FI.SLAnalysis
  WHERE SuperName LIKE '%ACCUM%'
)
SELECT
    slard.[IO]
  , slard.PhaseName             AS PhaseName
  , slard.JobNum              AS JobNum
--  , slard.JobName              AS JobName
  , CASE
   WHEN SUBSTRING(JobNum, 5, 2) IN ('05', '06')
    THEN ac.SuperintendentNum
   ELSE slard.SuperNum
     END                AS SuperNum
  , CASE
   WHEN SUBSTRING(JobNum, 5, 2) IN ('05', '06')
    THEN ac.SuperName
   ELSE slard.SuperName
     END                AS SuperName
  , slard.AreaNum              AS AreaNum
  , slard.AreaName             AS AreaName
  , …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2012

6
推荐指数
1
解决办法
1243
查看次数

为什么虚拟日志文件并不总是按顺序分配?

每季度,我通过 CMS 使用来自github 上的tigertoolbox/Fixing-VLFs/的查询检查我所有服务器上的 VLF 。这包括用于更正所发现内容的建议(和代码)。在进行任何调整之前,我总是尝试充分了解正在发生的事情。我应用的 VLF 解决方案在 90% 的情况下与建议不同,尽管它通常很接近。

使用DBCC LOGINFO我发现有几个 VLF 没有按顺序使用。我试图理解为什么。这个高度投票的答案; 即使在 BACKUP LOG TO DISK说它可能发生后,日志文件上的 DBCC SHRINKFILE 也不会减小大小 ,但不是为什么。

因为虚拟日志文件并不总是按顺序分配的,

这似乎与Jonathan Kehayias相冲突;一天的 XEvent(31 个中的 23 个)——它是如何工作的——多个事务日志文件

我们可以看到,在 130 VLF 中,目前仅使用了两个(第 51 和 52 行)。最大的 FSeqNo 是 41808,减去 130 = 41678。我没有看到任何低于 41678 的 FSeqNo,所以大概在最近的 130 次 VLF 翻转中都使用了。

如果我们查看第 108 - 109 行,我们会看到第 110 行首先被写入,然后是第 109 行,然后是第 108 行。而且奇偶校验关闭(不确定这会增加场景的内容)LSN 显示它们是在相反的位置创建的命令。

在此处输入图片说明

我希望一旦导致顺序中断的原因过去了,下一次通过 VLF 将按创建的顺序写入。为什么不是?

注意第 86 …

sql-server sql-server-2012 transaction-log

6
推荐指数
1
解决办法
1087
查看次数