小编usr*_*usr的帖子

与 2008 R2 相比,更喜欢 SQL Server 2012 的客观商业原因是什么?

我的公司正面临为新的数据库服务器购买 SQL Server 2012 Denali 还是 SQL Server 2008 R2 的决定。我正在寻找客观的理由来选择一个。

我们的要求:

  • 标准版(出于经济原因和不需要企业功能)
  • OLTP 工作负载(这意味着我们不需要新的窗口函数和列存储索引)
  • 数据库大小 10-100 GB
  • 不需要商业智能功能。只需要关系引擎
  • 同步数据库镜像

目前,我知道以下原因:

SQL Server 2012 德纳利

  • 最新版本可用

SQL Server 2008 R2

  • 成熟的技术

我似乎找不到很多技术原因来偏爱其中一个。基本上,这归结为选择成功运行的成熟技术与可用的最新和最好的版本。

做出决定的客观原因是什么?

sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012

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

SQL Server 2014 在批处理模式下究竟能执行什么?

在查询中使用列存储索引时,SQL Server 能够使用批处理模式。关于什么可以在批处理模式下运行,什么不能运行的文档很少。请查看以下(激励性)查询计划,其中以批处理模式(绿色)执行的事情数量惊人:

在此处输入图片说明

(这是一个估计的计划,我用实际计划来验证实际执行方式确实是批处理。)

请注意,只有 T1 的构建端使用列存储索引。所有探测输入(T2 和 T3)都是行存储。他们的数据似乎过渡到批处理模式。我一直认为批处理模式仅用于通过探针端运行的数据流。

即使数据不是来自列存储索引,数据似乎也可以转换为批处理模式。这就提出了一个问题:为什么 SQL Server 不对仅行存储的查询使用批处理模式?可能对他们中的一些人有益。使用列存储索引是否是使 SQL Server 考虑批处理模式所必需的正式要求?我们可以添加一个带有列存储索引的零行虚拟表来引入批处理模式并实现性能提升吗?

从 SQL Server 2014 开始,究竟可以在批处理模式下运行什么?

sql-server columnstore sql-server-2014 batch-mode

23
推荐指数
1
解决办法
4581
查看次数

SQL Server:我们应该使用 TCP 或命名管道还是使用默认值?

当从同一 LAN 中不同服务器上的 .NET 4 客户端应用程序连接到 SQL Server 2008 R2 时,可以设置三种不同的网络协议:

  1. TCP
  2. 命名管道
  3. 不要在连接字符串中设置任何内容并使用默认值

什么是最佳实践?选择什么?

附加信息:在服务器和客户端上都启用了 TCP 和命名管道。应用程序正在使用数据库镜像。客户端和服务器通过快速 LAN 进行通信。

我们正在对此进行调查,因为我们有罕见的虚假连接和超时问题。(但无论如何,我想知道最佳实践)。

MSDN 上有一篇关于这个主题的文章,但它非常笼统和模糊。它不建议或推荐任何有用的东西。

sql-server sql-server-2008-r2 network

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

DBCC CHECKDB 无法修复的损坏:索引视图包含不是由视图定义生成的行

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用于强制在 上使用(唯一)索引ViewNameFORCESCAN用于防止索引视图匹配发生。执行计划确认这两种措施都有效。

这里没有返回任何行,这意味着两个表是相同的。(只有整数和 guid 列,排序规则不起作用)。

无法通过在视图上重新创建索引或运行DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS …

sql-server materialized-view corruption dbcc-checkdb

17
推荐指数
2
解决办法
2217
查看次数

将主键移动到文件组 (SQL Server 2012)

如何将集群主键移动到新文件组?我已经找到了一种可能的“算法”,但它的效率非常低:

  1. 删除非聚集索引(需要重新使用和重建它们)
  2. 删除聚集索引(需要对整个表进行重新排序)
  3. 创建新的主键约束(巨大的排序操作)
  4. 创建所有非聚集索引(需要排序和写入)

有没有更有效的方法?这是非常低效的,并且需要很长时间,因为表在弱服务器上的大小为 50GB。

有没有办法跳过所有这些并在新文件组上重建?这不需要对数据进行任何排序。

index sql-server filegroups sql-server-2012

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

在 SQL Server 中安全地生成 UNIQUEIDENTIFIER

我打算使用 aUNIQUEIDENTIFIER作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。

我需要生成多个这样的标识符作为INSERT...SELECT语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。

如何生成安全的随机数UNIQUEIDENTIFIER?请注意,这NEWID不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM, RANDor 的东西GETUTCDATE也不符合条件。

security sql-server uniqueidentifier sql-server-2012 cryptography

16
推荐指数
2
解决办法
7213
查看次数

SQL Server 使用与定义不匹配的数据填充 PERSISTED 列是否合法?

我正在跟进有关计算列中奇怪值的问题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)

sql-server sql-server-2014 computed-column

16
推荐指数
1
解决办法
520
查看次数

为什么 OFFSET ... FETCH 和旧式 ROW_NUMBER 方案之间存在执行计划差异?

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)

偏移量获取.png

可以通过创建 CIobject_id或添加过滤器来改变此测试用例,但不可能消除所有计划差异。OFFSET ... FETCH总是更快,因为它在执行时做的工作更少。

sql-server optimization execution-plan sql-server-2012 offset-fetch

15
推荐指数
2
解决办法
3174
查看次数

index_id &lt; 256000 有什么意义?

在我读到的某个教程中,作者正在sys.indexes根据谓词进行过滤index_id < 256000。这有什么作用?

index sql-server metadata catalog-views

11
推荐指数
1
解决办法
1062
查看次数

SQL Server 升级失败后如何“hack-drop”数据库​​快照

我正在处理SQL Server 升级到 2014 后无法删除数据库快照问题。快照已失效但无法删除。

现在,虽然 Connect 项目中有一个令人失望的评论,但我认为这最终会得到解决。但是,我需要尽快处理这个问题。

有没有办法删除由于此错误而无法删除的数据库快照?我担心我已经用尽了所有记录在案的方法来做到这一点。可能需要对系统表进行未记录的修改。有没有办法强制删除数据库(快照)?

sql-server sql-server-2014

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