标签: sql-server

索引在什么时候变得有效

我发现很多资源都提到向表添加索引会使搜索更快,插入更慢,但前提是表很大。这造成了一种权衡,这是一个设计决定,但应该有一个近似的表大小,在此之前使用索引是荒谬的。(例如,10 行可能远低于该限制)

有没有人知道这个限制在哪里,或者知道有什么资源可以为我指明正确的方向?

index sql-server

9
推荐指数
2
解决办法
596
查看次数

内存增加,性能更差

设置:

  • 视窗服务器 2008 R2
  • SQL Server 2008 R2 SP1
  • 240GB 内存
  • TempDB 是 8x16GB 的数据文件,没有自动增长(总共 128GB)
  • 物理/独立服务器

该服务器用于 ETL 处理。我们刚刚在此服务器中安装了更多 RAM,总共 240GB RAM。SQL Server 服务是唯一真正运行的东西。

内存在 BIOS、OpenManage 和 Windows 中显示良好。

如果我将 SQL Server 配置为使用 70/100GB 的最小/最大内存,我们没有问题。但是,一旦我将其增加到 120/150GB,当我运行我们的 ETL 进程之一时,我会收到以下错误:

无法为数据库 'tempdb' 中的对象 '<临时系统对象:422234507706368>' 分配空间,因为 'PRIMARY' 文件组已满。通过删除不需要的文件、删除文件组中的对象、向文件组添加其他文件或为文件组中的现有文件设置自动增长来创建磁盘空间。(消息 1105,状态 2,过程未知,第 1 行)

在更改内存配置之前,我们从未遇到过这个问题。重新配置回原来的70/100GB后,我们没有收到这个错误。

我尝试过的事情:

  1. 将 TempDB 数据文件设置为自动增长。这只会导致文件自动增长,直到达到磁盘容量,然后失败。
  2. 添加更多 TempDB 数据文件。如图所示相同的错误。
  3. 将 TempDB 大小增加到 8x32GB(总共 256GB)

我不知道是什么导致了这个问题。

sql-server memory sql-server-2008-r2

9
推荐指数
1
解决办法
1718
查看次数

如何修复“无法执行差异备份...当前数据库备份不存在”?

我们最近切换到FULL恢复模式,每个周末进行完整备份,每天进行差异化。

问题是,差异备份似乎并不总是有效。作业历史记录中记录的错误消息是

以用户身份执行:用户名。... 9.00.3042.00 为 32 位 版权所有 (C) Microsoft Corp 1984-2005。版权所有。
开始时间:上午 11:20:12 进度:2013-01-25 11:20:13.90 来源:{450389BA-54C2-4892-9CD0-0126CA9B0ED8} 执行查询“DECLARE @Guid UNIQUETEIDENTIFIER”%ECU10sp0.sp完成结束进度错误:2013-01-25 11:20:14.40 代码:0xC002F210
来源:备份数据库(差异)执行 SQL 任务
描述:执行查询“BACKUP DATABASE [MyDatabase] TO DISK = N'E:\Database Backups \MyDatabase_backup_201301251120.diff' WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'MyDatabase_backup_20130125112014', SKIP, REWIND, NOUNLOAD, STATS = 10" 失败,出现以下错误:“无法对数据库“MyDatabase”执行差异备份,因为当前的数据库备份不存在。通过重新发出 BACKUP DATABASE 执行完整数据库备份,省略 WITH DIFFERENTIAL 选项。BA... 包执行fa... 步骤失败的。

完整备份作业每次都成功完成,我可以msdb.dbo.backupset使用此处找到的查询查看它,因此我知道它存在。看起来重新启动后,差异备份确实成功完成,直到下一次完整备份。

这是我的工作经历:

1/16 - 完整备份 - 成功
1/17 - 差异备份 - 成功
1/18 …

sql-server-2005 sql-server backup maintenance

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

使用析取有效过滤大集合

假设我有一张桌子

CREATE TABLE Ticket (
    TicketId int NOT NULL,
    InsertDateTime datetime NOT NULL,
    SiteId int NOT NULL,
    StatusId tinyint NOT NULL,
    AssignedId int NULL,
    ReportedById int NOT NULL,
    CategoryId int NULL
);
Run Code Online (Sandbox Code Playgroud)

在这个例子中TicketId是主键。

我希望用户能够针对该表创建“部分临时”查询。我说部分是因为查询的一些部分将始终固定:

  1. 查询将始终InsertDateTime
  2. 查询将始终 ORDER BY InsertDateTime DESC
  3. 查询将分页结果

用户可以选择过滤任何其他列。他们可以过滤无、一个或多个。对于每一列,用户可以从一组值中进行选择,这些值将作为析取应用。例如:

SELECT
    TicketId
FROM (
    SELECT
        TicketId,
        ROW_NUMBER() OVER(ORDER BY InsertDateTime DESC) as RowNum
    FROM Ticket
    WHERE InsertDateTime >= '2013-01-01' AND InsertDateTime < '2013-02-01'
      AND StatusId IN (1,2,3)
      AND (CategoryId IN (10,11) OR …
Run Code Online (Sandbox Code Playgroud)

index sql-server

9
推荐指数
1
解决办法
2055
查看次数

出于存档目的对数据库进行碎片整理/压缩的最佳方法

我们有一个用于电子邮件归档的 SQL Server 实例(由 3rd 方归档包提供)。每隔一段时间,软件就会滚动到一个新的空数据库。我们过去每季度进行一次,但现在我们希望每月进行一次。每月存档的数据量约为 15 - 20 GB,大部分数据仅驻留在少数表中(通常为 2 - 4 个)。

一旦我们滚动到一个新数据库,旧数据库就会严格按照只读方式使用。我想做的是将它优化成一个漂亮的、紧凑的数据文件,所有的表/索引都是连续的并且具有非常高的填充因子,并且数据文件末尾没有太多的空白空间。此外,我们在这台服务器上使用标准版,但存在所有隐含的限制(否则我已经在使用数据压缩了)。

我能想到的几种可能性:

  1. REBUILD/REORGANIZE 索引、DBCC SHRINKFILE(好吧,这不是一个明智的选择,因为 DBCC SHRINKFILE 会将它接触到的任何东西都分割开来,但为了完整起见,我将其包括在内。)
  2. 创建一个关闭自动统计的新数据库。编写脚本并从源数据库重新创建所有表。使用 bcp 按集群键顺序将数据导出/导入到新数据库中。编写脚本并重新创建所有索引。使用完整扫描重新计算所有统计信息。
  3. 创建一个关闭自动统计的新数据库。编写脚本并从源数据库重新创建所有表。使用 SSIS 或 T-SQL 将数据传输到新数据库。编写脚本并重新创建所有索引。使用完整扫描重新计算所有统计信息。

每种情况下的最后一步都是将数据库设置为只读模式。

这样做还有哪些其他好的/更好的选择?我关心的是以这样一种方式移动数据,以保持高填充因子,并以逻辑上连续的方式。

编辑:

我应该提到大约 75% 的数据似乎存储在图像 (LOB) 列中。

sql-server sql-server-2012

9
推荐指数
1
解决办法
1037
查看次数

识别文件增长事件

我在我的投资组合中发现了许多使用默认自动增长设置(1 MB 或 10% 增量)创建的数据库,这些数据库已经扩展了很长一段时间。如果我想了解每个 DB 文件的外部碎片量,是否可以从元数据中获取 DB 文件的大小修改次数(通过自动增长或手动)?澄清一下,我是否可以从元数据中获取 DB 生命周期内 DB 文件修改的历史记录,而不仅仅是因为实例重启?

sql-server datafile

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

SQL Server 中的聚集索引与 Oracle 中的索引组织表

我正在以数据库开发人员的身份从 SQL Server 过渡到 Oracle,并在这里找到了一些很棒的资源(如何从 SQL Server DBA 过渡到 Oracle?以及作为 DBA,我将如何从 Oracle 过渡到 SQL Server ? ) 但我很难找到有关在 Oracle 中使用索引组织表的好信息。

在我之前的生活中,我们在 OLTP 风格的数据集市中广泛使用了 SQL Server 中的聚集索引,并取得了巨大的成功。索引组织表是否是 Oracle 中方便的工具?

index oracle sql-server

9
推荐指数
2
解决办法
4231
查看次数

TempDB 中的损坏分区如何导致 DBCC CHECKDB 报告没有问题?

我们的其中一台 SQL Server 最近报告了以下错误:

DATE/TIME:  2/25/2013 9:15:14 PM

DESCRIPTION:    No catalog entry found for partition ID 9079262474267394048
     in database 2. The metadata is inconsistent. Run DBCC CHECKDB to check for
     a metadata corruption.
Run Code Online (Sandbox Code Playgroud)

不到 15 分钟后,我连接到服务器并运行:

SELECT name
FROM sys.databases
WHERE database_id = 2;
Run Code Online (Sandbox Code Playgroud)

返回'tempdb'。然后我跑了:

DBCC CHECKDB ('tempdb') WITH NO_INFOMSGS, TABLERESULTS;
Run Code Online (Sandbox Code Playgroud)

没有返回任何结果,表明受影响的数据库没有问题。

数据库中的损坏如何导致上述错误消息DBCC CHECKDB但未报告问题?我假设如果页面校验和计算失败,导致页面被标记为怀疑引用该页面的任何对象将无法删除,但我一定是错的。

一旦页面被标记为“可疑”,如何将其标记为“不可疑”、“已修复”或“重用”,或者DBCC CHECKDB不报告相关页面有任何问题的任何内容?


编辑:2013-02-27 13:24

只是为了好玩,我试图在 TempDB 中重新创建损坏,假设 #temp 表是罪魁祸首。

但是,由于我无法SINGLE_USER在 TempDB 中设置该选项,因此无法用于DBCC WRITEPAGE损坏页面,因此我无法在 TempDB 中强制损坏。

而不是使用DBCC WRITEPAGE …

sql-server sql-server-2012 tempdb dbcc-checkdb

9
推荐指数
3
解决办法
8334
查看次数

SQL Server 沙盒

我正在尝试为我们的报告开发人员设置一个沙箱以进行他们的工作。我目前的计划是每天晚上“重置”数据库,但我不确定如何去做。我所说的重置是指我想从服务器上的一个数据库之外的所有数据库中删除任何用户表、视图、存储过程等。我想另一种选择是删除并重新创建数据库,但我很确定这也意味着重新授予对所有适当 AD 组/人员的访问权限。

我真的不知道这样做的最佳方法是什么,所以我希望你们中的一些人能够提供一些好的想法/建议。谢谢。

为清楚起见,我们基本上想用我们的数据库来做这个:http : //try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57。唯一的区别是我们不想每天都重新创建我们的用户。

版本: SQL Server 2008
版:开发人员和企业

sql-server-2008 sql-server

9
推荐指数
2
解决办法
3147
查看次数

SQL Server 2012 catalog.executions to sysjobhistory - 有什么办法可以加入它们吗?

我已经用尽了我的资源,但找不到将 ssisdb.catalog 表加入到运行它们的作业的万无一失的方法。尝试编写一些自定义 sproc 来监视我的执行时间和从目录表中写入的行,并且能够将它们与调用作业联系在一起将非常有益。

我试图找出是否有任何表可用于将 catalog.executions 表连接到 msdb.sysjobhistory。我需要关联哪个作业称为 SSIS 包,然后使用执行中的数据进行分析。

sql-server ssis sql-server-2012

9
推荐指数
2
解决办法
3261
查看次数