小编Mag*_*ier的帖子

tempdb中的索引重建任务对事务日志的影响?

我已经阅读了很多关于索引维护以及重组、重建、在线、离线、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)

令人惊讶的是,索引重建离线任务需要日志空间并生成事务日志条目,而在线则不需要!我期望它反过来......?

我找不到答案的问题是:

  • 重建联机或脱机作业将如何影响日志文件增长?我该如何衡量?有没有更好的办法?
  • 我必须在我的数据文件中为重建过程保留多少空间?我发现了大约 110%-120% 的索引大小的提示(例如在这个 MS 文档中)。如果我的所有索引一起使用大约 10 …

sql-server sql-server-2008-r2 transaction-log index-maintenance

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

我有记忆问题吗?

我运行了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)

performance sql-server memory sp-blitz performance-tuning

4
推荐指数
1
解决办法
1907
查看次数

多命令SQLCMD模式脚本

我正在尝试在 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-server sql-server-2008-r2 sqlcmd

4
推荐指数
1
解决办法
515
查看次数

复杂查询的性能测量

现在我已经通过检查所有这些小部分并调查它们缺失的索引、索引设计、查询列顺序、连接与存在,从而过度使用了一个非常非常复杂的 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)

performance sql-server sql-server-2008-r2 query-performance

4
推荐指数
1
解决办法
167
查看次数

为什么事务以分布式(DTCXact)方式运行?

我实际上是在尝试分析和解决一些经常发生的死锁,这些死锁都至少包括一个名为“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

4
推荐指数
1
解决办法
1892
查看次数

如何查找闲置交易的详情及原因?

我已经开始使用“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)

process sql-server-2008-r2 transaction

4
推荐指数
1
解决办法
1388
查看次数

如何授予所有数据库的连接和读/写权限?

我想要一个可以在所有数据库上读取、写入和查看定义的 SQL Server 登录名。

做完之后:

USE master;
GRANT VIEW ANY Definition TO [a];
Run Code Online (Sandbox Code Playgroud)

看起来我必须授予连接并读取/写入每个数据库。

没有更简单的方法吗?

sql-server permissions role

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

为什么死锁警报不起作用?

我创建了一个死锁警报,包括向这样的操作员发出通知:

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 工作正常。

sql-server sql-server-2008-r2 event-notification alerts

4
推荐指数
1
解决办法
1089
查看次数

如何通过一个查询查询所有文件、它们的填充级别和其他驱动器信息?

我需要一个将以下结果放在一起的查询:

  • 跨所有数据库的每个数据库文件一行
  • 包含有关文件所在的本地驱动器的信息的附加列
  • 有关文件大小和用途的信息

到目前为止,我已经整理了以下查询:

    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

4
推荐指数
1
解决办法
175
查看次数

具有唯一列的非聚集索引是否总是首先解决过滤该列的所有查询?

我发现过索引的大型堆表,例如有多个不同的非聚集索引和不同的列,但其中一些索引将(只有一个)主键列设置为它们的第一个索引列。

我进行了一些调查,使用了索引和查询,并得出了我希望专业人士确认的结论。

问题1:我说基于主键的多个索引而不是仅基于主键列的一个索引作为第一个也是唯一的索引列是无稽之谈,因为所有使用此pk进行过滤或加入的查询都返回只有一行?(假设额外的过滤、连接或选择的列作为包含列放入索引中以完全覆盖查询并避免 RID 查找)

问题 2:基于表主键的非聚集索引应该始终创建为 UNIQUE 索引,这样说对吗?(无论出于何种原因,该设置都是可选的,因为 sql server 应该已经知道包含 pk 的索引将是唯一的...)

index sql-server sql-server-2008-r2 index-tuning nonclustered-index

4
推荐指数
1
解决办法
852
查看次数