标签: sql-server-2014

对聚集索引扫描和聚集索引搜索的澄清

我已创建了80000条记录与一个表Cluster Index上的CustomerID列。当我查询以下语句时,执行计划的行为有所不同。任何人都可以澄清相同。

select * from customer
Run Code Online (Sandbox Code Playgroud)

显示集群索引扫描,所以这是正确的。

select * from customer where CustomerID=80000
Run Code Online (Sandbox Code Playgroud)

执行计划显示 ClusterIndex Seek,所以这是正确的。

select * from customer where CustomerID between 1 and 70000
Run Code Online (Sandbox Code Playgroud)

执行计划仍然显示ClusterIndex 求问为什么?

根据统计,行数为 90%,然后优化器必须使用“ClusterIndex Scan”,但它使用的是“Cluster Index Seek”,为什么?所有统计数据都是最新的,我已经检查了估计行和实际行,那么为什么优化器选择“集群索引搜索”来获取总记录中 90% 的行。

index sql-server execution-plan sql-server-2014

6
推荐指数
2
解决办法
704
查看次数

系统运行状况扩展事件文件如何滚动?

我看到 SQL Server 中的默认系统健康会话事件是 5 MB,每个事件总共有 4 个文件。

我们正在尝试从历史事件中的系统健康状况中获取数据,但对于一些关键的生产服务器,它们只会非常快速地滚动。对有些人来说,他们甚至在那里呆了几个星期

SQL Server 中滚动文件的机制是如何工作的,有没有一种方法可以检查这种情况何时以及如何发生?

编辑@每个答案

  1. 事件未重新启动
  2. 服务器也没有重新启动,它按计划每月发生一次

因此,我认为系统运行状况中可能会捕获很多不需要的事件。我怎样才能在这个系统运行状况中找到它们并过滤掉它们?

另外,我们应该增加文件大小,比如 200 MB 4 文件,还是只保留 10 MB 80 文件等小文件?哪一个更好?

更新@我已经将此标记为答案,但是在检查弹出的另一件事时:

文件未按顺序填写;假设我将 10 个文件增加到每个 10 MB。我们看到几天前的 1-6 个文件似乎都充满了 10 MB,而同一天的文件 7 和 8 是 2 MB,而文件 9 和 10 完全充满了 10 MB。我想这是意料之中的,只是好奇为什么会这样?

sql-server extended-events sql-server-2012 sql-server-2014

6
推荐指数
1
解决办法
771
查看次数

振荡的片段数量会降低 FTS 查询性能吗?

我有一个FTS Catalog包含 ~10 6行的表。它曾经像魅力一样工作,但最近,由于未知原因,它开始随机出现非常糟糕的(查询> 30 秒)性能。

全文索引维护的阅读指南我仔细研究sys.fulltext_index_fragments并注意到以下几点:

  1. 片段数量在2到20之间高频振荡(每分钟多次);
  2. 最大的片段包含约 10 5行,大小为 11Mb;
  3. 其他包含 1 到 40 行。

这个波动的片段数量会干扰 SQL Server 的执行计划选择吗?

我能做些什么来清理这个?

performance sql-server optimization full-text-search sql-server-2014 query-performance

6
推荐指数
1
解决办法
117
查看次数

管理包含超过 1 TB 数据的 SQL Server 数据库

最近我们有一个超过 1 TB 的审计数据库,由于我们有存储问题,管理层正在寻找选择。

我的建议是在每年年底我们进行备份并截断所有表,以保持数据库的可管理性。

拥有存档数据库不会有好处,因为它会再次消耗相同的空间。

我想对我可以向管理层提出的选项提出专家意见,即每年分配更多空间或截断整个数据库。

sql-server archive vldb sql-server-2014

6
推荐指数
2
解决办法
1474
查看次数

为什么使用外连接选择 rowversion 永远不会返回 null

使用 SQL Server 2014。

给定带有rowversion列的表,要加入的其他表和这样的选择:

 CREATE TABLE dbo.FooTable(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RowVersion] [rowversion] NULL,
 CONSTRAINT [PK_FooTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)) 

 CREATE TABLE dbo.BarTable(
    [Id] [int] IDENTITY(1,1) NOT NULL
 CONSTRAINT [PK_BarTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)) 

Insert into BarTable default values
GO


SELECT *
  FROM FooTable ft
  FULL OUTER JOIN BarTable bt on ft.Id = Bt.Id
Run Code Online (Sandbox Code Playgroud)

选择的结果是:

Id  RowVersion  Id
NULL    0x      1
Run Code Online (Sandbox Code Playgroud)

如果与 BarTable 不匹配,则RowVersion 列不是 null,而是 0x

这让我们用来在应用服务器上反序列化结果的 …

join sql-server sql-server-2014

6
推荐指数
1
解决办法
268
查看次数

将页面验证模式从撕裂页面切换到校验和时,页面如何获取更新的校验和?

有一个较旧但较大的数据库(在 san 上为 6tb),其页面验证选项仍设置为 TORN_PAGE_DETECTION。将页面验证更改为校验和模式时,如何将新的校验和应用于所有现有页面?对页面验证模式进行此更改时是否有任何需要注意的大开销?这是否需要在较长的维护窗口期间完成?

SQL 2014 当前数据库兼容级别 = 120

sql-server corruption sql-server-2014 checksum

6
推荐指数
1
解决办法
196
查看次数

由于“UTF-8”属性,将 VARCHAR(MAX) 转换为 XML 时出错

我需要深入研究具有类似于此架构的日志表:

CREATE TABLE t (
  id int PRIMARY KEY,
  data varchar(max)
);
Run Code Online (Sandbox Code Playgroud)

data以这种格式存储从 Web 服务接收的 XML 文本:

这是缩小版

<?xml version="1.0" encoding="UTF-8"?>
<PARAM>
  <TAB DIM="30" ID="ZC3D2_1" SIZE="5">
    <LIN NUM = "1">
      <FLD NAME = "ZDOC" TYPE = "Char">Ferran López</FLD>
    </LIN>
  </TAB>
</PARAM>
Run Code Online (Sandbox Code Playgroud)

当我尝试将此文本转换为 XML 时,出现下一个错误:

XML 解析:第 xx 行,字符 48,非法 xml 字符

可以通过删除<xml>标记或至少删除encoding属性来解决。

注意:如果没有像 那样的特殊字符ó,即使我不删除<xml>标签,它也能正常工作。

有没有办法在不替换或删除<xml>标签的情况下将其转换为 XML ?

CAST(REPLACE(data, 'encoding="UTF-8"', '') as XML)
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

更新

服务器整理是: …

xml sql-server cast sql-server-2014

6
推荐指数
3
解决办法
2177
查看次数

将可空列添加到生产数据库需要太多时间

我正在运行生产数据库,通常每分钟有 50-100 个插入。我正在尝试使用以下方法在生产数据库中添加一个新列,

ALTER TABLE MyDB ADD [MyColumn] varchar(30)
GO
Run Code Online (Sandbox Code Playgroud)

这个查询一直在运行,直到我停止它才完成。我还能做什么?

sql-server sql-server-2014

6
推荐指数
1
解决办法
608
查看次数

如何编写脚本来杀死 MSSQL 中的 MS Office 数据库锁

我最近继承了一个 MSSQL 数据库,因为我们的 DBA 已经转向更美好的领域。我不是 DBA,只有中等的 SQL 知识,但不得不承担他的一些职责,并且遇到了一个问题,我在导航时遇到了一些麻烦。

我们遇到了一个问题,即通过 Excel 访问数据库的用户往往会导致数据库操作停止,这会影响我们的 ERP 软件。我们当前的解决方法是查看 SSMS 中的活动监视器并终止有问题的 Microsoft Office 应用程序。

我希望有一个每隔几分钟运行一次的脚本化任务,以保持事情顺利进行,并且当系统出现故障时,用户不会涌向 IT。

我发现以下查询将允许我提取锁定类型和其他有用的数据(例如等待时间),但不能提取活动监视器中找到的特定应用程序。

select * from sys.dm_exec_requests where wait_type = 'LCK_M_S'

理想情况下,此代码将找到 wait_type 为 LCK_M_S 的应用程序 Microsoft Office,并终止等待时间最长的任务,并在一天中根据需要重复。

预先感谢您的回复。

locked-objects excel wait-types sql-server-2014

6
推荐指数
1
解决办法
639
查看次数

SQL Server 生成零星内存转储

我们正在运行 2014 年的 SQL Server。在过去的几年里,服务器每 2-7 天就会无缘无故地生成一次内存转储,锁定大多数进程,并迫使我们重新启动 SQL 服务才能使其运行。

这是错误文件的片段:

Exception Address = 00007FFAD7FCBAA2 Module(combase+000000000003BAA2)
Exception Code    = c0000005 EXCEPTION_ACCESS_VIOLATION
Access Violation occurred reading address 00000000D8063158
Input Buffer 74 bytes -
Run Code Online (Sandbox Code Playgroud)

还有什么我们应该探索的吗?
或者让 Microsoft 分析.MDMP文件是我们唯一的选择吗?

需要提及的要点:

  • 我们已将其修补到最新的服务包,以及最新的累积和 GDR 更新。没有改变

    Microsoft SQL Server 2014 (SP3-CU4-GDR) (KB5014164) - 12.0.6439.10 (X64)   
    
    Run Code Online (Sandbox Code Playgroud)
  • 没有与这些内存转储发生时间相关的特定 SQL 语句/存储过程。

  • SQL 数据库文件在与操作系统不同的硬盘上运行。它是一个 1TB 驱动器,在任何给定时间都有 250GB 可用空间。

  • 该计算机是 Windows Server 2012 R2 虚拟机

  • CHKDSK在操作系统和数据驱动器上未发现任何错误。

  • DBCC 检查顺利通过。

  • OPENQUERY&OPENROWSET功能使用相当频繁,使用最新的ACE&ODBC驱动程序。

  • 如果我查询 sys.dm_server_memory_dumps,这是按日期排列的记录计数:

       creation_time …
    Run Code Online (Sandbox Code Playgroud)

sql-server dump sql-server-2014

6
推荐指数
1
解决办法
436
查看次数