标签: sql-server

我应该如何在我的 SQL Server 上配置 SSD 驱动器的 RAID 阵列?

我正在构建一个带有 48 GB RAM、1 个 CPU 和 8 个 SATA III (6GB/s) SSD 驱动器 (128 GB Crucial m4) 和一个 LSI MegaRAID 控制器 (SAS 9265-8i) 的 SQL Server。我希望典型的工作负载主要是读取。会有一些较重的写入活动(每小时数据与 3rd 方数据提供商同步 - 每晚备份),但我怀疑典型的读/写比率约为 90% 读取/10% 写入。

选项 1:
逻辑驱动器 C:- RAID 1(2 个物理驱动器)- OS
逻辑驱动器 D:- RAID 10(6 个物理驱动器)- DB 文件/日志/tempdb/备份?

或者

选项 2:
逻辑驱动器 C:- RAID 1(2 个物理驱动器)- OS
逻辑驱动器 D:- RAID 1(2 个物理驱动器)- Db 文件
逻辑驱动器 E:- RAID 1(2 个物理驱动器)- 日志文件/备份?
逻辑驱动器 F:- RAID 1(2 个物理驱动器)- tempdb

或者

选项 3: …

sql-server configuration

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

SQL Server 如何知道谓词是相关的?

在诊断基数估计不佳的 SQL Server 2008 R2 查询(尽管有简单的索引、最新的统计数据等)和查询计划不佳时,我发现了一篇可能相关的知识库文章: FIX:运行查询时性能不佳包含 SQL Server 2008 或 SQL Server 2008 R2 或 SQL Server 2012 中的关联 AND 谓词

我可以猜测知识库文章中“相关”的含义,例如谓词#2 和谓词#1 主要针对相同的行。

但我不知道 SQL Server 是如何知道这些相关性的。表是否需要包含来自两个谓词的列的多列索引?SQL 是否使用统计信息来检查一列中的值是否与另一列相关?还是使用了其他方法?

我问这个有两个原因:

  1. 确定使用此修补程序可以改进我的哪些表和查询
  2. 知道我应该在索引、统计等方面做些什么来影响 #1

performance sql-server statistics sql-server-2008-r2 query-performance

15
推荐指数
1
解决办法
1611
查看次数

还原数据库时NORECOVERY和RECOVERY有什么区别?

任何人都可以解释主要区别吗?

任何帮助表示赞赏。

sql-server

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

由于磁盘空间不足,无法为数据库分配新页面

使用 SQL Server 导入和导出向导,我收到此错误:

错误 0xc0202009:数据流任务 1:SSIS 错误代码 DTS_E_OLEDBERROR。
发生 OLE DB 错误。错误代码:0x80004005。
由于文件组“PRIMARY”中的磁盘空间不足,无法为数据库“database”分配新页。通过删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建必要的空间。

我正在尝试上传一系列 2GB 文件,在加载第 4 个文件时,即使在我转到数据库属性 > 文件并将文件组的自动增长更改为 2500 MB 和 maxsize 无限制后,我仍然继续收到上述错误消息。

最好的解决方法是什么?这些数据最终将占用大约 60-80GB。

sql-server

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

撕裂页面检测和校验和是什么时候引入 SQL Server 的,升级行为是什么?

现代 SQL Server 中有两种不同的页面验证选项;被撕裂页面检测和校验和。无当然也是一种选择。

我相信校验和是在 SQL Server 2005 中引入的,并且从先前版本升级或恢复数据库将保持其先前的页面验证方法。即没有隐式升级。

所涉及的问题是我们有一个生产数据库,该数据库使用 SQL Server 2000 投入生产,此后转移到 SQL Server 2008 R2 服务器。当我一直期望它是Torn Page Detection时,页面验证被设置为None。回顾这段时间,我们似乎认为 DB 最初是在 SQL Server 7.0 中开发的,然后迁移到 SQL Server 2000,这可以解释观察到的结果。

我想知道撕裂页面检测和校验和何时成为 SQL Server 的一项功能,以及它们在迁移或升级到新版本时的表现。

编辑:总结一些答案:

撕裂页面检测进入 SQL Server 的某些日期存在一些差异。
链接 1:http : //support.microsoft.com/kb/230785
链接 2:http : //technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx

第一个链接指示 SQL 7.0 和第二个 SQL2000。我倾向于相信 SQL7.0 的建议,并且链接 2 对它在 SQL7.0 中默认关闭而在 SQL2000 中默认打开感到困惑。

sql-server

15
推荐指数
2
解决办法
7898
查看次数

检测 SQL Server 表中的更改

在我的应用程序中,有一个运行在 SQL Server 2012 上的数据库,我有一个作业(计划任务),它定期执行一个昂贵的查询并将结果写入一个表,稍后可以由应用程序查询。

理想情况下,我只想在自上次执行查询后发生更改时运行该昂贵的查询。由于源表非常大,我不能只选择所有候选列的校验和或类似的东西。

我有以下想法:

  • 每当我更改源表中的某些内容时,将上次更改的时间戳、“必须是查询”标志或类似内容显式写入跟踪表。
  • 使用触发器来做同样的事情。

但是,我真的很想知道是否有一种轻量级的方法来检测表上的更改,而无需我明确跟踪写入。例如,我可以获取ROWVERSION表格的“当前”或类似的信息吗?

sql-server sql-server-2012 change-tracking

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

从非系统管理员域用户拥有的 SQL 代理作业运行 SSIS 包

我有两个 SSIS 包,它们作为更大的 SSIS 部署的一部分在夜间(通过 SQL Server 代理)运行,没有任何问题。一切都使用 Windows 身份验证,计划作业由系统管理员(好吧,我)拥有并作为SQL Server 代理服务帐户运行。

因此,数据基本上在source system ~> transit db ~> staging ~> NDS一夜之间消失了。

我关心的两个 SSIS 包分别处理一组特定数据的transit db ~> staging和staging ~> NDS部分。

域用户(非系统管理员)在 中执行某些操作source system并将有趣的数据推送到 中transit db,因此我需要一种方法来在工作时间内获取此更新的数据以更新NDS:决定此人触发的最简单方法该 ETL 是通过单击启用宏的 Excel 工作簿中的按钮来实现的,该工作簿通过 ODBC(使用 Windows 身份验证)连接到 SQL Server 并执行存储过程。

存储过程如下所示:

create procedure dbo.UpdateMaterialInventory
as
begin
    execute msdb.dbo.UpdateMaterialInventory;
end
Run Code Online (Sandbox Code Playgroud)

[msdb] 中的“姐妹”存储过程如下所示:

create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
    execute msdb.dbo.sp_start_job …
Run Code Online (Sandbox Code Playgroud)

sql-server permissions ssis sql-server-agent sql-server-2014

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

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 不使用 (A,B,C) 上的索引

考虑这两个函数:

ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C)

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C)
Run Code Online (Sandbox Code Playgroud)

据我了解,它们产生完全相同的结果。换句话说,您在PARTITION BY子句中列出列的顺序无关紧要。

如果有一个索引,(A,B,C)我希望优化器在两个变体中都使用这个索引。

但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。

我在 SQL Server 2008 Standard 和 SQL Server 2014 Express 上见过它。

这是我用来重现它的完整脚本。

在 Microsoft SQL Server 2014 上试用 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation Express Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack 1)

和 Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 …

sql-server-2008 sql-server sql-server-2014

15
推荐指数
1
解决办法
9416
查看次数

SQL Server 压缩索引在重建时是否保持压缩状态而不指定数据压缩?

使用页面压缩 ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE))重建其 SQL Server 索引后,后续重建(如某些维护脚本超过某个碎片阈值所做的那样)是否需要再次指定数据压缩?否则索引会被有效地解压吗?

index sql-server data-pages compression

15
推荐指数
1
解决办法
3921
查看次数

尝试回收未使用的空间会导致 SQL Server 中的已用空间显着增加

我在生产数据库中有一个表,其大小为 525 GB,其中 383 GB 未使用:

未使用的空间

我想回收其中的一些空间,但是,在弄乱生产数据库之前,我正在测试数据库中数据较少的相同表上测试一些策略。这个表有一个类似的问题:

未使用的空间

关于表的一些信息:

  • 填充因子设置为 0
  • 大约有 30 列
  • 其中一列是图像类型的 LOB,它存储的文件大小从几 KB 到几百 MB
  • 该表没有任何与之关联的假设索引

服务器正在运行 SQL Server 2017 (RTM-GDR) (KB4505224) - 14.0.2027.2 (X64)。数据库正在使用SIMPLE恢复模型。

我尝试过的一些事情:

  • 重建索引:ALTER INDEX ALL ON dbo.MyTable REBUILD. 这产生了微不足道的影响。
  • 重新组织索引:ALTER INDEX ALL ON dbo.MyTable REORGANIZE WITH(LOB_COMPACTION = ON). 这产生了微不足道的影响。
  • 将 LOB 列复制到另一个表,删除该列,重新创建该列,并将数据复制回来(如这篇文章所述:释放未使用的空间 SQL Server 表)。这减少了未使用的空间,但似乎只是将其转换为已用空间:

    未使用的空间

  • 使用 bcp 实用程序导出表、截断它并重新加载它(如这篇文章所述:如何为表释放未使用的空间)。这也减少了未使用的空间并增加了与上图类似的程度。

  • 即使不推荐,我也尝试了 DBCC SHRINKFILE 和 DBCC SHRINKDATABASE 命令,但它们对未使用的空间没有任何影响。
  • 跑步DBCC CLEANTABLE('myDB', 'dbo.myTable')没什么区别
  • 在保持图像和文本数据类型以及将数据类型更改为 varbinary(max) 和 …

index sql-server storage sql-server-2017

15
推荐指数
1
解决办法
1288
查看次数