标签: sql-server-2016

按历史“本月最后一天”过滤表

我有一个每日附加表,我需要一个公式来将表结果过滤到任何给定历史月份的最后一天。例如:

桌子:

DwDate            Balance
20181231           $10
20190131           $80   
20190228           $75
20190331           $50
Run Code Online (Sandbox Code Playgroud)

99% 的时间我只需要MAX(DwDate),这将是:

@MaxDate = (SELECT MAX(DwDate) FROM dbo.TABLE)
Run Code Online (Sandbox Code Playgroud)

但是,有时我需要一个可以让我回到 1 或 2 个月的公式:

@MaxDate - 2 Months
Run Code Online (Sandbox Code Playgroud)

sql-server date sql-server-2016 date-math

3
推荐指数
1
解决办法
223
查看次数

手动 AG 故障转移后超出最大工作线程数

我们有两个 SQL Server 2016 SP2 CU6 Enterprise 在物理硬件(32 核)上运行,其中一个 AG 包含 5 db。二级不可读。今天我们做了一个有计划的手动故障转移,所以我们可以在另一台服务器上做维护工作。我们在没有重负载的情况下进行了故障转移。

故障转移是通过 SSMS 的 GUI 执行的,没有出现错误。但是几分钟后,我们接到了很多用户无法登录的电话。我们第一次尝试进行故障排除是与 SSMS 建立连接,但这给出了我们无法连接的错误,我不记得确切的错误消息。

接下来我们在记事本中查看错误日志文件,它就像SQL Server引擎挂起一样。故障转移后没有新条目添加到日志中。

由于问题的紧迫性,我们重新启动了主服务器上的 SQL Server 服务,问题消失了。
我们本可以尝试建立 DAC 连接以查看问题所在,但目的是让服务器尽快恢复在线状态。

一切恢复正常后,我们开始分析日志文件。
在旧主服务器的错误日志中,我们发现了几个错误 35278。在故障转移时没有长时间运行的事务在运行。

接下来是 AlwaysON_health 事件文件,这里的条目在故障转移后刚刚停止。

接下来我们看了一下*_*_SQLDIAG_*_*.xel文件。在这里,我们很幸运。

我们注意到的第一件事是:

<queryProcessing maxWorkers="960" workersCreated="1064"
 workersIdle="23" tasksCompletedWithinInterval="19" pendingTasks="34"
 oldestPendingTaskWaitingTime="1316776"
Run Code Online (Sandbox Code Playgroud)

由于某种原因,超过了最大工人数量,这可以解释为什么没有人可以连接。

这是待处理的任务:

<pendingTasks><br>
   <entryPoint name="Process Command" count="14" /><br>
   <entryPoint name="SNI New Connection" count="2" /><br>
   <entryPoint name="SNI Accept Done" count="3" /><br>
   <entryPoint moduleName="sqlmin.dll" imageBase="0x7ff827e80000" size="0x251e000" address="0x7ff8286622e0" count="6" /><br>
   <entryPoint moduleName="sqlmin.dll" imageBase="0x7ff827e80000" size="0x251e000" address="0x7ff8292b1190" count="2" /><br> …
Run Code Online (Sandbox Code Playgroud)

troubleshooting availability-groups sql-server-2016

3
推荐指数
1
解决办法
604
查看次数

SQL Server 2016 SP1 + 长期版本保留策略(快照、时态表、其他?)

我们有一个从上游数据仓库提供的数据集市,我们为外部各方生成报告。我有一个业务需求,要在每个月末保留数据库的状态,以确保结果的可重复性,以防我们被要求在同一时间段内进行更多分析。数据库 <100GB,大约 40-50 个表,没什么太疯狂的。

我知道 SQL 2016 SP1 中有一些有趣的新选项需要考虑。我在这里的目标不是快速/轻松访问前几个月,而是更多关于数据的完整性/不变性,但任何涵盖后者同时在前者中领先的解决方案都会赢得这一轮。

哪种方法在这里最有意义?

  1. 传统备份:存档到外部存储,根据需要恢复。但这显然是 DBA 方面最麻烦的,也是自助服务最少的选项。注意:由于我需要保留所有副本,之后这将是很多存储空间。
  2. 数据库快照:创建快照并无限期保留。但是我不知道有什么解决方案可以让我保护快照本身,如果服务器上有任何损坏,那么我的快照就会被冲洗掉,并且无法重现它们。但自助服务方面似乎很难被击败。是否有我缺少的第 3 方解决方案?
  3. 时态表:2016 年很酷的新功能,有人真的在用吗?重构我们的方案以支持这一点看起来像是一项繁重的工作,所以这可能是不可能的。
  4. 基于@Max Vernon 的建议......每月恢复到只读数据库,也许使用 Stretch Database:这听起来不错,因为这将是很多冷数据......但实际上有人使用 Stretch Database 吗?这是微软会在几年内悄悄弃用的东西吗?
  5. 我在这里完全失踪的其他东西?

更新:截至 2019 年年中,Stretch Database 的启动成本相当高,仅用于 Azure 中的计算(额外存储)的起价约为 1800 美元/月,所以我想说这使得它无法实现更大的用例。

sql-server best-practices snapshot temporal-tables sql-server-2016

3
推荐指数
1
解决办法
89
查看次数

SQL Server 使用什么对表进行计数(*)?

在内部,SQL Server 如何确定select(*)? 堆和聚集索引之间有区别吗?是否能够使用聚集索引做一些聪明的事情而不必加载整个表?

index sql-server heap sql-server-2014 sql-server-2016

3
推荐指数
1
解决办法
128
查看次数

可用性组自动故障转移不是那么自动

停止 SQL Server 服务时的行为

  • 可用性组失败(在 SECONDARY SQL SERVER 上解析并在集群管理上失败)。

  • SQL Server 不与集群 ip 连接(我在软件内部使用固定的集群 ip 以便它在 SQL1 和 SQL2 上x.x.x.10连接。使用应该在x.x.x.9(SQL1)和x.x.x.8(SQL2)上连接我,因为windows failover cluster.

    • 我需要手动将 AG 移动到辅助(我在 SQL2 和 上连接right click > failover)。
  • 要按原样返回所有内容,我需要SQL1 SERVICE手动启动、连接SQL1 SSMSright click > failover手动。停止集群管理上的 NODE2 服务,使其再次将 SQL1 节点变为主节点。

停止主集群节点时的行为

  • 可用性组转到 SQL2/NODE 2(辅助现在是主要的)。

  • 主 AG 未解决...

  • SQL Server 与集群 ip 连接(我说的是 SSMS 。与 ipX.x.x.10连接x.x.x.8,在杀死节点x.x.x.9( …

sql-server clustering failover availability-groups sql-server-2016

3
推荐指数
1
解决办法
587
查看次数

涉及超过一百万行的 Top、Order By 和 Where 条件的性能问题

我有一个查询,如下所示:

Declare @CompanyID as int = 10;

Select Top 50  UserID, AuditTypeID , [Action], ActionDate , [Description] , 
RecordID, S.ID as SiteUserID from AuditTrial A

inner Join SiteUser S on S.ID = A.UserID

where A.CompanyID = @CompanyID And A.AuditTypeID <> 1 
And 

UserID in 
(
    1,2,3 -- will be a subquery - will have upto 100+ rows.
)

Order by ID desc -- Latest rows
Run Code Online (Sandbox Code Playgroud)

这是一个稍大一点的查询的一部分,我暂时删除了一些额外的条件,甚至这个剥离的查询运行得更慢。

关键是前 50 名按 ID最新订购带有用户 ID …

sql-server stored-procedures sql-server-2016

3
推荐指数
1
解决办法
162
查看次数

为 SP2 安装最后一个 CU,而无需在 sql server 中安装 SP1

一位客户要求我更新他们的 SQL Server。

这是 2016 年的基本版本 (13.00.1601.00)

微软已经发布了 SP2 CU10。我知道累积更新是......就像......累积,但即使在服务包之间?

可以直接跳转安装SP2 CU10还是需要之前安装SP1的最后一个CU?

sql-server service-pack sql-server-2016

3
推荐指数
1
解决办法
582
查看次数

使用 group by 和 window 函数减少表扫描

有一个我正在尝试改进的代码,如下所示(简单示例):

SELECT    DISTINCT a.col_a
         ,COALESCE(b1.col_c, b2.col_c, b3.col_c)
FROM      tab_a a
LEFT JOIN tab_b b1
          ON a.col_a = b1.col_a
             AND b1.col_b = 'blabla1'
LEFT JOIN tab_b b2
          ON a.col_a = b2.col_a
             AND b2.col_b = 'blabla2'
LEFT JOIN tab_b b3
          ON a.col_a = b3.col_a
             AND b3.col_b = 'blabla3';
Run Code Online (Sandbox Code Playgroud)

您可以使用以下脚本重新创建这些表

CREATE TABLE tab_a(col_a int)
CREATE TABLE tab_b(col_a INT, col_b VARCHAR(10), col_c INT)

INSERT INTO dbo.tab_a ( col_a ) VALUES ( 1 ), ( 2 ), ( 3 );

INSERT INTO dbo.tab_b ( col_a …
Run Code Online (Sandbox Code Playgroud)

sql-server window-functions sql-server-2016

3
推荐指数
1
解决办法
280
查看次数

即使在重新启动后 SQL Server 作业也卡住了

我有一个 SQL Server 代理作业卡在“进行中”。这是一个完整的备份,通常需要 30 分钟,但它需要 7 小时,而且还在增加。我重新启动了代理,然后重新启动了整个操作系统,它仍然显示“进行中”。

有什么办法可以阻止吗?

如果我运行select * from sys.dm_exec_requests,我会得到 2 行处于“正在运行”状态,一个是“SELECT”,另一行是“DBCC TABLE CHECK”。事实上,这项工作的第一步是使用 Ola Hallengren 的脚本运行数据库完整性检查。

版本:

Microsoft SQL Server 2016 (RTM-GDR) (KB4019088) - 13.0.1742.0 (X64)
2017 年 7 月 5 日 23:41:17 版权所有 (c) Windows Server 2016 Datacenter 6.3(内部版本 14393)上的 Microsoft Corporation 标准版(64 位): )(管理程序)

sql-server sql-server-agent sql-server-2016

3
推荐指数
1
解决办法
1555
查看次数

连接多列外键的最佳方法是什么?

我们正在扩展我们的数据仓库以包含一个新的源系统。在新系统中,我们希望主键只有一列,但在旧系统中,它是两列。

例如:

create table #new_case (case_id varchar(255))

create table #old_case (patient_id int, care_event_counter int)

insert into #old_case (patient_id, Care_event_counter)
values 
(55, 1),
(55, 2),
(55, 3),
(56, 1),
(57, 1),
(57, 2)

insert into #new_case (case_id)
select cast(patient_id as varchar(55)) + '_' + cast(care_event_counter as varchar(55))
from #old_case

select * from #new_case
Run Code Online (Sandbox Code Playgroud)

问题:这在大规模上必须非常慢,我更喜欢全面使用 int 。

问题:如何智能合并两个整数列?有没有数学技巧可以用来推导出更快的值?

data-warehouse sql-server sql-server-2016

3
推荐指数
1
解决办法
905
查看次数