我已经阅读了很多关于索引维护以及重组、重建、在线、离线、TEMPDB 和时间安排的所有优点/缺点的文章,现在我比以往任何时候都更加困惑......
目标是用更灵活和碎片化驱动的解决方案替换一些简单的重建维护计划,以遵循最佳实践并执行所需的操作而不是不需要的操作。因此,按照Kendra Little和许多其他聪明人的类似建议,我转向了Ola Hallengreen 的解决方案。
到目前为止,一切都设置正确,按照Brent Ozar 的建议创建两个不同的工作(一个侵入性较小的工作,例如每天运行的重组/在线重建工作和一个周末工作,做更多的工作,可能是离线处理)并准备好了。
但我不确定,也不太关心(副作用)的影响。
因为我们有几个非常大的表,所以我试图根据我在这个问题中找到的以下代码,找出索引重建对事务日志的影响,观察日志文件大小和 entris 增长数:
backup log myDB to disk = 'NUL'
-- check log space/usage:
dbcc sqlperf (logspace)
-- query index log records
SELECT LogRecordsGenerated = COUNT(*) FROM sys.fn_dblog(NULL, NULL) WHERE AllocUnitName = 'dbo.TableName.indexName'
-- COMMINT THE INDEX OPERATION (Online / Offline)
-- Check the above values again...
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,索引重建离线任务需要日志空间并生成事务日志条目,而在线则不需要!我期望它反过来......?
我找不到答案的问题是:
sql-server sql-server-2008-r2 transaction-log index-maintenance
我运行了sp_Blitz,它指出了一个内存问题,说:
Memory Dangerously Low 服务器有 32755 MB 的物理内存,但只有 235 MB 可用。由于服务器内存不足,因此存在交换到磁盘的危险,这会降低性能。
服务器有32 GB RAM总,0-2 MB FreeRAM, 200 - 2376 Mb Available。
@@版本:Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 2012 年 6 月 28 日 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack) 1)
我看了一会儿性能计数器,看到了以下值:
Page Faults/s _Total ~ 1.200 Average, Max 18.000, regular Peeks up to 1500.
Page Faults/s sqlserver ~ 380 Average, Max 1600, regular Peeks …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 sqlcmd 模式下为表列表执行 sql 过程,以将所有输出重定向到每个表的一个文件中。
不幸的是,只有所有命令的重定向输出的最后一个文件才能获得内容。
例如,我执行以下操作:
:OUT c:\test\tab0.sql
EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab0', @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
:OUT c:\test\tab1.sql
EXEC [dbo].[sp_generate_merge] @schema = 'dbo', @table_name ='tab1' , @include_timestamp = 0, @ommit_images = 1, @CreateProcedure = 1
Run Code Online (Sandbox Code Playgroud)
两个文件都被创建,但只有最后一个文件获得所有内容。
任何提示我可以如何更改它以便在每个命令的一个文件中获得结果?
现在我已经通过检查所有这些小部分并调查它们缺失的索引、索引设计、查询列顺序、连接与存在,从而过度使用了一个非常非常复杂的 sql 语句......我想看看我的工作的真正效果.
该查询使用 CTE 并执行八个 UNION 操作。我会给你一个非常修改的版本,给你一个基本的想法:
declare @O UniqueIdentifier
set @O = '11111111-1111-4c97-bce8-db988e11a9c1'
declare @US UniqueIdentifier
set @USK = '22222222-2222-433c-8721-b432de1b2cc5'
;WITH JACK AS (select iNumber from dbo.Tab1)
,GR AS (SELECT cats From dbo.tK)
,DATAROWS AS (
SELECT ROW_NUMBER() OVER( ORDER BY Number DESC) AS RIX, SpecCol
FROM dbo.MyBaseTable
WHERE SpecialCol IN
(
SELECT flux as i FROM dbo.T6 as O WHERE Wash = @O AND GiveHint = 1 AND Extended = 1 AND Burned = 0
UNION
SELECT …Run Code Online (Sandbox Code Playgroud) 我实际上是在尝试分析和解决一些经常发生的死锁,这些死锁都至少包括一个名为“DTCXact”的事务,这让我问。
我对生产服务器重复运行以下查询:
SELECT DTAT.transaction_id ,
DTAT.[name] ,
DTAT.transaction_begin_time ,
CASE DTAT.transaction_type
WHEN 1 THEN 'Read/write'
WHEN 2 THEN 'Read-only'
WHEN 3 THEN 'System'
WHEN 4 THEN 'Distributed'
END AS transaction_type ,
CASE DTAT.transaction_state
WHEN 0 THEN 'Not fully initialized'
WHEN 1 THEN 'Initialized, not started'
WHEN 2 THEN 'Active'
WHEN 3 THEN 'Ended' -- only applies to read-only transactions
WHEN 4 THEN 'Commit initiated'-- distributed transactions only
WHEN 5 THEN 'Prepared, awaiting resolution'
WHEN 6 THEN 'Committed'
WHEN 7 THEN …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-2008-r2 transaction msdtc distributed-transactions
我已经开始使用“Idera SQL check”工具。它显示了 Sql Server 系统上每个活动进程的浮动气泡:

这些气泡周围有红色边框,以防交易闲置。传说这很危险:
这些是与 spid 200 相关的一些特定示例信息:
spid : 200
kpid : 0
blocked : 0
waittime : 0
lastwaittype : MISCELLANEOUS
waitresource :
dbid : 5
database : DBNAME
uid : 1
cpu : 0
physical_io : 0
memusage : 3
login_time : 29.02.2016 09:37:17
last_batch : 29.02.2016 09:37:17
ecid : 0
open_tran : 1
status : SERVERNAME
program_name : PROGRAMNAME
host_process : 5380
cmd : AWAITING COMMAND
nt_damain :
nt_username :
net_address : 99887766 …Run Code Online (Sandbox Code Playgroud) 我想要一个可以在所有数据库上读取、写入和查看定义的 SQL Server 登录名。
做完之后:
USE master;
GRANT VIEW ANY Definition TO [a];
Run Code Online (Sandbox Code Playgroud)
看起来我必须授予连接并读取/写入每个数据库。
没有更简单的方法吗?
我创建了一个死锁警报,包括向这样的操作员发出通知:
EXEC msdb.dbo.sp_add_alert @name=N'1205 Deadlock',
@message_id=1205,
@severity=0,
@enabled=1,
@delay_between_responses=30,
@include_event_description_in=1,
@database_name=N'myDB',
@category_name=N'[Uncategorized]',
@job_id=N'00000000-0000-0000-0000-000000000000';
Run Code Online (Sandbox Code Playgroud)
此警报已注册用于通知。
它的历史说它从未出现过,尽管它已经存在了几个月并且每天都有多个僵局。我手动创建了一个死锁。它显示在日志文件中。
此警报缺少什么以发出通知?其他通知,例如 18456 Invalid Login 工作正常。
我需要一个将以下结果放在一起的查询:
到目前为止,我已经整理了以下查询:
SELECT
GETDATE() as dt
,@@SERVERNAME as srv
,F.name
,F.physical_name
,Round(F.size * 8 / 1024, 2) as FileSizeMb
, CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128 as FileUsedMB
,(F.size/128 - CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128) AS FileFreeMB
,Convert(decimal(18,2), (F.size/128 - CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128) / (F.size * 8 / 1024.1) * 100) as SpaceFreePerc
,stat.size_on_disk_bytes / 1024 / 1024 SizeOnDiskMb
,drv.volume_mount_point, drv.logical_volume_name, drv.available_bytes, drv.total_bytes
FROM sys.master_files F
inner join sys.dm_io_virtual_file_stats(NULL, NULL) stat on F.database_id = stat.database_id AND F.file_id = stat.file_id …Run Code Online (Sandbox Code Playgroud) sql-server sql-server-2008-r2 disk-space datafile compatibility-level
我发现过索引的大型堆表,例如有多个不同的非聚集索引和不同的列,但其中一些索引将(只有一个)主键列设置为它们的第一个索引列。
我进行了一些调查,使用了索引和查询,并得出了我希望专业人士确认的结论。
问题1:我说基于主键的多个索引而不是仅基于主键列的一个索引作为第一个也是唯一的索引列是无稽之谈,因为所有使用此pk进行过滤或加入的查询都返回只有一行?(假设额外的过滤、连接或选择的列作为包含列放入索引中以完全覆盖查询并避免 RID 查找)
问题 2:基于表主键的非聚集索引应该始终创建为 UNIQUE 索引,这样说对吗?(无论出于何种原因,该设置都是可选的,因为 sql server 应该已经知道包含 pk 的索引将是唯一的...)
index sql-server sql-server-2008-r2 index-tuning nonclustered-index
sql-server ×9
performance ×2
transaction ×2
alerts ×1
datafile ×1
disk-space ×1
index ×1
index-tuning ×1
memory ×1
msdtc ×1
permissions ×1
process ×1
role ×1
sp-blitz ×1
sqlcmd ×1