标签: sql-server-2012

有效地存储具有截然不同的键的键值对集

我继承了一个应用程序,它将许多不同类型的活动与一个站点相关联。大约有 100 种不同的活动类型,每一种都有不同的 3-10 个字段集。但是,所有活动都至少有一个日期字段(可以是日期、开始日期、结束日期、预定开始日期等的任意组合)和一个负责人字段。所有其他字段差异很大,开始日期字段不一定称为“开始日期”。

为每个活动类型制作一个子类型表将导致一个包含 100 个不同子类型表的模式,这将过于笨拙而无法处理。该问题的当前解决方案是将活动值存储为键值对。这是当前系统的一个大大简化的架构,可以理解这一点。

在此处输入图片说明

每个Activity有多个ActivityFields;每个 Site 有多个 Activity,SiteActivityData 表存储每个 SiteActivity 的 KVP。

这使得(基于 Web 的)应用程序非常容易编写代码,因为您真正需要做的就是遍历 SiteActivityData 中给定活动的记录,并为表单的每一行添加一个标签和输入控件。但是有很多问题:

  • 诚信不好;可以在 SiteActivityData 中放置一个不属于活动类型的字段,而 DataValue 是一个 varchar 字段,因此需要不断转换数字和日期。
  • 对这些数据进行报告和临时查询很困难、容易出错且速度缓慢。例如,获取结束日期在指定范围内的某种类型的所有活动的列表需要数据透视并将 varchars 转换为日期。报告作者讨厌这种模式,我不怪他们。

所以我正在寻找一种方法来存储大量几乎没有共同字段的活动,从而使报告更容易。到目前为止,我想出的是使用 XML 以伪 noSQL 格式存储活动数据:

在此处输入图片说明

Activity 表将包含每个活动的 XSD,从而无需 ActivityField 表。SiteActivity 将包含键值 XML,因此站点的每个活动现在都在一行中。

一个活动看起来像这样(但我还没有完全充实它):

<SomeActivityType>
  <SomeDateField type="StartDate">2000-01-01</SomeDateField>
  <AnotherDateField type="EndDate">2011-01-01</AnotherDateField>
  <EmployeeId type="ResponsiblePerson">1234</EmployeeId>
  <SomeTextField>blah blah</SomeTextField>
  ...
Run Code Online (Sandbox Code Playgroud)

好处:

  • XSD 将验证 XML,捕获错误,例如在数据库级别将字符串放入数字字段中,这对于将所有内容存储在 varchar 中的旧模式来说是不可能的。
  • 用于构建 Web 表单的 KVP 记录集可以很容易地使用 select ... from ActivityXML.nodes('/SomeActivityType/*') as T(r)
  • XML 的 xpath 子查询可用于生成包含开始日期、结束日期等列的结果集,而不使用数据透视表,例如 select ActivityXML.value('.[@type=StartDate]', 'datetime') as StartDate, …

schema database-design sql-server-2012 reporting

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

列存储索引中的标识列

我有一个非常大的表 IMO(约 1.37 亿行),其中包含大量重复数据、大量NULL列等。

我正在考虑使用一个带有 a 的表来探索这个COLUMNSTORE INDEX,我IDENTITY在原始表中有一个列,这是我唯一的每一行都是唯一的列。

我应该忽略此列还是包含它?我已经读到您想将表的所有行都包含在 中,COLUMNSTORE INDEX但我也读到最佳候选者是具有许多非唯一行的列。

这只是一个糟糕的候选人COLUMNSTORE INDEX吗?

我使用的是 SQL Server 2012,所以它是一个非聚集列存储。我只是在探索可能的更好的方法来存储这些数据。更新是不存在的,尽管会通过 ELT 过程定期添加新行,所以我假设会在那里完成一些工作。有些人挖掘这些数据并生成大量报告,大量扫描行,有时会使服务器爬行,这迫使我们每天将副本卸载到辅助服务器。

sql-server sql-server-2012 columnstore

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

递归sql查询性能问题

这是我第六次问这个问题,也是最短的一次。之前的所有尝试都产生了更类似于博客文章而不是问题本身的东西,但我向您保证,我的问题是真实的,只是它涉及一个大主题,并且没有这个问题包含的所有细节,它将是不清楚我的问题是什么。所以这里...

抽象的

我有一个数据库,它允许以一种奇特的方式存储数据,并提供我的业务流程所需的几个非标准功能。特点如下:

  1. 通过仅插入方法实现的非破坏性和非阻塞更新/删除,允许数据恢复和自动记录(每个更改都与进行更改的用户相关联)
  2. 多版本数据(同一数据可以有多个版本)
  3. 数据库级权限
  4. 与 ACID 规范和事务安全的创建/更新/删除的最终一致性
  5. 能够将当前的数据视图倒回或快进到任何时间点。

可能还有其他功能我忘了提及。

数据库结构

所有用户数据都Items以 JSON 编码字符串 ( ntext) 的形式存储在表中。所有的数据库操作都通过两个存储过程进行GetLatestInsertSnashot,它们允许类似Git是如何操纵源文件中的数据进行操作。

结果数据在前端链接(JOINed)成完全链接的图,因此在大多数情况下不需要进行数据库查询。

也可以将数据存储在常规 SQL 列中,而不是以 Json 编码形式存储。然而,这增加了整体复杂性压力。

读取数据

GetLatest结果与指令形式的数据,请考虑下图进行解释:

结构图

该图显示了对单个记录所做更改的演变。图上的箭头显示了编辑所依据的版本(假设用户正在离线更新一些数据,与在线用户进行的更新并行,这种情况会引入冲突,基本上是两个版本的数据而不是一个)。

因此,GetLatest在以下输入时间跨度内调用将产生以下记录版本:

GetLatest 0, 15  => 1       <= The data is created upon it's first occurance
GetLatest 0, 25  => 2       <= Inserting another version on top of first one overwrites the existing version
GetLatest 0, 30  => 3       <= The overwrite …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 query-performance

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

可用性组侦听器

我正在查看 AlwaysOn 可用性组。我越看它就越发现可用性侦听器组是单点故障。侦听器究竟在哪里运行?一个单独的服务器,主SQL服务器,所有这些?

假设我在我的第二个数据中心有一个完整的应用程序堆栈。如何配置侦听器,以便它们在两个站点上运行并且应用程序将指向它们自己的本地副本?

我确定我在这里遗漏了一些东西,但我不知道是什么。

sql-server sql-server-2012 availability-groups

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

日志传送 SQL Server 2012

我是一家没有 DBA 的小商店的开发人员,我正在尝试使用 sql server 2012 进行日志传送。我正在尝试将报告从事务系统卸载到新的数据仓库,并将使用此数据库作为暂存区。

我运行了日志传送向导,每次都可以运行主备份和文件复制作业。辅助还原作业似乎随机失败。

主服务器只有一个事务日志作业。差异备份被禁用(不确定这是否重要)但有完整备份。

辅助服务器是全新安装,没有维护计划、备份或活动用户。

有没有办法强制备份恢复同步,或者始终确保它保持同步?

它只是看起来很脆弱。请指教。

编辑日志如下:

*Starting transaction log copy. 
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieving copy settings. 
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieved copy settings. 
Primary Server: '', 
Primary Database: 'db', Backup Source Directory: '\\server\folder', 
Backup Destination Directory: '\\server\folder', 
Last Copied File: '\\server\folder\db_20160105070002.trn'
Starting transaction log restore. 
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieving restore settings. 
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Copying log backup files. 
Primary Server: 'server', Primary Database: 'db', 
Backup Source Directory: '\\server\folder', 
Backup Destination Directory: '\\server\folder'
Retrieved common …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 log-shipping

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

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
查看次数

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

我需要优化一个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
查看次数

如何在存储过程完成之前获得响应?

我需要在完成之前从存储过程返回部分结果(作为简单的选择)。

有可能这样做吗?

如果是,如何做到这一点?

如果没有,有什么解决方法吗?

编辑:我有几个部分的程序。在第一部分我计算了几个字符串。我稍后会在过程中使用它们来进行附加操作。问题是调用者尽快需要字符串。因此,我需要计算该字符串并将其传回(不知何故,例如从选择中),然后继续工作。调用者更快地获得其有价值的字符串。

调用者是一个 Web 服务。

stored-procedures t-sql sql-server-2012 multi-thread web-service

9
推荐指数
3
解决办法
2998
查看次数

为什么 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
查看次数