小编Hen*_*sen的帖子

寻找,你将在分区表上扫描...

我在 PCMag 中阅读了 Itzik Ben-Gan 的这些文章:

搜索,您应扫描第 I 部分:当优化器未优化
搜索时,您应扫描第 II 部分:升序键

我目前的所有分区表都存在“最大分组”问题。我们使用Itzik Ben-Gan 提供的技巧来获取 max(ID),但有时它不会运行:

DECLARE @MaxIDPartitionTable BIGINT
SELECT  @MaxIDPartitionTable = ISNULL(MAX(IDPartitionedTable), 0)
FROM    ( SELECT    *
          FROM      ( SELECT    partition_number PartitionNumber
                      FROM      sys.partitions
                      WHERE     object_id = OBJECT_ID('fct.MyTable')
                                AND index_id = 1
                    ) T1
                    CROSS APPLY ( SELECT    ISNULL(MAX(UpdatedID), 0) AS IDPartitionedTable
                                  FROM      fct.MyTable s
                                  WHERE     $PARTITION.PF_MyTable(s.PCTimeStamp) = PartitionNumber
                                            AND UpdatedID <= @IDColumnThresholdValue
                                ) AS o
        ) AS T2;
SELECT @MaxIDPartitionTable 
Run Code Online (Sandbox Code Playgroud)

我得到这个计划

在此处输入图片说明

但是 45 分钟后,看看读数

reads …
Run Code Online (Sandbox Code Playgroud)

performance sql-server partitioning query-performance

21
推荐指数
1
解决办法
1066
查看次数

database_scoped_configurations 中的错误

我正在尝试从以下位置插入结果集:

SELECT * FROM sys.database_scoped_configurations
Run Code Online (Sandbox Code Playgroud)

进入临时表,因为我想检查服务器上所有数据库的设置。所以我写了这段代码:

DROP TABLE IF EXISTS #h
CREATE TABLE #h(dbname sysname, configuration_id INT, name sysname,     value SQL_VARIANT,  value_for_secondary SQL_VARIANT)
EXEC sys.sp_MSforeachdb 'USE ?; insert into #h(dbname, configuration_id, name, value,value_for_secondary)  SELECT ''?'' as dbname, * FROM sys.database_scoped_configurations  D'
SELECT * FROM #h H
Run Code Online (Sandbox Code Playgroud)

但随后将只有每个数据库一行,而不是4行,我从在每个数据库中运行一个普通的选择期待。

我知道有比使用 sp_MSForEachDB 更好的编码方法,我尝试了几种方法。但是我每个数据库仍然只有一行。我在 SQL Server 2016 RTM 和 SP1 上都试过了

这是 SQL Server 2016 的错误,还是我做错了什么?

sql-server configuration sql-server-2016

10
推荐指数
3
解决办法
477
查看次数

使用页面压缩时的行开销是多少?

我创建了一个包含 650 个 Numeric(19,4) 列的表。当我打开页面压缩时,通过运行

ALTER TABLE fct.MyTable REBUILD  WITH (DATA_COMPRESSION = PAGE);
Run Code Online (Sandbox Code Playgroud)

我得到

消息 1975,级别 16,状态 1
索引“PK_Mytable”行长度超过了“8060”字节的最大允许长度。

但是 650 乘以 9 字节仅为 5850 字节,这与规定的 8060 字节的限制相去甚远。

服务器运行的是 Windows 2012 r2 和 SQL Server 2016 SP1 CU2

使用页面压缩时的行开销是多少?

这是一些代码来显示我的意思:

/* test script to demo MSG 1975 */
DECLARE @sql NVARCHAR(max)='', @i INT =0
drop table if exists dbo.mytable;

SET @sql = 'Create table dbo.Mytable (MyTableID bigint not null 
  identity(1,1) primary key clustered, '

WHILE @i < 593 BEGIN
    SET …
Run Code Online (Sandbox Code Playgroud)

data-pages compression sql-server-2016

10
推荐指数
1
解决办法
1448
查看次数

字符串或二进制数据将在表 '******'、列 '******' 中被截断。截断值:'*****'

我们的应用程序之一报告错误消息 2628:

string or binary data would be truncated in table '******', column '******'. Truncated value: '******'

代替

String or binary data would be truncated in table 'mytable', column 'mycolumn'. Truncated value: 'myvalue'.

我用 SSMS 得到的。

我需要更改什么设置才能获得完整的消息?

我试图搜索这个,但我得到的只是我需要将 VERBOSE_TRUNCATION_WARNINGS 设置为 ON,并将 compatible_level 设置为 150。我很久以前就这样做了。

该应用程序具有以下错误处理程序:

 try
     {
         ES.isWorking = true;
         Worker worker = new Worker(new DBConnection(Settings.ConnectionString));
         worker.DoWork();
         ES.isWorking = false;
     }
 catch (Exception ex)
     {
         ES.isWorking = false;
         this.eventLog.WriteEntry("In OnTimer exception ! message: " + ex.Message.ToString());
         errorHandler.HandleException(ex, "In OnTimer exception …
Run Code Online (Sandbox Code Playgroud)

sql-server azure-sql-database errors

10
推荐指数
5
解决办法
1356
查看次数

“警告:操作导致残留 I/O”与键查找

我在 SQL Server 2017 执行计划中看到过这个警告:

警告:操作导致剩余 IO [原文如此]。实际读取的行数为 (3,321,318),但返回的行数为 40。

这是 SQLSentry PlanExplorer 的一个片段:

在此处输入图片说明

为了改进代码,我添加了一个非聚集索引,以便 SQL Server 可以访问相关行。它工作正常,但通常会有太多(大)列包含在索引中。它看起来像这样:

在此处输入图片说明

如果我只添加索引而不包含列,如果我强制使用索引,它看起来像这样:

在此处输入图片说明

显然,SQL Server 认为键查找比剩余 I/O 昂贵得多。我有一个没有太多测试数据的测试设置(还),但是当代码投入生产时,它需要处理更多的数据,所以我很确定需要某种非聚集索引。

当您在 SSD 上运行时,键查找真的那么昂贵,我必须创建全脂索引(有很多包含列)?


执行计划: https : //www.brentozar.com/pastetheplan/?id=SJtiRte2X它是长存储过程的一部分。寻找IX_BatchNo_DeviceNo_CreatedUTC.

sql-server optimization execution-plan nonclustered-index sql-server-2017

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

如何获得估计的子树成本?

如果我有一个返回 query_plan 的查询,例如像这样:

    SELECT TOP 1000 st.TEXT
    ,cp.size_in_bytes
    ,cp.plan_handle
    ,QP.query_plan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS QP
WHERE cp.objtype = N'Adhoc'
    AND cp.usecounts = 1
Run Code Online (Sandbox Code Playgroud)

然后我可以点击一个 query_plan 并将鼠标悬停在最左边的图标上,提示文本将列出估计的子树成本。

有没有办法将它Estimated Subtree Cost作为我的查询的单独列?

我知道这个数字是无单位的,是指大约 20 年前的特定开发人员 PC。即便如此,我认为如果统计数据不是太远,它可能会告诉我查询应该花费多长时间。

我真的很努力地在谷歌上搜索这些信息,但即使是 dba.stackexchange.com 也是空的。

xml sql-server execution-plan sql-server-2014

7
推荐指数
1
解决办法
1363
查看次数

使用 FileTable 还原数据库

我们有一个 SQL Server 2014 (build 12.0.24457.0) 数据库,里面有两个表,都是 FileStream 表,最大的有 2979466 行,SUM(cached_file_size)= 40564905472.

我们已尝试将此数据库恢复到我们的测试服务器上,但需要很长时间。我们的 DBA 在 14 天后放弃了。

有没有其他人尝试使用 FileStream 表还原数据库,其中包含更多文件?

我正在运行这个脚本来监控进度:

BEGIN TRY
    DROP TABLE #h 
END TRY
BEGIN CATCH
END CATCH

DECLARE @r INT=1, @percent_complete NUMERIC(9,2), @Extimated_Completion_Datetime DATETIME2(0)
CREATE TABLE #h ( start_time DATETIME2(0), percent_complete NUMERIC(9,2), Estimated_completion_time NUMERIC(9,2), HoursSinceStart NUMERIC(9,2), Extimated_Completion_Datetime DATETIME2(0), session_id INT, created_date datetime2(0))
DECLARE @d VARCHAR(19) , @e VARCHAR(max)


WHILE @r > 0 BEGIN 
    INSERT INTO #h
    SELECT start_time, percent_complete, CAST(ROUND(estimated_completion_time/3600000.0,1) AS DECIMAL(9,1)) AS …
Run Code Online (Sandbox Code Playgroud)

sql-server restore filetable sql-server-2014

7
推荐指数
1
解决办法
646
查看次数

SQL Server 检测到基于逻辑一致性的 I/O 错误:RESTORE 上的 pageid 不正确

将我们的数据库恢复到新的服务器硬件失败,出现页面错误。

Message
SQL Server detected a logical consistency-based I/O error: 
incorrect pageid (expected 49:8125916; actual 49:29097436).
It occurred during a read of page (49:8125916) in database ID 7 at
offset 0x00000f7fbb8000 in file x:\Databases\Data07\DataWarehouse_OperationalData_15.ndf'.
Additional messages in the SQL Server error log or system event
log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately.
Complete a full database consistency check (DBCC CHECKDB). 
This error can be caused by many …
Run Code Online (Sandbox Code Playgroud)

sql-server restore dbcc-checkdb sql-server-2016

7
推荐指数
1
解决办法
5640
查看次数

SQL 代理 PowerShell 任务永远不会完成

我对 PowerShell 很陌生,现在我找到了 dbatools.io,我想在其中运行 SQL 代理中的 PowerShell 任务,例如

$ExportPath = $env:TEMP + '\DriveSpace.csv'
$datatable = Import-Csv $ExportPath | Out-DbaDataTable
Write-DbaDataTable -SqlServer MyServer -Database Utils -InputObject  $datatable -Table dbo.FreeSpaceOnDiskDrive -AutoCreateTable
Run Code Online (Sandbox Code Playgroud)

它开始了,但它永远不会结束。我也尝试过执行此操作的任务:

Get-DbaDatabaseSpace -SqlServer MyServer -IncludeSystemDBs | Out-DbaDataTable | Write-DbaDataTable -SqlServer MyServer -database utils -Table dbo.DiskSpaceExample -AutoCreateTable
Run Code Online (Sandbox Code Playgroud)

同样的问题。它在 Windows PowerShell ISE 中运行正常,但只是在 SQL 代理中挂起。所以现在它为我创建了一个新表,并用数据填充它,但工作只是继续运行。

sql-server powershell sql-server-2016 dbatools

7
推荐指数
1
解决办法
4092
查看次数

检查上次备份的时间

Brent Ozar 于 2015-06-22 发表了一篇有趣的时事通讯;你如何管理 dbas 测量备份,他认为一个好的 DBA 应该检查什么时候

  • 上次备份完成
  • 上次恢复
  • 最后一个 CheckDB 完成

结果证明这对我来说是一个很好的锻炼。我不仅发现了两个没有备份的数据库,我还发现我们确实有一些数据库,我们从未检查过我们可以恢复备份。

所以; 我在答案部分为该任务提供了一种解决方案。我们约定数据库名称是唯一的,我的脚本列出了生产服务器和测试服务器,因此我可以比较它们。
你有更好的解决方案吗?

此致,

亨里克

sql-server restore dbcc-checkdb

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