我在 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) 我正在尝试从以下位置插入结果集:
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 的错误,还是我做错了什么?
我创建了一个包含 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) 我们的应用程序之一报告错误消息 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 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
如果我有一个返回 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 也是空的。
我们有一个 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) 将我们的数据库恢复到新的服务器硬件失败,出现页面错误。
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) 我对 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 代理中挂起。所以现在它为我创建了一个新表,并用数据填充它,但工作只是继续运行。
Brent Ozar 于 2015-06-22 发表了一篇有趣的时事通讯;你如何管理 dbas 测量备份,他认为一个好的 DBA 应该检查什么时候
结果证明这对我来说是一个很好的锻炼。我不仅发现了两个没有备份的数据库,我还发现我们确实有一些数据库,我们从未检查过我们可以恢复备份。
所以; 我在答案部分为该任务提供了一种解决方案。我们约定数据库名称是唯一的,我的脚本列出了生产服务器和测试服务器,因此我可以比较它们。
你有更好的解决方案吗?
此致,
亨里克
sql-server ×9
restore ×3
dbcc-checkdb ×2
compression ×1
data-pages ×1
dbatools ×1
errors ×1
filetable ×1
optimization ×1
partitioning ×1
performance ×1
powershell ×1
xml ×1