标签: sql-server-2008

DBCC CheckDB 会错过哪些类型的损坏?

这个问题是由这篇较早的帖子提示的,我有一个数据库归档以备将来调查,该数据库在以下情况下恢复:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.
Run Code Online (Sandbox Code Playgroud)

在链接的问题和备份中,我已准备好进行 DBCC PAGE 调查,DBCC CHECKDB 无错误通过,但显然存在损坏。

哪些类型的损坏会导致 CHECKDB 通过但 BACKUP WITH CHECKSUM 会失败?

sql-server-2005 sql-server-2008 dbcc corruption

16
推荐指数
1
解决办法
2172
查看次数

为什么“SELECT POWER(10.0, 38.0);” 抛出算术溢出错误?

我正在更新我的IDENTITY溢出检查脚本以考虑DECIMALNUMERIC IDENTITYcolumns

作为检查的一部分,我计算每一IDENTITY列的数据类型范围的大小;我用它来计算该范围的百分比已用完。因为DECIMALNUMERIC 该范围的大小2 * 10^p - 2p是精度在哪里。

我用DECIMALNUMERIC IDENTITY列创建了一堆测试表,并尝试按如下方式计算它们的范围:

SELECT POWER(10.0, precision)
FROM sys.columns
WHERE 
       is_identity = 1
   AND type_is_decimal_or_numeric
;
Run Code Online (Sandbox Code Playgroud)

这引发了以下错误:

Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting float to data type numeric. 
Run Code Online (Sandbox Code Playgroud)

我将它缩小到IDENTITY类型的列DECIMAL(38, 0)(即具有最大精度),然后我POWER()直接尝试对该值进行计算。

以下所有查询

SELECT POWER(10.0, 38.0);
SELECT CONVERT(FLOAT, (POWER(10.0, 38.0)));
SELECT CAST(POWER(10.0, 38.0) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server datatypes t-sql type-conversion

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

重组索引任务中的压缩大对象

我正在 SQL Server 2008 R2 中设置维护计划。

在重组索引任务中,它有一个“压缩大对象”选项。这是什么意思,我想打开它吗?

sql-server-2008 maintenance

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

大索引 INCLUDE 字段将如何影响系统性能?

这个问题是关于 SQL Server 索引性能,a varchar(2000)as an INCLUDEin a coverage index。

我正在尝试提高缓慢且不稳定的数据库应用程序的性能。在某些情况下,数据是通过大VARCHAR字符串来访问的,与查询包括像multple字符串操作SUBSTRING()SPACE()DATALENGTH()。这是访问的简化示例;

update fattable set col3 =  
   SUBSTRING(col3,1,10) + '*' + 
   SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
Run Code Online (Sandbox Code Playgroud)

架构如下所示:

CREATE TABLE [dbo].[FatTable]( 
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [col1] [nchar](12) NOT NULL, 
    [col2] [int] NOT NULL, 
    [col3] [varchar](2000) NOT NULL, ... 
Run Code Online (Sandbox Code Playgroud)

定义了以下索引,在大文本列上有一个覆盖字段。

CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable]  ( [col2] ASC ) 
    INCLUDE( [col3] )
Run Code Online (Sandbox Code Playgroud)

从我读过的内容来看,将大数据字段放在索引中是很糟糕的。我一直在阅读几篇文章,包括http://msdn.microsoft.com/en-us/library/ms190806.aspx,其中讨论了分页和磁盘大小对索引性能的影响。话虽如此,查询计划肯定会使用覆盖索引。我没有足够的信息来确定这在系统负载方面实际上给我带来了多少成本。我确实知道总体而言,系统性能不佳,我担心这是问题之一。问题:

  • 将此varchar(2000) …

performance sql-server-2008 sql-server index-tuning

16
推荐指数
2
解决办法
4095
查看次数

SQL 代理如何以及何时更新 next_run_date/next_run_time 值?

我一直在研究 T-SQL 中的代码,以使用 msdb 数据库中的 sp_add_jobschedule proc 向 SQL 代理作业添加新计划。当我添加新计划(通常在特定日期/时间运行一次)并立即查看 sysjobschedules 和 sysschedules 中的值时,我可以看到新计划已添加并与我的 SQL 代理的 job_id 相关联工作。但是,next_run_date 和 next_run_time 的值在其中为 0。当我在 2 或 3 分钟后再次查看它们时,它们仍然显示为 0。但是,当我再过 5 或 10 分钟后再回来时,它现在可以正确显示与下一次计划运行相对应的日期和时间值。

所以我的问题是:

  • 这些值多久更新一次?
  • 更新这些值的过程是什么?
  • 如果我要添加一个计划,比如说,未来 1 分钟,这是否意味着该作业将不会运行,因为 next_run_date/time 尚未更新?

我用来添加新计划的代码示例:

exec msdb.dbo.sp_add_jobschedule @job_id = @jobID
                    , @name = @JobName
                    , @enabled = 1
                    , @freq_type = 1
                    , @freq_interval = 0
                    , @freq_subday_type = 0
                    , @freq_subday_interval = 0
                    , @freq_relative_interval = 0
                    , @freq_recurrence_factor = 0
                    , @active_start_date = …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server sql-server-agent

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

SQL Server NTFS 分配单元大小

在运行 SQL Server 2008 R2 的 Windows 2008 R2 上,NTFS 分配单元大小对磁盘 IO 性能有多重要。在我看来,为关键任务应用程序构建少数服务器的服务器管理员将 NTFS 分配单元大小(集群大小)默认为 4 KB 而不是 64 KB。SQL 服务器已安装。

是否值得一试——卸载 SQL——将驱动器格式化为 64 KB 集群大小并重新安装 SQL 服务器?

sql-server-2008 sql-server

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

意外关闭 SQL 内存太低无法登录,我该如何解决?

我将我的 SQL Server 实例的最大内存设置为 15 MB...现在我无法登录以增加它。如何在不登录的情况下增加最大内存?

版本为 SQL 2008 R2

sql-server-2008 sql-server

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

休眠 SPID 阻塞其他事务

我真的很难追踪我们遇到的一些阻塞。

根阻塞的SPID的状态是“睡觉”,在CMD为“命令等待”,而sqltextSET TRANSACTION ISOLATION LEVEL READ COMMITTED

当我查看 Top Transactions by Blocked Transactions Count 报告时,Blocking SQL Statement 是“--”。

我已经对 SQL 进行了跟踪,当阻塞发生时跟踪根阻塞 SPID,但它并没有真正引导我到任何地方。最后一个 trace 语句与sqltext上面的相同SET TRANSACTION ISOLATION LEVEL READ COMMITTED

我已经检查了我能找到的所有相关存储过程,以确保它们具有 TRY/CATCH BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN 语句(我们对所有内容都使用存储过程,因此没有运行独立的语句)。这个问题在过去 24 小时内才开始发生,没有人声称对系统进行了任何更改。

解决方案:我们很少使用的存储过程之一在插入时出错(列数不匹配),但我们仍然对到底发生了什么感到困惑。

查看所有跟踪信息时,有时会列出此存储过程的 EXEC 语句,但绝不会在阻塞 SPID 上发生 BLOCK 之前。似乎当它开始阻塞时,跟踪没有记录它的执行(或其中的任何语句)。然而,也有其他时候跟踪确实记录了它的执行并且没有发生阻塞。

存储过程错误报告来自一个用户,我能够在跟踪中找到多个 EXEC 语句并在 SSMS 中运行它们。当我运行它们时,我们没有发生任何阻塞或它们挂起的情况。它们按预期运行(catch 块在错误发生后触发并回滚事务)。解决修复存储过程后,我们没有再看到这个问题。

sql-server-2008 transaction troubleshooting

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

如何避免在 WHERE 子句中使用变量

给定一个(简化的)存储过程,例如:

CREATE PROCEDURE WeeklyProc(@endDate DATE)
AS
BEGIN
  DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate)
  SELECT
    -- Stuff
  FROM Sale
  WHERE SaleDate BETWEEN @startDate AND @endDate
END
Run Code Online (Sandbox Code Playgroud)

如果Sale表很大,SELECT可能需要很长时间才能执行,显然是因为优化器由于局部变量而无法优化。我们测试运行SELECT带有变量的部件,然后硬编码日期,执行时间从约 9 分钟变为约 1 秒。

我们有许多基于“固定”日期范围(周、月、8 周等)进行查询的存储过程,因此输入参数只是 @endDate,@startDate 是在过程中计算的。

问题是,在 WHERE 子句中避免变量以免损害优化器的最佳做法是什么?

我们提出的可能性如下所示。是否有任何这些最佳实践,或者还有其他方法吗?

使用包装程序将变量转换为参数。

参数不会像局部变量那样影响优化器。

CREATE PROCEDURE WeeklyProc(@endDate DATE)
AS
BEGIN
   DECLARE @startDate DATE = DATEADD(DAY, -6, @endDate)
   EXECUTE DateRangeProc @startDate, @endDate
END

CREATE PROCEDURE DateRangeProc(@startDate DATE, @endDate DATE)
AS
BEGIN
  SELECT
    -- Stuff
  FROM Sale
  WHERE SaleDate …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

如何使用执行计划优化 T-SQL 查询

我有一个 SQL 查询,我花了两天时间尝试使用试错法和执行计划进行优化,但无济于事。请原谅我这样做,但我会在这里发布整个执行计划。我已经努力使查询和执行计划中的表名和列名通用,既为了简洁又为了保护我公司的 IP。可以使用SQL Sentry Plan Explorer打开执行计划。

我已经完成了大量的 T-SQL,但是使用执行计划来优化我的查询对我来说是一个新领域,我真的试图了解如何去做。所以,如果有人能帮我解决这个问题并解释如何破译这个执行计划以在查询中找到优化它的方法,我将永远感激不尽。我还有更多的查询需要优化——我只需要一个跳板来帮助我完成第一个查询。

这是查询:

DECLARE @Param0 DATETIME     = '2013-07-29';
DECLARE @Param1 INT          = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112))
DECLARE @Param2 VARCHAR(50)  = 'ABC';
DECLARE @Param3 VARCHAR(100) = 'DEF';
DECLARE @Param4 VARCHAR(50)  = 'XYZ';
DECLARE @Param5 VARCHAR(100) = NULL;
DECLARE @Param6 VARCHAR(50)  = 'Text3';

SET NOCOUNT ON

DECLARE @MyTableVar TABLE
(
    B_Var1_PK int,
    Job_Var1 varchar(512),
    Job_Var2 varchar(50)
)

INSERT INTO @MyTableVar (B_Var1_PK, Job_Var1, Job_Var2) 
SELECT B_Var1_PK, Job_Var1, Job_Var2 FROM [fn_GetJobs] (@Param1, @Param2, @Param3, @Param4, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server optimization t-sql execution-plan

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