这与 2012 -> 2016 升级的回滚方案有关。
场景是 SQL Server 2012 数据库恢复到 2016 并应用日志文件,直到它是最新的。然后将生产系统切换到 2016 年。数据库保持在 2012 年的兼容级别。随后,保留 2016 年实例的增量日志,直到需要回滚(假设 8 小时)。
现在可以将日志应用于 SQL Server 2012 实例以使其更新吗?
这与 2012 -> 2016 升级的回滚方案有关。
场景是 SQL Server 2012 数据库恢复到 2016 并应用日志文件,直到它是最新的。然后将生产系统切换到 2016 年。数据库保持在 2012 年的兼容级别。随后,保留 2016 年实例的增量日志,直到需要回滚(假设 8 小时)。
现在可以将日志应用于 SQL Server 2012 实例以使其更新吗?
考虑这些查询(SQL Fiddle):
查询一:
SELECT * INTO #TMP1 FROM Foo
UNION
SELECT * FROM Boo
UNION
SELECT * FROM Koo;
查询 2:
SELECT * INTO #TMP2 FROM Foo
UNION
SELECT * FROM Boo
UNION ALL
SELECT * FROM Koo;
请注意,Koo 与 Boo/Foo 不重叠,因此最终结果是相同的。问题是为什么第一个UNION / UNION组合没有合并到单个 SORT 操作中?
我有一个看起来像这样的查询:
SELECT *
FROM TBLA A
LEFT JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
JOIN TBLD D ON C.Col5 = D.Col6
连接将按什么顺序解决?我对 SQL Server 最感兴趣,并将对它的解释标记为答案,但对 ANSI/ISO 标准以及它在各种 RDBMS 中的工作方式同样感兴趣。
这个问题的原因是要弄清楚为什么结果与这个查询不同
SELECT *
FROM TBLA A
CROSS JOIN TBLC C
LEFT JOIN TBLB B ON A.Col1 = B.Col2 AND B.Col3 = C.Col4
JOIN TBLD D ON C.Col5 = D.Col6
我通常通过首先构建一个使用正确计划的查询,然后将其复制到不使用正确计划的类似查询来创建计划指南。但是,这有时很棘手,尤其是在查询不完全相同的情况下。从头开始创建计划指南的正确方法是什么?
SQLKiwi 提到了在 SSIS 中制定计划,有没有一种方法或有用的工具可以帮助为 SQL Server 制定一个好的计划?
有问题的具体实例是这个 CTE:SQLFiddle
with cte(guid,other) as (
select newid(),1 union all
select newid(),2 union all
select newid(),3)
select a.guid, a.other, b.guid guidb, b.other otherb
from cte a
cross join cte b
order by a.other, b.other;
有什么方法可以让结果恰好有 3 个不同guid
的 s 而不是更多?我希望将来能够通过包含 CTE 类型查询的计划指南来更好地回答问题,这些查询被多次引用以克服一些 SQL Server CTE 怪癖。
这与计算符合特定条件的记录数有关,例如invoice amount > $100
。
我倾向于喜欢
COUNT(CASE WHEN invoice_amount > 100 THEN 1 END)
但是,这同样有效
SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END)
我会认为 COUNT 更可取,原因有两个:
COUNT
COUNT
可能在某处涉及一个简单的i += 1
操作,而 SUM 不能指望它的表达式是一个简单的整数值。有没有人有关于特定 RDBMS 差异的具体事实?
最后是一个测试脚本,用于比较@table 变量和#temp 表之间的性能。我想我已经正确设置了——性能计时是在 DELETE/TRUNCATE 命令之外进行的。我得到的结果如下(以毫秒为单位)。
@Table Variable #Temp (delete) #Temp (truncate)
--------------- -------------- ----------------
5723 5180 5506
15636 14746 7800
14506 14300 5583
14030 15460 5386
16706 16186 5360
只是为了确保我是理智的,这表明 CURRENT_TIMESTAMP (aka ) 是在语句时获取的,而不是批处理时,因此 TRUNCATE/DELETE 与语句GetDate()
之间应该没有交互。SET @StartTime = CURRENT_TIMESTAMP
select current_timestamp
waitfor delay '00:00:04'
select current_timestamp
-----------------------
2012-10-21 11:29:20.290
-----------------------
2012-10-21 11:29:24.290
当使用DELETE清表时,第一次运行和后续运行之间的跳转是相当一致的。我对DELETE的理解缺少什么?我已经重复了很多次,交换了顺序,将 tempdb 调整为不需要增长等。
CREATE TABLE #values (
id int identity primary key, -- will be clustered
name varchar(100) null,
number int null,
type char(3) not null,
low int null,
high int null,
status smallint not null
);
GO
SET NOCOUNT ON;
DECLARE @values TABLE (
id int identity primary key clustered,
name varchar(100) null,
number int null,
type char(3) not null,
low int null,
high int null,
status smallint not null
);
DECLARE @ExecutionTime TABLE( Duration bigINT )
DECLARE @StartTime DATETIME, @i INT = 1;
WHILE (@i <= 5)
BEGIN
DELETE @values;
DBCC freeproccache With NO_InfoMSGS;
DBCC DROPCLEANBUFFERS With NO_InfoMSGS;
SET @StartTime = CURRENT_TIMESTAMP -- alternate getdate()
/****************** measured process ***********************/
INSERT @values SELECT a.* FROM master..spt_values a join master..spt_values b on b.type='P' and b.number < 1000;
/**************** end measured process *********************/
INSERT @ExecutionTime
SELECT DurationInMilliseconds = datediff(ms,@StartTime,CURRENT_TIMESTAMP)
SET @i += 1
END -- WHILE
SELECT DurationInMilliseconds = Duration FROM @ExecutionTime
GO
-- Temporary table
DECLARE @ExecutionTime TABLE( Duration bigINT )
DECLARE @StartTime DATETIME, @i INT = 1;
WHILE (@i <= 5)
BEGIN
delete #values;
-- TRUNCATE TABLE #values;
DBCC freeproccache With NO_InfoMSGS;
DBCC DROPCLEANBUFFERS With NO_InfoMSGS;
SET @StartTime = CURRENT_TIMESTAMP -- alternate getdate()
/****************** measured process ***********************/
INSERT #values SELECT a.* FROM master..spt_values a join master..spt_values b on b.type='P' and b.number < 1000;
/**************** end measured process *********************/
INSERT @ExecutionTime
SELECT DurationInMilliseconds = datediff(ms,@StartTime,CURRENT_TIMESTAMP)
SET @i += 1
END -- WHILE
SELECT DurationInMilliseconds = Duration FROM @ExecutionTime
GO
DROP TABLE #values
SET NOCOUNT OFF;
请参阅此相关查询:什么是可视化 SQL 代理作业的好工具?
然而,我并不追求视觉工具,因为我正在寻找建立自己的可视化。这是我的出发点,但你会同意它非常缺乏。
select TOP(1000)
h.run_date, min(h.run_time), j.name, j.description, max(h.run_duration) run_duration
from msdb..sysjobhistory h
join msdb..sysjobs j on j.job_id = h.job_id
group by h.run_date, j.name, j.description, h.instance_id, j.job_id
having max(h.run_duration) > 1000 -- << -- 10 minutes encoded in HHMMSS (digits)
order by h.run_date desc, 2 desc
关键在于,似乎没有sysjobhistory
表的键将其标识为 a 的特定“实例” sysjob
。例如,在 12:30 开始的具有 4 个步骤的作业被插入sysjobhistory
4 次,具有不同的instance_ids(唯一)。它们都与sysjob.job_id
值相关,但这是时间表,而不是作业的调用。我应该看另一张桌子吗?
这可能相当简单,因为 SSMS 可以轻松完成。
范围:以 10 种方式索引的十亿记录表。每天的变化率为百分之一。
一些索引单调递增(日期时间/时间戳),但常见查询很可能到达尾部。我假设这种类型的统计数据需要经常更新,否则最近的数据会在索引中消失?
其他索引的分布更为随机,例如(客户密钥、日期时间)。这些可以通过不太频繁的更新来实现,因为统计数据非常能代表整体。我们可以让索引的变化足以强制对这些进行自动统计更新,对吗?
对于这两种类型,如果要抽样的数据是随机的并且非常能代表整体,那么将抽样从 10% 增加到 100% 有什么好处吗?
寻找结核病数据的最佳实践。
这是使用RC0。
我已经设置了一个 SQL Server 2012 AlwaysOn(或更准确地说,极有可能但并非总是)可用性组。
我使主节点脱机。
任何测试过这项新的 AlwaysOn 功能的人都可以验证我的结果吗?
ConnectionString=Provider=SQLOLEDB.1;Server=10.10.10.10;User ID=x;Password=y;Persist Security Info=True;Initial Catalog=z
注意:我尝试了下面的方法,但我得到的只是“连接链接失败”并且它永远无法恢复。有人会认为 Native 客户端会更好用吗?
ConnectionString=Provider=SQLNCLI11.1;Server=tcp:10.10.10.10,8888;User ID=x;Password=y;Persist Security Info=True;Initial Catalog=z