是否可以在 oracle 中存储名字/姓氏/全名以及可能的 oracle 用户帐户的附加信息?
我查看表 dba_users 但它不包含此类信息。
我需要确保将 oracle 帐户映射到一个唯一的人。所以除了名字之外,理想情况下我需要在名字之上有一个核心身份信息或电子邮件地址。
在 oracle 中如何确保这一点?
是否可以在 oracle 中存储名字/姓氏/全名以及可能的 oracle 用户帐户的附加信息?
我查看表 dba_users 但它不包含此类信息。
我需要确保将 oracle 帐户映射到一个唯一的人。所以除了名字之外,理想情况下我需要在名字之上有一个核心身份信息或电子邮件地址。
在 oracle 中如何确保这一点?
我正在寻找一个查询,以从以下 samle XML 中获取元素“PRODUCT”的所有属性值“NetAmount”:
<ROOT>
<CATEGORY name="A">
<PRODUCT NetAmount="10.50"/>
<PRODUCT NetAmount="20.50"/>
</CATEGORY>
<CATEGORY name="B">
<PRODUCT NetAmount="30.50"/>
<PRODUCT NetAmount="40.50"/>
<PRODUCT NetAmount="75.50"/>
</CATEGORY>
</ROOT>
对于我的场景,XML 是存储在表中还是变量中并不重要。
我尝试了几种不同的方法,但都失败了。
样本:
SELECT
NetAmount.value('(@NetAmount)[1])','varchar(250)') AS Products
FROM
@x.nodes('//ROOT/Category/Product')
AS P(NetAmount)
我通常会收到以下对我来说毫无意义的错误消息:
Meldung 2370,Ebene 16,Status 1,Zeile 5 XQuery [value()]:Am Ende des XQuery-Ausdrucks wurden keine Token mehr erwartet。Gefunden:')'。
我有以下结构,在根目录下的第二级具有可变数量的元素,名称未知:
<root>
<A>text a</A>
<B>text b</B>
</root>
我需要一个在第二级提供特定元素文本的查询。所需元素的名称是用户传入的参数。
我已经成功地找到了它,例如元素“A”,查询存储在变量@x 中的 XML 文档:
declare @str varchar(1000) = '<root><A>text a</A><B>text b</B></root>'
declare @x xml = convert(xml, @str)
SELECT xLangStruct.x.value('(A/text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x)
这适用于“A”,但现在我需要用变量或任何类型的过滤替换“A”......所以我需要这样的东西:
SELECT xLangStruct.x.value('(@SEARCHEDELEMENT/text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x)
或者
SELECT xLangStruct.x.value('(./text())[1]', 'varchar(100)') from @x.nodes('//root') as xLangStruct(x) WHERE xLangStruct.x.Elementname = @SEARCHEDELEMENT
我想使用日志传送将大型数据库(400-700 GB 大小)从服务器(和存储)A 传输到服务器(和存储)B。
我尝试了几次并且成功了。但我对一些细节有疑问:
使用 LogShipping 时,唯一可以采用的日志备份是日志传送过程创建的备份。因此必须提前禁用其他备份软件或作业。
如果我设置日志传送,所需的初始完整备份,无论我是在日志传送设置之前手动获取并恢复它,还是让日志传送设置为我创建和恢复它,都需要一段时间,至少一个小时或更多的,要完了,额外的时间要恢复就中学了。对于较小的数据库,我已经成功地尝试了这两种选择。
我的问题是:如果我为大型数据库设置日志传送并且需要保持能够进行时间点恢复,那么在进行初始完整备份和完整恢复后进行的第一次日志备份之间的时间会发生什么备份完成了吗?备份中是否存在间隙?在日志传送设置完成之前,我猜根本没有配置备份,所以我会失去这段时间吗?或者事务日志会一直增长直到完整备份恢复部分完成并且第一次日志备份发生吗?
当我发现自己使用 sys.sysprocesses 和 sys.dm_exec_session 视图重新设计 sp_who / sp_whoisactive 的功能时,为了获得关于在我的服务器上运行的会话和事务的概述,我想:“不,而是使用已经可用的东西并进行了测试! ”
exec sp_whoisactive @get_additional_info = 1;
返回一个提供大量信息的附加 XML 列,其中之一是Isolation Level。
我想在 sp_whoisactive 的主要结果集中设置隔离级别。有没有人有同样的要求并且已经解决了?为什么不从头开始将其包含在主要结果集中,因为它是重要信息。
我们新安装和配置的 SQL Server Always On Availability Failover Cluster with SQL Server 2016 Enterprise Edition 使用四个实例和六个节点运行。它包括每个集群节点资源中的数据库引擎服务和代理服务。一切正常。
但是现在我们发现 fill-text Filter Daemon Launcher (FTFDL) 服务存在于每个节点上并且随机运行,与 Sql 实例当前运行的位置无关。一些节点有四个 FTFDL 服务在运行,而只有一个实例位于那里。其他人正在运行其中的一两个。
问题:我们是否应该将此服务添加为集群资源?为什么它在故障转移集群实例上明显随机启动和停止,导致多个服务处于活动状态而相关实例不处于活动状态?这里的最佳做法是什么?
今天我使用ALTER DATABASE MODIFY
命令更改了 tempdb 的文件位置,我不小心将它设置为使用卷的根目录。SQL Server 服务无法重新启动,并在事件日志中出现拒绝访问错误。它是一个 2016 Sp1 故障转移集群。我试图解决这个问题
NET START MSSQL$INST1 /f /T3608
但它不起作用。
我该怎么办?如何重新启动服务才能重新定义设置以使用子文件夹。
今天我意识到我们的 sql server 的计划缓存中塞满了 hundreads 和数千个几乎相同的编译计划。
在消耗约 4500 MB 的实时系统上,计划总数约为 30.000。看着它们,有数千个几乎相同。
一些样本:
(@ID uniqueidentifier,@GSS nvarchar(663))UPDATE [TAB1] SET [GSS]=@GSS WHERE [ID]=@ID
(@ID uniqueidentifier,@GSS nvarchar(664))UPDATE [TAB1] SET [GSS]=@GSS WHERE [ID]=@ID
(@ID uniqueidentifier,@GSS nvarchar(665))UPDATE [TAB1] SET [GSS]=@GSS WHERE [ID]=@ID
(@ID uniqueidentifier,@GSS nvarchar(666))UPDATE [TAB1] SET [GSS]=@GSS WHERE [ID]=@ID
(@ID uniqueidentifier,@GSS nvarchar(669))UPDATE [TAB1] SET [GSS]=@GSS WHERE [ID]=@ID
(@ID uniqueidentifier,@FR ntext,@uiStamp datetime,@uiUser varchar(10))UPDATE [TTR] SET [FR]=@FR, [uiStamp]=@uiStamp, [uiUser]=@uiUser WHERE [ID]=@ID
(@ID uniqueidentifier,@FR ntext,@uiStamp datetime,@uiUser varchar(11))UPDATE [TTR] SET [FR]=@FR, [uiStamp]=@uiStamp, [uiUser]=@uiUser WHERE [ID]=@ID
(@ID uniqueidentifier,@FR ntext,@uiStamp datetime,@uiUser varchar(12))UPDATE [TTR] SET [FR]=@FR, [uiStamp]=@uiStamp, [uiUser]=@uiUser WHERE [ID]=@ID
(@ID uniqueidentifier,@FR ntext,@uiStamp datetime,@uiUser varchar(13))UPDATE [TTR] SET [FR]=@FR, [uiStamp]=@uiStamp, [uiUser]=@uiUser WHERE [ID]=@ID
该应用程序几乎在任何地方都使用sp_executesql并将值作为参数传递,这就是为什么我确信计划得到重用的原因。
但现在看起来该应用程序根本不关心字符串类型的长度,长度会根据值的实际长度自动添加,从而导致每个传递的字符串值的每个字符串长度组合都有不同的计划。所以大多数情况下,UPDATE 和 INSERT 语句似乎是这里的问题所在。我想一些开发人员在这一点上已经节省了一些时间,只是简单地忽略了大小。
这些冗余 UPDATE/INSERT 类型的计划的使用次数相对较少(通常为 1 次,有的高达 10 次,只有少数高达 40 次)。
它们的大小介于 0.05 MB 和 2 MB 之间。很难说出可能节省的确切值和数量,因为语句之间的长度常量不断变化,因此无法正确排序。但是,我认为这里的平均计划大小在大约 15000 个更新/插入计划中是 0.17 MB,我猜至少可以节省 80%,大概是实际使用的 2550 MB 中的 2040 MB 的潜在节省那15000个计划。这会将总计划缓存使用量从 4500 MB 减少到……。大约 2500 MB。
看起来我们可以很容易地在这里节省一些内存,对吧?
我们谈论的是内存不多 (32 GB) 的 sql server,它们确实可以从一些额外的可用内存中获益,但是,我想这也是一般系统健康状况的问题。
所以我的问题是,我能做些什么呢?我在数据库端有任何选项来控制这个吗?是否有任何我还不知道的临时查询优化选项让我们忽略这个?
还是真的需要开发者在输入参数中正确添加type和typelength?
在 (n)varchar 类型的情况下,表定义中已经定义了前导长度,那么使用这些类型有什么缺点吗?
附加信息:
与此同时,我发现K.Tripps关于计划缓存变得疯狂的帖子......她的查询显示我有 1500 MB 和 20300 个计划,缓存中的使用计数为 1......
在我的特定情况下,“针对临时工作负载进行优化”是灵丹妙药吗?
更多信息: 我发现查询是由 SqlDataAdapter 和 SqlCommandBuilder 创建的。commandbuilder 无论如何都不会从原始表中导出所有已创建参数的参数大小。如果未设置它们,则传入我们的实际值的大小将用作大小值。这可以在此处找到:“如果未明确设置,则根据指定参数值的实际大小推断大小。 ”
以下简单查询在最近几天多次超时:
SELECT Object1.*,
Object2.Column1,
Object2.Column2 AS Column3
FROM Object2 INNER JOIN Object1 ON Object2.Column2 = Object1.Column3
WHERE Object2.Column4=Variable1 AND
Object2.Column5=Variable2 AND
Object1.Column6=Variable3
我可以在 SentryOne 中捕获它并看到它频繁执行,运行到应用程序设置的 60 秒查询超时并不断导致 12 次 Mio 读取。
我看不到任何相关的东西,比如导致超时的阻塞或死锁。
我复制了查询并在 SSMS 中运行它。它在几毫秒内返回并返回零行。这是我得到的执行计划:https ://www.brentozar.com/pastetheplan/?id=SJ-LK8jug
Lateron,我用相同的查询和相同的参数值再次执行了这一步。突然它运行了大约 90 秒返回零行,我得到了一个不同的计划如下:https ://www.brentozar.com/pastetheplan/?id=HyVu58i_l
如您所见,估计行数为 1,实际行数巨大。这让我猜测对表格进行了很多更改。因此,我查看了所涉及表的 [sys].[dm_db_stats_properties] 值,尤其是 OBJECT1 和使用的索引。
[请注意,为避免混淆,匿名计划对不同的索引使用相同的名称 (Object1.Index1)]
在这一点上,我看到了以下统计值......
Object1.Index1(引用第二个低效的执行计划):
RowsInTable=3826101
RowsSampled=103245
UnfilteredRows=3826101
RowMods=2140
Histogram Steps 200
PercentChanged=0.0
对于 Object1.Index2(聚集索引):
RowsInTable=3826101
RowsSampled=103734
UnfilteredRows=3826101
RowMods=2140
HistoSteps=199
PercentChanged=0.0
然后我意识到我在第一次执行时不小心添加了一个换行符,我认为这让我有了一个不同的、新的执行计划。
我决定更新 OBJECT1 表的所有统计信息。之后我再次运行初始查询,因为我从 SentryOne 中捕获了它,没有任何更改,没有换行符......
这次如预期的那样快,执行计划与第一个有效计划相同。这让我怀疑统计数据有点陈旧。
我再次查询统计元信息,结果如下(参考第一个高效计划):
Object1.Index1(聚集索引)
RowsinTable=3828157
RowsSampled=104017
UnfilteredRows=3828157
RowModifications=14
HistoSteps=199
PercentCahnge=0.0
对于 Object1.Index2(非聚集索引)
RowsInTable=3828157
RowsSampled=103275
UnfilteredRows=3828157
RowMods=14
HistogrSteps=127
PercentChanged=0.0
应用程序随后按预期运行,速度很快,没有超时。所以我想 STATISTICS UPDATE 在这里有所帮助。
让我另外指出,作为我的自动夜间索引和统计维护的一部分,表格的所有索引已在昨晚成功维护/更新。
现在我的问题:
我知道如果执行计划期望的行数很少并且实际上返回的行数比预期多很多,那么执行计划就会有问题。我不明白如果执行计划实际上返回零行,它如何显示 3,141,000 行。这怎么可能?
对表 OBJECT 1 及其统计数据的调查没有显示任何有关较大更改或添加行的提示。自上次自动索引和统计维护以来,我查询了添加或更改的行,看起来有 2370 行被更改,而表中有 ~ 3,800,000 行。由于 [sys].[dm_db_stats_properties] 的值也显示了这一点,因此发生了轻微的变化。统计数据真的是一个问题吗?我上面引用的数字是否显示了更新统计数据的充分理由?
更新: ParameterCompiledValue 和 ParameterRuntimeValue 的值在好计划中是相同的,但在坏计划中是不同的。表 OBJECT1 在 Column6 中有一个值提供了 > 3 Mio 行,而所有其他值提供了最多约 60k 行。BAD 计划使用 ParameterRuntimeValue 的 thi >3 Mio Rows 值,而它是使用仅提供 160 行的值编译的。所以看起来我需要一个解决这两种情况的计划,或者一个更灵活的解决方案来创建一个适当的计划......?
我想知道增长文件的内部方法是否使用
ALTER DATABASE testdb
MODIFY FILE
(
NAME = testdb_Log
, SIZE = 40960MB --40 GB
)
工作方式不同然后让文件随着时间的推移自动增长到相同的大小?
我的问题的背景: 我面临非常高(> 10K)的 VLF 依赖于不同实时数据库的几个日志文件,这些文件具有完全恢复,大小约为 100 GB。
在测试解决此问题的策略时,我将日志文件的大小调整为 16 MB,具有 4 个 VLF,然后让它增长到 40960 MB,然后将 AUTOGROW 设置为 100 MB。之后,我的文件中有 20 个 VLF。
我的期望是看到更多
(40960 MB - 16 MB) / 100 MB *(每个自动增长 8 个 VLF)= 文件中的 3276 个 VLF。
相反,我现在只有 20 个。为什么?
我的问题的第二部分:到目前为止,我了解到不适当的 AUTOGROW 设置会导致高 VLF 计数,这在我们的数据库中肯定是这种情况,在很长一段时间内都没有关注此设置。所有解释如何处理这种情况的文章都建议为 AUTOGROW 选择一个合适的值。但是如果我假设手动增长过程(本文的第一部分)甚至不使用自动增长设置是正确的,并且我以这种方式将日志文件增长到不需要任何自动增长的适当大小,那么自动增长之后设置就没那么重要了吗?
我的问题的第三部分?40GB 日志文件上的 VLF 计数 20 现在是否太低了?这是我读到我们应该以增量方式再次备份文件的原因吗?对于 40 G 或 80 G 的日志文件,多少 VLF 计数可能是一个好的(性能)数字?
当我登录到 Sql-Server 操作系统的远程桌面时,我无法使用 SSMS 建立本地DAC 连接。第一个原因是 SQL 浏览器服务已关闭。Lateron,我被指出的第二个原因是这个“DAC 未激活”错误:
“无法在默认端口上建立 DAC 连接。确保已启用 DAC”。
我寻找解决方案。我发现的建议解决方案是启用“RemoteDacEnabled”Facet 属性或运行
sp_configure 'remote admin connections', 1
这让我想知道,如果我想从 LOCAL SYSTEM 连接,为什么我应该启用REMOTE DacEnabled 属性?我在这里弄错了吗?
“仅允许来自服务器上运行的客户端的连接。不允许网络连接。”
如果我必须从本地服务器登录而不是通过网络登录,那么远程 DAC 设置有什么意义?
编辑/部分答案: 我的问题的主要原因是,我不明白为什么我们必须允许/启用 REMOTEDAC 设置,以防万一我们想从服务器本身建立本地 DAC 连接(这就是我一开始就没有运气)。
现在,在尝试了更多之后,我发现使用...
ServerName.SubDomain.Domain.de
在连接到 DAC 时导致此错误...
服务器名称
确实有效(无需激活 RemoteDac 设置)。
(奇怪的是,我可以使用带有两个选项的“正常”连接正常连接)
根本原因是 FQDN 被解释为远程服务器,这导致了上述错误。
然而,在我启用 REMOTEDAC 之后,上面的两个选项都适用于 DAC,无论我是在服务器本地尝试还是从远程客户端尝试。
是否可以使用 Node01(主动)和 Node02(被动)创建 FAILOVER CLUSTER A,并使用相同的 Node02(被动)和 Node03(主动)创建 FAILOVER CLUSTER B?
我意识到被动节点上的 SQL Server 实例不收费,只收费操作系统。因此,为多个被动 Sql 实例共享一个节点在这里是有意义的。我知道,一旦集群 A 和集群 B 出现问题,我就会被扼杀......
但这是允许的和/或常见的情况吗?
我有以下结构:
Table R Table RZ (n-m) Table Z
------- ----------------- ---------
R1 R1 | Z1 Z1 | "A"
R2 R1 | Z2 Z2 | "B"
R3 R2 | Z1 Z3 | "C"
R4 R2 | Z3 Z4 | "D"
... R3 | Z1 ...
... R3 | Z2 ...
... R3 | Z4 ...
(我省略了一些额外的复杂性并进一步加入以简化)
我需要使用某些列或“R”查询“R”中的所有行,包括结果中具有表“Z”的串联“名称”列的列。
这是上面给定表格内容之后的示例:
ID of R | Name of Z
--------------------
R1 | "A,B"
R2 | "A,C"
R3 | "A,B,D"
到目前为止,R 的每一行都使用了一个标量函数,再次重新查询 R-RZ-Z 连接,连接并返回名称,但我认为这非常慢。
我尝试了 FOR XML,但我无法将提供我想要的字符串的 XML 结果与表 R 中所需的其余列结合起来。
解决这个问题的最佳方法是什么?
我面临以下问题,我的 MERGE 语句基于不提供主键或任何唯一键的数据(视图),总是只是在每次执行时添加额外的 INSERTS 到目标表。
由于我在比较部分使用了所有列,因此我期望将它们与目标进行比较,如果匹配,则不插入,而只是单独放置。
相反,目标中的行数会随着每次执行而持续增长。
是的,我知道提供主键可能更好。但是我对传递的数据了解不够,在某些情况下根本无法找到主键组合。
在这种情况下如何防止额外的插入?
MERGE INTO [Z].[IAPP] AS Target
USING (
SELECT
[SXD],[UUZQ],[SSRTD],[AAFFT],[IID] From [Z].[vIAPP]
) AS Source ([SXD],[UUZQ],[SSRTD],[AAFFT],[IID])
ON (Target.[SXD] = Source.[SXD] AND Target.[UUZQ] = Source.[UUZQ] AND Target.[SSRTD] = Source.[SSRTD] AND Target.[AAFFT] = Source.[AAFFT] AND Target.[IID] = Source.[IID])
WHEN NOT MATCHED BY TARGET AND @Action = 'UI' THEN
INSERT([SXD],[UUZQ],[SSRTD],[AAFFT],[IID])
VALUES(Source.[SXD],Source.[UUZQ],Source.[SSRTD],Source.[AAFFT],Source.[IID])
WHEN NOT MATCHED BY SOURCE AND @Action = 'D' THEN
DELETE;
在不丢失任何配置的情况下重新安装使用错误语言安装的 SQL Server 的最佳方法是什么?
我是否应该安装与默认实例平行的第二个实例 - 在这里我不知道如果使用不同的语言这是否可能?
或者我应该安装第二个 Sql Server 安装(好像它是两个不同的版本)?
或者,我当然可以卸载旧的并使用正确的语言安装新的 Sql Server。
正如您可以想象的那样,与要走的路无关,我绝对希望避免再次为创建登录、用户、权限、警报、操作员、作业等进行所有维护工作。有没有好的方法来实现这一目标?
我正在寻找最优雅的解决方案来防止添加最后一个/最后一个分隔符';' 在最后一行之后。
例如结果应该是
'彼得,保罗,吉尔'
代替
'彼得,保罗,吉尔,'
DECLARE @p varchar(max) = '';
SELECT @P = @P + col2 +',' FROM tab1 WHERE coli = 1
RETURN @P
解决方案
RETURN LEFT(@P, LEN(@P) -1);
仅当@P 足够长时才有效,因此不是解决方案...
我该如何解决这个优雅可靠的问题?
鉴于:
查询 #1:
begin tran
UPDATE [dbo].[t] SET [mydatetime]='2011-12-25 07:00:00.000';
rollback
查询 #2:(更改月份/日期)
begin tran
UPDATE [dbo].[t] SET [mydatetime]='2011-25-12 07:00:00.000';
rollback
为什么 QUERY #1 无法在新安装的 SQL Server 上运行,而查询 #2 成功运行?
Msg 242,Level 16,State 3,Line 6 Bei der Konvertierung eines varchar-Datatyps in einen datetime-Datatyp liegt der Wert außerhalb des gültigen Bereichs。
相比之下,为什么查询 #1 在旧服务器上运行而查询 #2 在新服务器上失败?
消息 242,级别 16,状态 3,第 7 行将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
服务器有不同的版本(2008 / 2016)。正如您从错误消息中看到的那样,安装了两种不同的语言。请不要告诉我仅仅因为 Sql-Server 安装的语言不同就不能处理不同的日期格式?
这是可配置的吗?我会摆脱像 20150129 08:00:00.000 这样的统一格式吗?
我创建了MERGE语句,以将具有最小所需列集的差异从生产数据库传输到临时数据库。合并后的表格计划用于不同的报告和分析场景(只读)。将差异放入暂存表的整个过程应该很快(至少比当前每天完全获取整个表内容的方法快很多,方法是对所有数据执行 DELETE 然后 INSERT INTO 操作,而不管实际数量多少更改的数据,我估计约为 5%)。
这是一个示例:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET NOCOUNT ON
IF NOT exists(select 1 from StagingDB.sys.tables t join StagingDB.sys.schemas s on t.schema_id = s.schema_id WHERE t.name like 'A' and s.name like 'staging')
BEGIN
SELECT Top 0 [ID],[OID]
INTO [StagingDB].[staging].[A]
From [LiveDB].[dbo].[A];
END;
MERGE INTO [StagingDB].[staging].[A] AS Target
USING (
SELECT [ID], [OID] From [LiveDB].[dbo].[A] where X = 0
) AS Source ([ID],[OID])
ON (Target.[ID] = Source.[ID])
WHEN MATCHED AND (Target.[OID] <> Source.[OID]) THEN
UPDATE SET [OID] = Source.[OID]
WHEN NOT MATCHED BY TARGET THEN
INSERT([ID],[OID]) VALUES(Source.[ID],Source.[OID])
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
IF NOT EXISTS(
SELECT * FROM sys.indexes ix Where ix.name = 'PK_A' AND ix.object_id = OBJECT_ID('[StagingDB].[staging].[A]')
)
BEGIN
ALTER TABLE [StagingDB].[staging].[A] add constraint PK_A primary key CLUSTERED ([ID])
END
这对我的大多数桌子来说运行得非常快。不幸的是,有两个表有更多的行,而且这两个表的更多列在稍后的报告过程中被使用,所以我必须传输更多的数据。
虽然我可以在不到一分钟的时间内为 71 个表运行这种合并命令,但两个有问题的 MERGE 语句每个运行大约 2 小时。我还不知道为什么。
我怀疑日期的数量,还有我比较表格差异的方式。为了确定是否必须运行 UPDATE 语句,我对 Merge 语句中包含的每一列进行比较。因此,如果我有 10 个列,则 MERGE 的更新条件如下所示:
WHEN MATCHED AND (Target.[OID] <> Source.[OID] OR Target.[OID1] <> Source.[OID2] OR Target.[Text1] <> Source.[Text1] OR Target.[varcharlong1] <> Source.[varcharlong1] ) etc...
所以事实证明,这种更新条件检查包括所有列并且不会有索引。暂存表始终在 uniqueidentifier 中有一个聚集的主键,并且(到目前为止)没有额外的索引。
我的问题是:虽然 MERGE 语句对于我们的大多数表都运行得非常快速和高效,但看起来这个过程不适合包含多个列的两个较大的表。在这种情况下,我是否使用 OR 子句正确使用了 MERGE 语句来确保需要更新行,或者有更好的方法吗?有没有更好的方法可以将列子集的增量(更改)快速获取到临时表中?我所有的表都有一个 ROWVERSION,也许这可以用来找出以某种方式更改的行?
我有一个日志传送过程正在运行。今天我意识到日志文件一定是在昨天的时钟更改期间被覆盖的,时钟从凌晨 3 点拨回到凌晨 2 点。所以我担心可能出了什么问题。我查看了已备份的文件,发现它们以 UTC 时间的文件名存储。此处缺少 UTC 凌晨 1 点至凌晨 2 点的时间段。
相同的输出在 log_shipping_monitor_history_detail 的输出中:这里 01AM-02AM 也丢失了,而 log_time colum 正在进行,没有任何重复。
我在 15 分钟内进行备份、复制和恢复。
日志传送过程的一般状态 (master.dbo.sp_help_log_shipping_monitor) 显示 0 (OK)。
logshipping 是否考虑时钟变化或我必须采取任何行动?
我必须将 Sql Server 2008 R2 中的分区表更改为普通表,以使我的数据库与 Sql Server 2016 标准版兼容。
实际上,该表有 5 个分区,行数如下:
> boundary, rows
2009-01-01 00:00:00.000 419
2010-01-01 00:00:00.000 386031
2011-01-01 00:00:00.000 1307990
2012-01-01 00:00:00.000 673183
NULL 9743057
该表包含一个 BLOB(图像)列。该表的总大小约为 25 GB。
我已经通读了如何删除表分区这个问题,但尽管它已经回答了,但没有被接受的答案,而且答案并没有完全解决我的问题。
我实现了ALTER PARTITION FUNCTION MERGE RANGE命令,但我不太明白会发生什么。数据是否会合并到现有文件组之一,之后我仍然会有一个分区表?
我是否必须将所有数据复制到具有相同结构的新表中(可能需要相当长的时间......)?
我将不得不在停机期间执行此操作,因此我需要一个尽可能高效的过程。