我的公司正面临为新的数据库服务器购买 SQL Server 2012 Denali 还是 SQL Server 2008 R2 的决定。我正在寻找客观的理由来选择一个。
我们的要求:
目前,我知道以下原因:
SQL Server 2012 德纳利
SQL Server 2008 R2
我似乎找不到很多技术原因来偏爱其中一个。基本上,这归结为选择成功运行的成熟技术与可用的最新和最好的版本。
做出决定的客观原因是什么?
sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012
在查询中使用列存储索引时,SQL Server 能够使用批处理模式。关于什么可以在批处理模式下运行,什么不能运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行的事情数量惊人:

(这是一个估计的计划,我用实际计划来验证实际执行方式确实是批处理。)
请注意,只有 T1 的构建端使用列存储索引。所有探测输入(T2 和 T3)都是行存储。他们的数据似乎过渡到批处理模式。我一直认为批处理模式仅用于通过探针端运行的数据流。
即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。这就提出了一个问题:为什么 SQL Server 不对仅行存储的查询使用批处理模式?可能对他们中的一些人有益。使用列存储索引是否是使 SQL Server 考虑批处理模式所必需的正式要求?我们可以添加一个带有列存储索引的零行虚拟表来引入批处理模式并实现性能提升吗?
从 SQL Server 2014 开始,究竟可以在批处理模式下运行什么?
当从同一 LAN 中不同服务器上的 .NET 4 客户端应用程序连接到 SQL Server 2008 R2 时,可以设置三种不同的网络协议:
什么是最佳实践?选择什么?
附加信息:在服务器和客户端上都启用了 TCP 和命名管道。应用程序正在使用数据库镜像。客户端和服务器通过快速 LAN 进行通信。
我们正在对此进行调查,因为我们有罕见的虚假连接和超时问题。(但无论如何,我想知道最佳实践)。
MSDN 上有一篇关于这个主题的文章,但它非常笼统和模糊。它不建议或推荐任何有用的东西。
TL;DR:我在索引视图中有一个无法修复的损坏。以下是详细信息:
跑步
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
在我的数据库之一上产生以下错误:
消息 8907,级别 16,状态 1,第 1 行 空间索引、XML 索引或索引视图“ViewName”(对象 ID 784109934)包含不是由视图定义生成的行。这不一定表示此数据库中的数据存在完整性问题。(……)
CHECKDB 在表“ViewName”中发现 0 个分配错误和 1 个一致性错误。
repair_rebuild 是最低修复级别 (...)。
我确实理解此消息表明索引视图“ViewName”的物化数据与基础查询生成的数据不同。但是,手动验证数据不会出现任何差异:
SELECT * FROM ViewName WITH (NOEXPAND)
EXCEPT
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
EXCEPT
SELECT * FROM ViewName WITH (NOEXPAND)
Run Code Online (Sandbox Code Playgroud)
NOEXPAND用于强制在 上使用(唯一)索引ViewName。FORCESCAN用于防止索引视图匹配发生。执行计划确认这两种措施都有效。
这里没有返回任何行,这意味着两个表是相同的。(只有整数和 guid 列,排序规则不起作用)。
无法通过在视图上重新创建索引或运行DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS …
如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:
有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。
有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。
我打算使用 aUNIQUEIDENTIFIER作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。
我需要生成多个这样的标识符作为INSERT...SELECT语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。
如何生成安全的随机数UNIQUEIDENTIFIER?请注意,这NEWID不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM, RANDor 的东西GETUTCDATE也不符合条件。
security sql-server uniqueidentifier sql-server-2012 cryptography
我正在跟进有关计算列中奇怪值的问题PERSISTED。那里的答案对这种行为是如何产生的做出了一些猜测。
我在问以下问题:这不是一个彻头彻尾的错误吗?被PERSISTED列曾经允许这样的行为?
DECLARE @test TABLE (
Col1 INT,
Contains2 AS CASE WHEN 2 IN (Col1) THEN 1 ELSE 0 END PERSISTED) --depends on Col1
INSERT INTO @test (Col1) VALUES
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5)),
(ABS(CHECKSUM(NEWID()) % 5))
SELECT * FROM @test --shows impossible data
UPDATE @test SET Col1 = Col1*1 --"fix" the data by rewriting it
SELECT * FROM @test --observe fixed data
/*
Col1 Contains2
2 0 …Run Code Online (Sandbox Code Playgroud) OFFSET ... FETCHSQL Server 2012 引入的新模型提供了简单且快速的分页。考虑到这两种形式在语义上相同且非常常见,为什么会有任何差异?
人们会假设优化器可以识别两者并将它们(简单地)优化到最大程度。
这是一个非常简单的案例,OFFSET ... FETCH根据成本估算,速度提高了约 2 倍。
SELECT * INTO #objects FROM sys.objects
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY object_id) r
FROM #objects
) x
WHERE r >= 30 AND r < (30 + 10)
ORDER BY object_id
SELECT *
FROM #objects
ORDER BY object_id
OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

可以通过创建 CIobject_id或添加过滤器来改变此测试用例,但不可能消除所有计划差异。OFFSET ... FETCH总是更快,因为它在执行时做的工作更少。
sql-server optimization execution-plan sql-server-2012 offset-fetch
在我读到的某个教程中,作者正在sys.indexes根据谓词进行过滤index_id < 256000。这有什么作用?
我正在处理SQL Server 升级到 2014 后无法删除数据库快照的问题。快照已失效但无法删除。
现在,虽然 Connect 项目中有一个令人失望的评论,但我认为这最终会得到解决。但是,我需要尽快处理这个问题。
有没有办法删除由于此错误而无法删除的数据库快照?我担心我已经用尽了所有记录在案的方法来做到这一点。可能需要对系统表进行未记录的修改。有没有办法强制删除数据库(快照)?
sql-server ×10
index ×2
batch-mode ×1
columnstore ×1
corruption ×1
cryptography ×1
dbcc-checkdb ×1
filegroups ×1
metadata ×1
network ×1
offset-fetch ×1
optimization ×1
security ×1