我在 SQL 2012 SP1 (ent) 上有一个并行查询,它在用户定义的资源调控器池中运行的速度比在用户定义的池中运行的慢得多(2 秒与 125 到 140 秒在用户定义的池中 = ~ 75 倍慢)比在其中运行的相同查询默认资源池。
两次执行之间的查询计划哈希是相同的,并且统计 io 为所有操作返回相同的值。我已经确认执行计划没有额外的溢出警告(两者都有一个),并且查询的内存授予是相同的。
用户定义的池工作负载组
<QueryPlan DegreeOfParallelism="4" MemoryGrant="2384096" CachedPlanSize="384" CompileTime="3608" CompileCPU="2712" CompileMemory="15672">
<ThreadStat Branches="5" UsedThreads="20">
<ThreadReservation NodeId="0" ReservedThreads="20" />
</ThreadStat>
<MemoryGrantInfo SerialRequiredMemory="5632" SerialDesiredMemory="2360768" RequiredMemory="28960" DesiredMemory="2384096" RequestedMemory="2384096" GrantWaitTime="0" GrantedMemory="2384096" MaxUsedMemory="93872" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="209715" EstimatedPagesCached="104857" EstimatedAvailableDegreeOfParallelism="4" />
Run Code Online (Sandbox Code Playgroud)
默认池
<QueryPlan DegreeOfParallelism="4" MemoryGrant="2384096" CachedPlanSize="384" CompileTime="3016" CompileCPU="2660" CompileMemory="15672">
<ThreadStat Branches="5" UsedThreads="20">
<ThreadReservation NodeId="0" ReservedThreads="20" />
</ThreadStat>
<MemoryGrantInfo SerialRequiredMemory="5632" SerialDesiredMemory="2360768" RequiredMemory="28960" DesiredMemory="2384096" RequestedMemory="2384096" GrantWaitTime="0" GrantedMemory="2384096" MaxUsedMemory="88768" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="209715" EstimatedPagesCached="104857" EstimatedAvailableDegreeOfParallelism="4" /> …Run Code Online (Sandbox Code Playgroud) 我有一个将本地 SSD 用于 tempDB 的生产部署。我在 RAID1 配置中有 2 个 SSD。我看到平均读取时间为 1-2 毫秒,但所有四个 tempdb 数据文件的平均写入时间都显示为 1377 毫秒。
每个 tempdb 数据文件为 2GB,具有 1GB 的增长设置(自 5 个月前部署以来没有增长)
tempdb 日志显示平均读取时间为 67 毫秒,平均写入时间为 215 毫秒。
SSD 是三星 840 专业版。
以下代码是我用来获取统计信息的代码
SELECT a.database_Id,
a.file_id,
db_name(a.database_id) AS dbname,
b.name,
db_file_type = CASE
WHEN a.file_id = 2 THEN 'Log'
ELSE 'Data'
END,
UPPER(SUBSTRING(b.physical_name, 1, 2)) AS disk_location,
a.io_stall,
a.io_stall_read_ms / Case When a.num_of_reads = 0 Then 1 Else a.num_of_reads end AvgRead,
a.io_stall_write_ms / Case When a.num_of_writes = 0 …Run Code Online (Sandbox Code Playgroud) 我计划将数据库复制从 SQL Server 2012(发布者)运行到 SQL Server 2014(分发者和订阅者)——拉复制。
有没有人做过这种类型的跨版本复制并知道它是否有任何问题?
谢谢!
我创建了一个扩展事件会话,我想在其中查看使用 nolock 提示的所有查询。我决定使用它而不是 sql trace 来最小化可能的性能影响。会话的创建类似于以下语句:
CREATE EVENT SESSION [SCOMDB_debug] ON SERVER
ADD EVENT sqlserver.deprecation_announcement(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)),
ADD EVENT sqlserver.rpc_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.rpc_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sp_statement_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sp_statement_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_statement_completed(
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%'))),
ADD EVENT sqlserver.sql_statement_starting(SET collect_statement=(1)
ACTION(sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.session_id,sqlserver.sql_text,sqlserver.transaction_id,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%NOLOCK%')))
ADD TARGET package0.event_file(SET filename=N'M:\MSSQL11.SCOMDB\MSSQL\Log\SCOMDB_debug.xel',max_file_size=(500))
WITH (MAX_MEMORY=40960 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
结果是数据库实例(用于 SCOM 数据库)变得非常缓慢,应用程序几乎无法使用。
等待统计信息中充满了 SOS_SCHEDULER_YIELD …
我创建了一个表,其中有大约 100 个分区(每月),所有分区都配置为使用页面压缩。之后,我将逐月向该表中插入数据。
我现在希望 SQL Server 应用页面压缩。但是使用sp_estimate_data_compression_savings它看起来不像。(我会节省大约 40%-50%。)
我在配置页面压缩时错过了什么吗?
问题是我现在有大文件,每个分区 70-80 GB。当我压缩它们时,它们是半空的。重新获得这个磁盘空间是不可能的,因为如果我试图缩小分区后面的数据文件,我最终会得到一个碎片化的聚集索引。
我怎样才能避免这种磁盘空间浪费派对?
关于系统的小背景。它是具有 1 个主要和 1 个辅助的 SQL Server 2012 AlwaysOn 可用性组。
我一直在关注这篇文章(SSIS with AlwaysOn)以使 SSIS 与 AlwaysOn 一起工作。我有一个记录服务器当前角色的表和一个每两分钟运行一次检查它最近是否发生故障的作业。我遇到的问题是次要只接受 SSISDB 的只读连接,因此我的脚本不会执行。
这是脚本:
USE master;
DECLARE @last_role TINYINT;
SET @last_role = (
SELECT TOP 1 [replica_role]
FROM [dbo].[replica_role]
);
DECLARE @current_role TINYINT;
SET @current_role = (
SELECT ROLE
FROM sys.dm_hadr_availability_replica_states
WHERE is_local = 1
);
IF (@last_role = 2 AND @current_role = 1)
BEGIN
USE SSISDB;
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'x'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE …Run Code Online (Sandbox Code Playgroud) 我试图理解为什么非聚集索引在过滤时不适用于给定的查询。我的(大)查询的相关部分是这样的:
) results
JOIN BE_Insurance ins
ON results.PayorId = ins.Id
Run Code Online (Sandbox Code Playgroud)
在选择中,我只抓取 ins.name。我最初创建的索引是这样的:
CREATE INDEX IX_BE_Insurance_PayorId_PayorName
ON BE_Insurance (Id) INCLUDE (Name)
WHERE ParentId IS NULL
Run Code Online (Sandbox Code Playgroud)
我的查询是这样的,只有带有 NULL parentId 的 payorIds 才会被选择,但我理解优化器不愿意选择它。但是当我添加一个提示来尝试强制索引时,整个事情就出错了。
由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。
我认为它会遵循我的提示,如果我发现一些错误的数据并且索引缺少一些所需的值,则可能会在执行时出错。从索引中删除过滤器会导致查询成功选择它(即使没有提示)。
带有 WHERE 子句的索引不适合这样的查询吗?只有当优化器可以保证过滤器有效并且不会产生任何缺失值时,它们才符合条件吗?
根据要求,这是整个查询,仍在进行中。
SELECT results.*
FROM (
SELECT auths.*,
worked.WorkedHours,
worked.WorkedUnits,
worked.WorkedAmount,
worked.ActiveClients
FROM (
SELECT PayorId,
SUM(AuthHours) AuthHours,
SUM(AuthUnits) AuthUnits,
SUM(AuthAmount) AuthAmount
FROM (
--DYNAMIC TEMPLATE ----------------------------------------------------------------------------------
SELECT PayorId,
PayorName,
AuthHours AuthHours,
AuthUnits AuthUnits,
AuthAmount AuthAmount
FROM PayorAuthorizations_Level1Data_Authorizations auths WITH(NOEXPAND)
WHERE …Run Code Online (Sandbox Code Playgroud) sql-server index-tuning sql-server-2012 nonclustered-index filtered-index
我知道这个问题一定有一个简单的答案,但我在任何地方都找不到。我们的 SQL 2012 FCI 在其 MSSQL\LOG 文件夹中有 SQLDIAG .XEL 文件。在某些情况下,这些文件通常正好为 100MB,但在 SSMS 中打开时却显示为空(表示显示 0 个事件)。
如果可能的话,我需要知道如何管理它们的最大大小和文件保留时间。
我们有一些来自 SQL 2008 FCI(升级到 SQL 2012)的根驱动器挂载点,这些挂载点只有 1GB。您可以猜到,这些挂载点正在填满,如果可能,我需要限制这些故障转移群集诊断日志,否则我将不得不提出替代解决方案。
sql-server clustering extended-events sql-server-2012 high-availability
我创建了一个视图来显示ValueRange如下:
...
ValueRange=case when Value1>60 and Value1<=65 then '60-65'
when Value1>65 and Value1<=70 then '65-70'
when Value1>70 and Value1<=75 then '70-75' END
...
Run Code Online (Sandbox Code Playgroud)
但是我没有Value1>65 和Value1<=70...的任何数据,所以我看不到结果中的这些行。
我的结果是:
ValueRange Count
60-65 5
70-75 3
Run Code Online (Sandbox Code Playgroud)
但我的结果应该是:
ValueRange Count
60-65 5
65-70 0
70-75 3
Run Code Online (Sandbox Code Playgroud)
编辑:正如我之前所说,完整的代码更复杂。实际上这是二维数据透视表,您的答案对我的 sql 无效。所以我发布了所有代码。
WITH RangeTable(YukRange,FiyatRange) AS (SELECT
YukRange=case when Yük<=20000 or Yük IS NULL then '0-20000'
when Yük>20000 and Yük<=21000 then '20000-21000'
when Yük>21000 and Yük<=22000 then '21000-22000'
when Yük>22000 and Yük<=23000 then '22000-23000' …
我有一个大约 4.5TB 的数据库,因为我们在一个表(按月分区)上并行插入(以减少每日加载时间),该表上的聚集索引往往会出现严重碎片。当我在这张表上从 sys.dm_db_index_physical_stats (Limited) 中进行选择时,它需要很长时间(> 4-5 小时)。有没有更快更好的方法来检查这个表的分区上的碎片级别,这花费的当前时间是完全不可接受的。
sql-server-2012 ×10
sql-server ×8
clustering ×1
compression ×1
dmv ×1
index-tuning ×1
performance ×1
replication ×1
ssd ×1
ssis-2012 ×1
tempdb ×1