这是我的第一篇 DBA.SE 帖子,所以请告诉我任何错误,谢谢!
我是一名新的 DBA(不是 IT 专业人员,只是公司中没有其他人可以这样做),所以解释越基本越好。我一直在阅读有关数据库备份策略(或者,我已经学会将其称为“恢复策略”)的文章。我了解完整、差异和事务日志备份的作用,但我想知道为什么差异备份只能基于最近的完整备份。
如果差异备份是自上次完整备份以来发生变化的所有内容,那么为什么差异不能基于我选择的任何备份?更清楚地说,我问的是在进行备份时指定基础,而不是在恢复时。我假设在恢复时您会选择正确的基数和相应的差异来执行恢复(不使用由基数 B 制成的差异从基数 A 恢复)。
阻止此功能实现的原因是什么?我想一定是有原因的,我只是不知道它是什么。
注意:我知道不能指定基数,但我的问题是为什么不指定?(我也对“你为什么要?”的讨论不感兴趣)
这是我如何理解差异备份的类比:
我有一个 Excel 文件,单元格中有一些数据。
在第 1 天,我制作了该文件的副本并将其存储在其他地方(“完整备份”)。
在第 2 天,我查看该文件并将其与我在第 1 天制作的备份副本进行比较,并记下所有已更改的单元格及其新值(“差异备份”)。我没有注意到对单元格所做的每一个更改,只注意到它的最终值是什么。如果单元格 A1 以“Alfred”开头,改为“Betty”、“Charlie”,然后是“Dave”,我只会注意到“A1 现在是 Dave”。
在第 3 天,我再次将当前文件与备份文件进行比较并注意更改(另一个“差异备份”与第 2 天具有相同的基础)。同样,只注意观察时每个单元格的最终值,而不是单元格一整天的所有值。
在第 4 天,我再次比较并再次注意变化。继续使用单元格 A1,现在它显示“Sarah”,即使它全天有 10 个其他名字,我只注意到“现在 A1 是 Sarah”。
第 5 天,我的文件搞砸了;因此,我查看了我在第 1 天制作的备份副本,然后查看了第 4 天记录的最终状态,然后将记录的更改应用于备份副本,现在我将文件“恢复”到第 4 天的状态因此,我查看了第 1 天所做的备份,看到第 4 天单元格 A1 以“Sarah”结尾,并将备份单元格 A1 更改为“Sarah”。
如果我在第 2 天制作了文件的另一个备份副本(“完整”),为什么会如此重要?为什么仍然不能将第 3 天或第 4 天的文件与第 1 天制作的副本进行比较(阅读,“对其进行差异备份”)?据我了解,SQL Server …
在 SQL Server 中,行存储表上的非唯一非聚集索引在非聚集索引结构的所有级别合并了基础对象的书签(RID 或聚集键)。书签作为非聚集索引键的一部分存储在所有索引级别。
另一方面,如果非聚集索引是unique,则书签仅存在于索引的叶级别 - 不作为键的一部分(实际上,书签作为一个或多个包含的列存在)。
在 SQL Server 2016 中,可以在面向列的表(具有聚集列存储索引的表)上构建非聚集 b 树索引。
在某些情况下,INSERT INTO <tablename> (WITH TABLOCK)由于日志记录最少,执行 an会更快。这些情况包括将数据库置于BULK_LOGGED恢复模型中。
是否有任何其他潜在的性能优势,使用WITH TABLOCK上INSERT的空白表时,数据库(tempdb数据库)使用SIMPLE恢复模式?
我正在使用 SQL Server 2012 标准版。
我的用例是在使用 的存储过程中创建然后立即填充临时表INSERT...SELECT,其中可能包含多达几百万行。我尽量避免这种tempdb滥用,但有时需要这样做。
我正在尝试构建一个需要 require 的案例TABLOCK。它似乎不会伤害任何东西,并且可能有好处。我试图弄清楚是否有足够的潜在好处将它添加到我们的代码库中的任何地方,我确信没有其他进程想要写入表。
我通常使用集群 PK 插入新创建的本地临时表,但有时会使用堆。
我有一张这样的表:
CREATE TABLE Updates
(
UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
ObjectId INT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
本质上是跟踪 ID 增加的对象的更新。
该表的使用者将选择一个由 100 个不同对象 ID 组成的块,按UpdateId特定的UpdateId. 本质上,跟踪它停止的位置,然后查询任何更新。
我发现这是一个有趣的优化问题,因为我只能通过编写由于索引而碰巧做我想要的查询来生成最大优化的查询计划,但不保证我想要什么:
SELECT DISTINCT TOP 100 ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
Run Code Online (Sandbox Code Playgroud)
@fromUpdateId存储过程参数在哪里。
有以下计划:
SELECT <- TOP <- Hash match (flow distinct, 100 rows touched) <- Index seek
Run Code Online (Sandbox Code Playgroud)
由于UpdateId正在使用索引上的搜索,结果已经很好,并且按照我想要的从最低到最高的更新 ID 排序。这会生成一个流程不同的计划,这就是我想要的。但是排序显然不能保证行为,所以我不想使用它。
这个技巧也会产生相同的查询计划(尽管有一个冗余的 TOP):
WITH ids AS
(
SELECT ObjectId
FROM Updates …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization sql-server-2014 query-performance
我有一个观点,complicated_view-- 有一些连接和 where 子句。现在,
select * from complicated_view (9000 records)
Run Code Online (Sandbox Code Playgroud)
更快,更快,比
select top 500 * from complicated_view
Run Code Online (Sandbox Code Playgroud)
我们说的是 19 秒对 5+ 分钟。
第一个查询返回所有 9000 条记录。如何只获得前 500 名的时间长得可笑?
显然,我将在这里查看执行计划 ---- 但是一旦我弄清楚为什么SQL Server 以次优方式运行“前 500”,我该如何实际告诉它以快速方式运行计划,喜欢坐满桌?
当然,我可能不得不完全重写视图——但很奇怪。
基本上,我将此数据表连接到第 3 方软件,该软件使用select top 500 *无法修改的默认查询预先检查表。因此,除了将此视图转储到实际表中(非常草率)之外,我也无法绕过他们的“前 500 名”附录。
这是 SQL Server 2012。
编辑:不同意重复标志。另一个问题,顶部比所有的都快。这将是预期的行为,返回较少的行。我的情况正好相反。另外,我的理解是 Top 100 是一种与 Top 100+ 不同的算法。我什至不认为重复的问题有正确的答案。也就是说,TOP X 查询将在很早的时候对潜在的大量表进行排序,而不是在它们被聚合/过滤/等之后。为什么是一个谜,但如何显然存在。
performance sql-server execution-plan select top query-performance
我varchar在 SQL Server 的表中有一个列,其中包含一个 base64 编码的文本字符串,我想将其解码为纯文本等效项
SQL Server 是否具有处理此类事情的任何本机功能?
一个示例 base64 字符串:
cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA==
Run Code Online (Sandbox Code Playgroud)
解码为:
role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764
Run Code Online (Sandbox Code Playgroud) sql-server t-sql sql-server-2008-r2 cast string-manipulation
为什么这两个SELECT语句会导致不同的排序顺序?
USE tempdb;
CREATE TABLE dbo.OddSort
(
id INT IDENTITY(1,1) PRIMARY KEY
, col1 NVARCHAR(2)
, col2 NVARCHAR(2)
);
GO
INSERT dbo.OddSort (col1, col2)
VALUES (N'e', N'eA')
, (N'é', N'éB')
, (N'ë', N'ëC')
, (N'è', N'èD')
, (N'ê', N'êE')
, (N'?', N'?F');
GO
SELECT *
FROM dbo.OddSort
ORDER BY col1 COLLATE Latin1_General_100_CS_AS;
Run Code Online (Sandbox Code Playgroud)
???????????????????????? ? ID ?列 1 ? 列 2 ? ???????????????????????? ? 1 ? ? ? ? 2 ? é ? 乙 ? ? 4 ? ? …
这个问题类似于优化 IP 范围搜索?但那个仅限于 SQL Server 2000。
假设我有 1000 万个范围临时存储在一个表中,结构和填充如下。
CREATE TABLE MyTable
(
Id INT IDENTITY PRIMARY KEY,
RangeFrom INT NOT NULL,
RangeTo INT NOT NULL,
CHECK (RangeTo > RangeFrom),
INDEX IX1 (RangeFrom,RangeTo),
INDEX IX2 (RangeTo,RangeFrom)
);
WITH RandomNumbers
AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num
FROM sys.all_objects o1,
sys.all_objects o2,
sys.all_objects o3,
sys.all_objects o4)
INSERT INTO MyTable
(RangeFrom,
RangeTo)
SELECT Num,
Num + 1 + CRYPT_GEN_RANDOM(1)
FROM RandomNumbers
Run Code Online (Sandbox Code Playgroud)
我需要知道包含值的所有范围50,000,000。我尝试以下查询
SELECT *
FROM MyTable
WHERE 50000000 …Run Code Online (Sandbox Code Playgroud) SQL Server 中的默认排序规则类型允许针对不区分大小写的字符串进行索引,但数据的大小写仍然保留。这实际上是如何工作的?我正在寻找实际的具体细节、位和字节,或详细解释它的好资源。
create table casetest (fruitnames nvarchar(50) not null);
create unique index IX_fruitnames on casetest(fruitnames);
insert into casetest values ('apples');
insert into casetest values ('Pears');
-- this insert fails
insert into casetest values ('pears');
-- this yields 'Pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'
update casetest set fruitnames = 'pears' where fruitnames = 'pEArs'
-- this yields 'pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'
Run Code Online (Sandbox Code Playgroud)
对于圣经希伯来语,我应该使用哪种 SQL Server 排序规则?所考虑的数据库需要适应变音符号(即元音、重音、比喻等)。
database-design sql-server collation configuration sql-server-2017
sql-server ×10
collation ×3
performance ×3
optimization ×2
backup ×1
cast ×1
columnstore ×1
insert ×1
select ×1
t-sql ×1
top ×1
unicode ×1