标签: sql-server

当您的 Always On 群集失去仲裁时该怎么办?

我正在审查我们公司的 DR 程序,当我在网上查找 Always On 群集丢失仲裁的解决方案时,进行比较。在找到关于集群与事务复制与可用性组主题的第一篇 SE 帖子之前,我在谷歌搜索结果中翻了三页,该帖子仅略微涉及丢失法定人数的主题。

虽然每个人都同意失去法定人数是糟糕的,并且有一些降低潜力的建议,但它仍然可能发生。我正在寻找一个经过同行评审的良好答案,以了解从 Always On 集群仲裁丢失中恢复的最佳途径。

sql-server availability-groups disaster-recovery

9
推荐指数
2
解决办法
1万
查看次数

ORDER BY和字母数字混合串的比较

我们需要对通常是需要“自然”排序的数字和字母混合字符串的值进行一些报告。诸如“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 collation sql-server-2012 sorting natural-sort

9
推荐指数
1
解决办法
7401
查看次数

SQL Server 代理启动自我终止

在过去的一个月里,我的一台服务器遇到了 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 的最大内存。

系统详情:

  • SQL Server 2012 SP2 标准版 11.0.5058 64 位
  • Windows Server 2008 R2 Ent Edition 64 位
  • 专用于 SQL Server(服务器上没有运行其他应用程序)
  • 服务器几个月前从 SQL Server 2005 EE 升级到 2012 SE。
  • 我们没有使用事件转发服务器

我也检查了msdb数据库。运行 checkdb 并成功完成,没有任何错误。我需要你的帮助来解决两件事:

  1. 修复 SQL …

sql-server sql-server-2012 sql-server-agent

9
推荐指数
1
解决办法
658
查看次数

SQL Server - 导出没有主键的大表

我需要在 SQL Server 和 MySQL 之间没有主键的情况下同步大约 5 亿行的大表。该表只有一个聚集复合非唯一索引。

我在服务器之间确实有一个 ODBC 连接,但是大约 800 万行的导入需要大约 45 分钟,所以我相信更大的单个导入是不合理的,因为在任何时候都可能发生中断。我不能改变现有的表结构,我可以添加其他表。进一步阅读后,offset / fetch 不是大表的选项。“选择 ... 其中 x 介于 ... 和 ... 之间”不是一个选项,因为我没有唯一的键。

如何批量导出保证包含所有行的表?我的问题是,由于聚集键不是唯一的,在它之后排序不能保证物理行在连续查询之间具有相同的顺序,并且在所有列之后排序会花费太长时间。您建议如何通过 ODBC 或 CSV 文件迁移批次?

sql-server

9
推荐指数
1
解决办法
2642
查看次数

尽管我希望寻求帮助,但仍在进行扫描

我需要优化一个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)

index sql-server optimization sql-server-2012

9
推荐指数
1
解决办法
1228
查看次数

获取最新记录的最快方法

我正在寻找返回每个参考号的最新记录的最快方法。

我非常喜欢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

9
推荐指数
2
解决办法
5万
查看次数

为什么 MSDB 数据库值得信赖?

TRUSTWORTHY如果您不小心,该设置可能会相当危险,除特定情况外,建议将其关闭。但是默认情况下,MSDB数据库TRUSTWORHTY设置ON默认。我很好奇为什么?

我已阅读BOL 中的此条目

注意默认情况下,MSDB 数据库的 TRUSTWORTHY 设置设置为 ON。更改此设置的默认值可能会导致使用 M​​SDB 数据库的 SQL Server 组件出现意外行为。

但我对具体情况很好奇。为什么具体MSDB需要TRUSTWORTHY开启?什么功能使用它?

security sql-server sql-server-2008-r2 sql-server-2012 sql-server-2014

9
推荐指数
1
解决办法
1630
查看次数

SQL 不参与超大查询的并行性

我有一个非常大的查询(约 630 行),它涉及大量嵌套SELECT语句并从多个视图中提取。我们的 SQL Server 将并行度设置为 2,阈值为 95(这样设置是因为我们的 DBA 正在根据其他一些应用程序对其进行优化)。此查询最近开始需要 5-10 分钟才能完成,而通常不到一分钟。在调查原因时,我们注意到它似乎永远不会触发并行,总是串行运行,并怀疑这可能与它的性能有关。奇怪的是,在实验过程中,我们甚至将阈值降回了默认值 5 秒,它仍然无法并行运行。什么可以阻止它?

我们一直在当时没有其他人使用的非生产环境中进行测试,因此这是唯一运行的查询。我们的DBA也尝试过清除缓存和计划,甚至回收系统,但都没有效果。

更新 1:根据评论,我已经确认统计数据每晚更新,但问题仍然存在。我们实际上将代码回滚到没有如此严重性能问题的早期版本,但将继续测试此代码,因为它应该提高旧代码的性能,并且在初始测试中确实做到了。将在此处相应地更新。

sql-server parallelism

9
推荐指数
1
解决办法
7016
查看次数

关于 tempdb 版本存储的问题

今天我们遇到了一个错误:

错误:3967,严重性:17

据我所知,它基本上是“完整版商店”。这提出了一些我难以回答的问题,因为在我的商店,我们以前从未遇到过这个错误:

  • 如果有预设的最大大小(基于总tempdb大小或其他),它是动态的吗?

  • 如果不是,是否有设置可以使其动态化?

  • 我们可以基于此设置警报吗?(即用于跟踪大小等的 DMV)

sql-server tempdb-version-store sql-server-2014

9
推荐指数
1
解决办法
2467
查看次数

如何针对索引改进受 DateAdd() 约束的视图中 1 行的估计

使用 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 optimization view sql-server-2012

9
推荐指数
2
解决办法
372
查看次数