我有一个每日附加表,我需要一个公式来将表结果过滤到任何给定历史月份的最后一天。例如:
桌子:
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 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) 我们有一个从上游数据仓库提供的数据集市,我们为外部各方生成报告。我有一个业务需求,要在每个月末保留数据库的状态,以确保结果的可重复性,以防我们被要求在同一时间段内进行更多分析。数据库 <100GB,大约 40-50 个表,没什么太疯狂的。
我知道 SQL 2016 SP1 中有一些有趣的新选项需要考虑。我在这里的目标不是快速/轻松访问前几个月,而是更多关于数据的完整性/不变性,但任何涵盖后者同时在前者中领先的解决方案都会赢得这一轮。
哪种方法在这里最有意义?
更新:截至 2019 年年中,Stretch Database 的启动成本相当高,仅用于 Azure 中的计算(额外存储)的起价约为 1800 美元/月,所以我想说这使得它无法实现更大的用例。
sql-server best-practices snapshot temporal-tables sql-server-2016
在内部,SQL Server 如何确定select(*)? 堆和聚集索引之间有区别吗?是否能够使用聚集索引做一些聪明的事情而不必加载整个表?
停止 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.
right click > failover)。要按原样返回所有内容,我需要SQL1 SERVICE手动启动、连接SQL1 SSMS和right 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
我有一个查询,如下所示:
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。
这是 2016 年的基本版本 (13.00.1601.00)
微软已经发布了 SP2 CU10。我知道累积更新是......就像......累积,但即使在服务包之间?
可以直接跳转安装SP2 CU10还是需要之前安装SP1的最后一个CU?
有一个我正在尝试改进的代码,如下所示(简单示例):
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 代理作业卡在“进行中”。这是一个完整的备份,通常需要 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 位): )(管理程序)
我们正在扩展我们的数据仓库以包含一个新的源系统。在新系统中,我们希望主键只有一列,但在旧系统中,它是两列。
例如:
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 。
问题:如何智能合并两个整数列?有没有数学技巧可以用来推导出更快的值?
sql-server-2016 ×10
sql-server ×9
clustering ×1
date ×1
date-math ×1
failover ×1
heap ×1
index ×1
service-pack ×1
snapshot ×1