我正在审查我们公司的 DR 程序,当我在网上查找 Always On 群集丢失仲裁的解决方案时,进行比较。在找到关于集群与事务复制与可用性组主题的第一篇 SE 帖子之前,我在谷歌搜索结果中翻了三页,该帖子仅略微涉及丢失法定人数的主题。
虽然每个人都同意失去法定人数是糟糕的,并且有一些降低潜力的建议,但它仍然可能发生。我正在寻找一个经过同行评审的良好答案,以了解从 Always On 集群仲裁丢失中恢复的最佳途径。
我们需要对通常是需要“自然”排序的数字和字母混合字符串的值进行一些报告。诸如“P7B18”或“P12B3”之类的东西。@字符串将主要是字母序列然后数字交替。但是,这些段的数量和每个段的长度可能会有所不同。
我们希望这些数字部分按数字顺序排序。显然,如果我直接用 处理这些字符串值ORDER BY,那么“P12B3”将在“P7B18”之前出现,因为“P1”早于“P7”,但我希望相反,因为“P7”自然在前面“P12”。
我还希望能够进行范围比较,例如@bin < 'P13S6'或类似的。我不必处理浮点数或负数;这些将严格是我们正在处理的非负整数。字符串长度和段数可能是任意的,没有固定的上限。
在我们的例子中,字符串大小写并不重要,但如果有一种方法可以以排序方式感知方式做到这一点,其他人可能会发现这很有用。所有这一切中最丑陋的部分是我希望能够在WHERE子句中进行排序和范围过滤。
如果我在 C# 中执行此操作,这将是一项非常简单的任务:进行一些解析以将 alpha 与数字分开,实现 IComparable,您基本上就完成了。当然,SQL Server 似乎没有提供任何类似的功能,至少就我所知。
任何人都知道使这项工作有什么好的技巧吗?是否有一些很少公开的能力来创建实现 IComparable 的自定义 CLR 类型并使其按预期运行?我也不反对 Stupid XML Tricks(另请参阅:list concatenation),而且我在服务器上也提供了 CLR 正则表达式匹配/提取/替换包装函数。
编辑: 作为一个更详细的例子,我希望数据表现得像这样。
SELECT bin FROM bins ORDER BY bin
bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
Run Code Online (Sandbox Code Playgroud)
即将字符串分成所有字母或所有数字的标记,并分别按字母或数字对它们进行排序,最左边的标记是最重要的排序项。就像我提到的,如果您实现 IComparable,在 .NET 中是小菜一碟,但我不知道如何(或是否)您可以在 SQL Server 中执行此类操作。这肯定不是我在 10 年左右的工作中遇到过的事情。
在过去的一个月里,我的一台服务器遇到了 SQL Server 代理问题。它会自动停止并出现以下错误,这是随机发生的:
Sql 代理输出文件
[097] 检测到内存泄漏 [204 字节]
在文件 e:\sql9_sp2_t\sql\komodo\src\core\sqlagent\src\alerter.cpp 的第 403 行捕获到异常 5。SQLServerAgent 启动自我终止
我用谷歌搜索了这个错误,但没有得到太多关于它的信息。SQL Server 和代理都使用相同的域帐户运行;但是,问题仅与 SQL Server 代理服务有关。
我也无法在 SQL Server 配置管理器中看到 SQL Server 代理服务。我检查了 SQL Server 错误日志和 Windows 事件查看器日志,但没有看到任何可疑活动。
我的内存设置配置正确。服务器有 32GB RAM,SQL Server 被分配使用 26GB 的最大内存。
系统详情:
我也检查了msdb数据库。运行 checkdb 并成功完成,没有任何错误。我需要你的帮助来解决两件事:
我需要在 SQL Server 和 MySQL 之间没有主键的情况下同步大约 5 亿行的大表。该表只有一个聚集复合非唯一索引。
我在服务器之间确实有一个 ODBC 连接,但是大约 800 万行的导入需要大约 45 分钟,所以我相信更大的单个导入是不合理的,因为在任何时候都可能发生中断。我不能改变现有的表结构,我可以添加其他表。进一步阅读后,offset / fetch 不是大表的选项。“选择 ... 其中 x 介于 ... 和 ... 之间”不是一个选项,因为我没有唯一的键。
如何批量导出保证包含所有行的表?我的问题是,由于聚集键不是唯一的,在它之后排序不能保证物理行在连续查询之间具有相同的顺序,并且在所有列之后排序会花费太长时间。您建议如何通过 ODBC 或 CSV 文件迁移批次?
我需要优化一个SELECT语句,但 SQL Server 总是执行索引扫描而不是查找。这是查询,当然,在存储过程中:
CREATE PROCEDURE dbo.something
@Status INT = NULL,
@IsUserGotAnActiveDirectoryUser BIT = NULL
AS
SELECT [IdNumber], [Code], [Status], [Sex],
[FirstName], [LastName], [Profession],
[BirthDate], [HireDate], [ActiveDirectoryUser]
FROM Employee
WHERE (@Status IS NULL OR [Status] = @Status)
AND
(
@IsUserGotAnActiveDirectoryUser IS NULL
OR
(
@IsUserGotAnActiveDirectoryUser IS NOT NULL AND
(
@IsUserGotAnActiveDirectoryUser = 1 AND ActiveDirectoryUser <> ''
)
OR
(
@IsUserGotAnActiveDirectoryUser = 0 AND ActiveDirectoryUser = ''
)
)
)
Run Code Online (Sandbox Code Playgroud)
这是索引:
CREATE INDEX not_relevent ON dbo.Employee
(
[Status] …Run Code Online (Sandbox Code Playgroud) 我正在寻找返回每个参考号的最新记录的最快方法。
我非常喜欢BrentOzar.com 的解决方案,但是当我添加第三个条件 (SequenceId) 时,它似乎不起作用。它似乎只有在我指定 Id 和创建日期时才有效。
要理解我的问题,您需要创建修改后的示例表,它本质上是上述参考网站上的表的副本,但稍有改动。
CREATE TABLE [dbo].[TestTable](
[Id] [int] NOT NULL,
[EffectiveDate] [date] NOT NULL,
[SequenceId] [bigint] IDENTITY(1,1) NOT NULL,
[CustomerId] [varchar](50) NOT NULL,
[AccountNo] [varchar](50) NOT NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[Id] ASC,
[EffectiveDate] ASC,
[SequenceId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[TestTable] ON
INSERT [dbo].[TestTable] ([Id], [EffectiveDate], [SequenceId], [CustomerId], [AccountNo])
VALUES (1, CAST(0xDF300B00 AS Date), 1, N'Blue', N'Green')
INSERT [dbo].[TestTable] ([Id], [EffectiveDate], [SequenceId], [CustomerId], [AccountNo])
VALUES …Run Code Online (Sandbox Code Playgroud) performance sql-server t-sql greatest-n-per-group query-performance
TRUSTWORTHY如果您不小心,该设置可能会相当危险,除特定情况外,建议将其关闭。但是默认情况下,MSDB数据库TRUSTWORHTY设置ON默认。我很好奇为什么?
我已阅读BOL 中的此条目
注意默认情况下,MSDB 数据库的 TRUSTWORTHY 设置设置为 ON。更改此设置的默认值可能会导致使用 MSDB 数据库的 SQL Server 组件出现意外行为。
但我对具体情况很好奇。为什么具体MSDB需要TRUSTWORTHY开启?什么功能使用它?
security sql-server sql-server-2008-r2 sql-server-2012 sql-server-2014
我有一个非常大的查询(约 630 行),它涉及大量嵌套SELECT语句并从多个视图中提取。我们的 SQL Server 将并行度设置为 2,阈值为 95(这样设置是因为我们的 DBA 正在根据其他一些应用程序对其进行优化)。此查询最近开始需要 5-10 分钟才能完成,而通常不到一分钟。在调查原因时,我们注意到它似乎永远不会触发并行,总是串行运行,并怀疑这可能与它的性能有关。奇怪的是,在实验过程中,我们甚至将阈值降回了默认值 5 秒,它仍然无法并行运行。什么可以阻止它?
我们一直在当时没有其他人使用的非生产环境中进行测试,因此这是唯一运行的查询。我们的DBA也尝试过清除缓存和计划,甚至回收系统,但都没有效果。
更新 1:根据评论,我已经确认统计数据每晚更新,但问题仍然存在。我们实际上将代码回滚到没有如此严重性能问题的早期版本,但将继续测试此代码,因为它应该提高旧代码的性能,并且在初始测试中确实做到了。将在此处相应地更新。
今天我们遇到了一个错误:
错误:3967,严重性:17
据我所知,它基本上是“完整版商店”。这提出了一些我难以回答的问题,因为在我的商店,我们以前从未遇到过这个错误:
如果有预设的最大大小(基于总tempdb大小或其他),它是动态的吗?
如果不是,是否有设置可以使其动态化?
我们可以基于此设置警报吗?(即用于跟踪大小等的 DMV)
使用 Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)。
给定一个表和索引:
create table [User].[Session]
(
SessionId int identity(1, 1) not null primary key
CreatedUtc datetime2(7) not null default sysutcdatetime())
)
create nonclustered index [IX_User_Session_CreatedUtc]
on [User].[Session]([CreatedUtc]) include (SessionId)
Run Code Online (Sandbox Code Playgroud)
以下每个查询的实际行数为 310 万,估计行数显示为注释。
当这些查询在 View 中提供另一个查询时,由于 1 行估计,优化器选择循环连接。 如何在此基础级别改进估计以避免覆盖父查询连接提示或求助于 SP?
使用硬编码日期效果很好:
select distinct SessionId from [User].Session -- 2.9M (great)
where CreatedUtc > '04/08/2015' -- but hardcoded
Run Code Online (Sandbox Code Playgroud)
这些等效查询与视图兼容,但都估计为 1 行:
select distinct SessionId from [User].Session -- 1
where CreatedUtc …Run Code Online (Sandbox Code Playgroud) sql-server ×10
optimization ×2
collation ×1
index ×1
natural-sort ×1
parallelism ×1
performance ×1
security ×1
sorting ×1
t-sql ×1
view ×1