您是否曾经不得不证明不使用查询提示是合理的?
我WITH (NOLOCK)在每个访问非常繁忙的服务器的查询中都看到了。开发人员认为它应该默认开启,因为他们讨厌在他们的代码中看到它数千次。
我试图解释说它允许脏读,最终它们会得到坏数据,但他们认为性能权衡是值得的。(他们的数据库一团糟;难怪他们有性能问题。)
如果你有一个明确的例子来说明如何反对这种滥用NOLOCK提示的情况,那将不胜感激。
我们有两个生产 SQL Server 运行 SQL Server 2005 SP4 和累积更新 3。两台服务器都在相同的物理机器上运行。DELL PowerEdge R815 配备 4 个 12 核 CPU 和 512GB(是 GB)内存,以及用于所有 SQL 数据库和日志的 10GB iSCSI SAN 连接驱动器。操作系统是带有所有 SP 和 Windows 更新的 Microsoft Windows Server 2008 R2 企业版。操作系统驱动器是一个 RAID 5 阵列,包含 3 个 72GB 2.5" 15k SAS 驱动器。SAN 是一个 Dell EqualLogic 6510,带有 48 个 10K SAS 3.5" 驱动器,配置为 RAID 50,为 2 个 SQL Server 划分为各种 LUN,并且还共享带有一台 Exchange 机器和几台 VMWare 服务器。
我们有 20 多个数据库,其中 11 个使用见证服务器以高可用性镜像。见证服务器是一台运行 SQL Server 实例的低功耗机器,它除了提供见证服务外别无其他用途。最大的镜像数据库是 450GB,产生大约 100-300 iops。数据库镜像监视器报告的当前发送速率约为每秒 …
我正在修改数据库的结构。表FinancialInstitution的几个列的内容必须转移到表Person 中。金融机构通过外键链接到人。每个金融机构都需要其相应人员的 ID。因此,对于在 Person 中插入的每个新行,必须将该新行的 id (IDENTITY) 复制回 FinancialInstitution 的相应行中。
这样做的明显方法是迭代 T-SQL 代码。但我很想知道是否可以仅使用基于集合的操作来实现。
我想象这样一个请求的内部层次会是这样的:
INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1)
OUTPUT inserted.Id, FinancialInstitution.Id
SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email
FROM FinancialInstitution;
Run Code Online (Sandbox Code Playgroud)
不幸的是,似乎 OUTPUT 不能以这种方式关联......
使用“SQLCMD.EXE”来备份我的 SQL Server Express 数据库多年,我才发现在安装2014 版本后,我再也找不到 SQLCMD.EXE。
在以前的版本中,它位于
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE
但是在我 2014 年的安装中,没有 SQLCMD.EXE 存在于
C:\Program Files\Microsoft SQL Server\120\Tools\Binn
我的问题:
有机会将 SQLCMD.EXE 导入 SQL Server Express 2014 吗?
我需要根据几个条件更改 select 语句中的返回值。我试过这样的事情:
,CASE i.DocValue
WHEN 'F2' AND c.CondCode IN ('ZPR0','ZT10','Z305') THEN c.CondVal
ELSE 0
END as Value
Run Code Online (Sandbox Code Playgroud)
为什么它不起作用以及推荐的方法是什么?接下来会有几个 WHEN 条件。
谢谢
问题定义
我们的数据库服务器需要转移到另一个数据中心。它运行在 Microsoft SQL Server 2012 Enterprise(64 位)上,包含两个大约 2TB 和 1TB 的数据库。
几乎没有停机时间将是理想的。
工作量
这些数据库用于 .NET 网站,并且会不断更新。
不过,周末不可用也是可以接受的。当前使用的数据库将一直是唯一使用的数据库,直到切换到新数据库。
理想情况下,只需将 DNS 条目更改为指向新的数据库服务器,同时确保数据库未更新,即可实现该切换。
此外,只要从一台服务器切换到另一台服务器(停机时间)保持在较低水平,此操作所花费的时间并不重要。
考虑的方法
备份还原
过去曾这样做过,但即使是通过内部网络完成的,停机时间也很长,因此比通过 Internet更有效
日志传送
据我所知,这种方法可以通过配置主/从并将主数据库的精确副本传输到其只读从属来最大限度地减少停机时间。如上所述,不需要访问从属数据库,我们只需要一种方法来拥有主数据库的副本而不会损坏数据。
它在资源利用方面似乎也非常有效,并且不会对主性能产生太大影响。
我可能对这种方法有误,因此请随时纠正我。
数据库镜像
我不太了解这种方法,但它似乎是一个有效的选择。不需要实时同步,主节点的性能非常重要,因此如果选择这种方法,异步将是可行的方法。
其他选择?
该服务器直接在裸机硬件上运行,因此不幸的是,不能选择较低级别的解决方案。也许有更好的方法来完成这项工作?
约束
如上所述,这些数据库非常大,以至于难以维护,但这是另一个问题。
SQL Server 的版本将相同(Microsoft SQL Server 2012 Enterprise 64 位)。
它必须在两个数据中心之间通过网络传输,因此很可能通过 Internet 传输。不幸的是,将磁盘从一个站点发送到另一个站点进行初始同步并不是一种选择。为转移提供某种安全性是理想的,但我们会在这种情况下做到最好。
这应该很好地概述了我们对这项任务的需求,希望你们中的一些人以前不得不面对这种情况。
在查询中使用列存储索引时,SQL Server 能够使用批处理模式。关于什么可以在批处理模式下运行,什么不能运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行的事情数量惊人:

(这是一个估计的计划,我用实际计划来验证实际执行方式确实是批处理。)
请注意,只有 T1 的构建端使用列存储索引。所有探测输入(T2 和 T3)都是行存储。他们的数据似乎过渡到批处理模式。我一直认为批处理模式仅用于通过探针端运行的数据流。
即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。这就提出了一个问题:为什么 SQL Server 不对仅行存储的查询使用批处理模式?可能对他们中的一些人有益。使用列存储索引是否是使 SQL Server 考虑批处理模式所必需的正式要求?我们可以添加一个带有列存储索引的零行虚拟表来引入批处理模式并实现性能提升吗?
从 SQL Server 2014 开始,究竟可以在批处理模式下运行什么?
如何判断我的 SQL Server 实例是否已打补丁?是否有本机功能可以识别我的服务器是否有可用的补丁?哎呀,我什至有可用的版本数据吗?
我有一个空间索引用于该DBCC CHECKDB报告损坏:
DBCC CHECKDB(MyDB)
WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS
Run Code Online (Sandbox Code Playgroud)
空间索引、XML 索引或索引视图“sys.extended_index_xxx_384000”(对象 ID xxx)不包含视图定义生成的所有行。这不一定表示此数据库中的数据存在完整性问题。
空间索引、XML 索引或索引视图“sys.extended_index_xxx_384000”(对象 ID xxx)包含不是由视图定义生成的行。这不一定表示此数据库中的数据存在完整性问题。
CHECKDB 在表“sys.extended_index_xxx_384000”(对象 ID xxx)中发现 0 个分配错误和 2 个一致性错误。
维修级别为repair_rebuild.
删除并重新创建索引不会删除这些损坏报告。没有EXTENDED_LOGICAL_CHECKS但有DATA_PURITY错误是不报告的。
此外,CHECKTABLE尽管它的 CI 大小为 30 MB 并且有大约 30k 行,但该表需要 45 分钟。该表中的所有数据都是点geography数据。
在任何情况下都会出现这种行为吗?它说“这不一定代表完整性问题”。我应该做些什么?CHECKDB正在失败这是一个问题。
此脚本重现了该问题:
CREATE TABLE dbo.Cities(
ID int NOT NULL,
Position geography NULL,
CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED
(
ID ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = …Run Code Online (Sandbox Code Playgroud) SQL Server 2019 CTP3.1引入了解决最后一页插入争用的优化。这采用名为的索引选项的形式OPTIMIZE_FOR_SEQUENTIAL_KEY。
有人认为这可能是Bw-Tree或Bz-Tree的改编。然而,这些依赖于可变大小的页面,而当前的存储引擎需要固定大小的页面。
优化是如何实现的?这种优化如何改变当前的 B 树算法?在什么情况下我会选择不部署此选项?
反向密钥方法的专利。
我使用 DBCC PAGE 快速浏览了一下,比较了 2017 年与 2019 年和 2019 年在 int IDENTITY 列的唯一聚集索引上使用和不使用 OPTIMIZE_FOR_SEQUENTIAL_KEY 的情况。没有什么可以明显地解释这种新行为。这让我觉得它是一个算法的东西,而不是一个结构的东西,这是有道理的。
来自 MS的博客文章。
此功能似乎以检测和避免车队为中心。
sql-server ×10
mirroring ×2
batch-mode ×1
columnstore ×1
dbcc-checkdb ×1
insert ×1
locking ×1
log-shipping ×1
migration ×1
nolock ×1
optimization ×1
restore ×1
spatial ×1