数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

2
为什么“时区”不确定?
SQL Server 2016 AT TIME ZONE似乎不确定。但是,我无法找到正式说明这一点的文档,也无法找到其背后的理由。 为什么AT TIME ZONE不确定? 显示非确定性的示例 执行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 返回以下错误: Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is …

6
存储DateTime的首选方式
我们可以通过两种方式存储日期和时间信息。存储DateTime信息的最佳方法是什么? 使用DateTime将日期和时间存储在2个单独的列中还是1个列中? 您能解释一下为什么这种方法更好吗? (链接到MySQL文档以供参考,该问题是一般性的,不特定于MySQL) 日期和时间类型:日期和时间

2
是否有任何DBMS具有区分大小写和不区分重音的排序规则?
请注意,此问题与供应商/版本无关 在我看来,作为说英语的专家(打字员,作家),可以合理地期望单词使用正确的大小写,但不一定具有沿正确方向的正确口音: 当我和Chloe在香榭丽舍大街的饭店maitre d'hotel的tete-a-tete中沉思时,一边等待加尔肯(garcon)取回我炒过的墨西哥胡椒酱... 您就知道了。 因此,今天我想我希望搜索条件使用区分大小写但不区分变音的排序规则,但找不到一个。是否有充分的理由还是我的情况很少见? 这是我正在查看的一些文档示例(尽管认为与供应商/版本无关): SQL Server排序规则名称(SQL Server 2008 R2)

4
为什么差异备份无法指定其基础?
这是我的第一篇DBA.SE帖子,如有任何错误,请通知我,谢谢! 我是一名新的DBA(不是IT专业人员,只是公司中没有其他人可以这样做),所以解释越基本,越好。我一直在阅读有关数据库备份策略的信息(或者,据我所知,它们称为“恢复策略”)。我了解完整,差异和事务日志备份的功能,但是我想知道为什么差异备份只能基于最新的完整备份。 如果差异备份是自上次完整备份以来发生的所有变化,那么为什么差异不能基于我选择的任何备份呢?更清楚地说,我要问的是在进行备份时(而不是在还原时)指定基准。我假设还原时,您将选择正确的基准和相应的差异来执行还原(不使用由基准B制成的差异从基准A还原)。 是什么原因阻止了此功能的实现?我认为一定有原因,我只是不知道那是什么。 注意:我知道不能指定基数,但是我的问题是为什么不指定?(我也对“为什么要这么做?”的讨论不感兴趣) 比喻 这是我了解差异备份的类比: 我有一个Excel文件,在单元格中有一些数据。 在第一天,我将复制此文件并将其存储在其他位置(“完整备份”)。 在第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”。 如果在第二天我又制作了文件的另一个备份副本(“完整”),那怎么办?为什么仍无法将第3或4天的文件与第1天制作的副本进行比较(读取,“进行差异备份”)?据我了解,SQL Server将要求我将(在进行另一次差异备份时)与第二天(如果已进行)进行的完整备份进行比较-没有其他选择。

1
计划缓存大小和保留内存
当运行包括实际执行计划在内的查询时,根运算符(SELECT)告诉我缓存计划大小为32KB。 该连接的查询sys.dm_exec_cached_plans和sys.dm_os_memory_objects,看问题的计划,称该值pages_in_bytes和max_pages_in_bytes为32768(32KB),它匹配缓存计划的大小。 我不明白的是sys.dm_exec_cached_plans.size_in_bytes49152(48KB)中的值代表什么。我已经在所有这些专栏中阅读了BOL,尤其是size_in_bytes这样说: “ 缓存对象消耗的字节数。 ” 我无法理解难题的最后一部分,以了解其真正含义。 我知道所有运算符(不是在谈论用于排序和散列的额外内存授予)都需要一定数量的固定内存来存储状态,进行计算等,这些内存与优化后的计划一起存储在缓存中,但是在哪里? 因此,我的问题是: 到底是size_in_bytes什么意思 为什么它的值比“缓存的计划大小”高? 为所有操作员/迭代器保留的固定内存量是哪里,是使用“缓存的计划大小”(在我的示例中为32Kb)还是其他任何地方? 我知道它们是具有不同功能的不同DMV,但它们是相关的。在编译(缓存)计划sys.dm_exec_cached_plans加入sys.dm_os_memory_objects在memory_object_address列。我在此处发布问题的原因是,我正在寻求帮助,了解如何解释DMV及其列。 如果size_in_bytes是缓存的计划大小,为什么SQL Server在实际执行计划中说另一个值? 新查询,新数字: 实际计划 缓存的计划大小16KB 编译内存96KB DMV: sys.dm_exec_cached_plans.size_in_bytes 24KB sys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。 另外,请注意,此查询不需要任何其他内存授予即可进行排序和哈希操作。 Microsoft SQL Server 2012-11.0.5343.0(X64)

12
在SQL Server中仅将每个句子的每个单词的首字母大写
我只想将SQL列中每个句子的每个单词的首字母大写。 例如,如果句子是: 我喜欢电影 然后我需要输出: 我喜欢电影 查询: declare @a varchar(15) set @a = 'qWeRtY kEyBoArD' select @a as [Normal text], upper(@a) as [Uppercase text], lower(@a) as [Lowercase text], upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only] 在这里,我只在专栏中对上,下和大写第一个字母(这里我只输入了一个随机单词)。 这是我的结果: 有这样做的可能性吗? 不使用用户定义的功能就可以得到结果吗? 我需要输出 Qwerty Keyboard

1
多语句TVF与串联TVF性能
比较回文问题上的一些答案(仅限10k以上的用户,因为我删除了答案),结果令人困惑。 我提出了一个多语句,受模式约束的TVF,我认为它比运行标准功能要快。我也有一种印象,即多语句TVF将被“内联”,尽管在这一点上我是错的,如下所示。这个问题是关于这两种样式的TVF的性能差异。首先,您需要查看代码。 这是多语句TVF: IF OBJECT_ID('dbo.IsPalindrome') IS NOT NULL DROP FUNCTION dbo.IsPalindrome; GO CREATE FUNCTION dbo.IsPalindrome ( @Word NVARCHAR(500) ) RETURNS @t TABLE ( IsPalindrome BIT NOT NULL ) WITH SCHEMABINDING AS BEGIN DECLARE @IsPalindrome BIT; DECLARE @LeftChunk NVARCHAR(250); DECLARE @RightChunk NVARCHAR(250); DECLARE @StrLen INT; DECLARE @Pos INT; SET @RightChunk = …


2
如何在upsert中获取冲突行的ID?
我有一个tag包含2列的表格:id(uuid)和name(text)。现在,我想在表中插入一个新标签,但是如果该标签已经存在,我只想获取id现有记录的。 我以为我可以ON CONFLICT DO NOTHING结合使用RETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; 但是,如果名称“ foo”的标记已存在,则返回空结果集。 然后,我将查询更改为使用noop DO UPDATE子句: INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; 这可以按预期工作,但是有些混乱,因为我只是将名称设置为已经存在的值。 这是解决此问题的方法,还是我缺少一种更简单的方法?

8
为什么主键值会改变?
我最近一直在研究ROWGUID的概念,并遇到了这个问题。 这个答案给出了真知灼见,但由于提到更改主键值,使我陷入了另一个困境。 我一直认为主键应该是不变的,而且自阅读此答案以来,我的搜索仅提供了与最佳实践相同的答案。 创建记录后,在什么情况下需要更改主键值?

2
列大小增加后,为什么创建索引需要花费更长的时间?
我们的供应商更改了整个数据库中几乎所有列的列宽。该数据库约为7TB,可容纳9000多个表。我们正在尝试在具有55亿行的表上创建索引。在供应商升级之前,我们可以在2小时内创建索引。现在需要几天。他们所做的是将任何varchar(xx)的大小增加到varchar(256)。因此,大多数列以前是varchar(18)或varchar(75)等。 无论如何,主键由6列组成,其总宽度为126个字符。现在,升级后,主键为1283个字符,这违反了SQL Server 900个字符的限制。整个表格的列宽从合并的varchar总数为1049到合并的varchar总数为4009。 数据没有增加,表没有比所有列宽增加之前占用更多的“空间”,但是创建像索引这样简单的内容的性能现在花费了不合理的时间。 谁能解释为什么当唯一要做的就是增加列的大小时,创建和索引需要花费那么多的时间吗? 我们尝试创建的索引是非聚集的,因为pk是聚集索引。经过几次尝试创建索引后,我们放弃了。我认为它运行了4到5天没有完成。 我在非生产环境中尝试了此操作,方法是拍摄文件系统快照,并将数据库安装在安静的服务器上。

2
当临时表使用查找和书签查找时,为什么表变量强制索引扫描?
我试图理解为什么使用表变量会阻止优化器使用索引查找,然后使用书签查找和索引扫描。 填充表格: CREATE TABLE dbo.Test ( RowKey INT NOT NULL PRIMARY KEY, SecondColumn CHAR(1) NOT NULL DEFAULT 'x', ForeignKey INT NOT NULL ) INSERT dbo.Test ( RowKey, ForeignKey ) SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 0)), ABS(CHECKSUM(NEWID()) % 10) FROM sys.all_objects s1 CROSS JOIN sys.all_objects s2 CREATE INDEX …

4
FOR XML无法序列化数据,因为它包含字符(0x0000)
我有一个大查询(如有必要,我将在此处发布),并且出现此错误: 消息6841,级别16,状态1,第1行 FOR XML无法序列化节点'NoName'的数据,因为它包含XML不允许的字符(0x0000)。要使用FOR XML检索此数据,请将其转换为二进制,varbinary或图像数据类型,然后使用BINARY BASE64指令。 我使用的唯一部分FOR XML是在这里: WHERE (CodFuncionario = Results.CodFuncionario) FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS [Experiencia] 但是,什么是node noname?以及如何寻找该值:(0x0000) 这是子查询之一(我只有FOR XML): SELECT [CodFuncionario], STUFF ( ( SELECT ' / ' + CAST ( [DescFuncao] + '-' + [DescTempoExperiencia] AS VARCHAR(MAX) )... FROM [Linked_Server].db.dbo.tblFuncionarioExperiencia T0 INNER …


7
将每日时间表分组为[开始日期;结束日期]与星期几的间隔
我需要在两个系统之间转换数据。 First系统将日程表存储为简单的日期列表。计划中包含的每个日期都是一行。日期顺序可能会有各种差异(周末,公共假期和较长的停顿时间,日程表中可能不包括一周中的某些天)。根本没有差距,甚至可以包括周末。日程安排可能长达2年。通常是几个星期。 这是一个跨越两周(不包括周末)的时间表的简单示例(以下脚本中有更复杂的示例): +----+------------+------------+---------+--------+ | ID | ContractID | dt | dowChar | dowInt | +----+------------+------------+---------+--------+ | 10 | 1 | 2016-05-02 | Mon | 2 | | 11 | 1 | 2016-05-03 | Tue | 3 | | 12 | 1 | 2016-05-04 | Wed | 4 | | …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.