我是一家小公司的一员,所以像往常一样负责许多不同的角色。最新的是为我们的 .NET Web 应用程序采购一个专用的 SQL Server 盒。我们在双 Xeon E5-2620(六核)2.00 GHz CPU 配置(共 12 核)上被引用,具有 32 GB 的 RAM。这使我们的磁盘阵列预算有限,该磁盘阵列基本上由 RAID 1 配置中的两个 2.5" SAS 300 GB 驱动器 (15k RPM) 组成。
我知道磁盘设置对于 SQL Server 来说是次优的,我真的很想推动 RAID 10,这样我们就可以将数据库、日志文件和 tempdb 放在他们自己的驱动器上。为了使这与我们的预算兼容,我应该考虑减少 CPU 内核的数量吗?或者我会得到更好的银行来保持核心并使用更少的驱动器,也许在双 RAID 1 设置中使用 4 个?
这是一些额外的统计数据
SQL Server 数据库倾向于大量读取到写入,可能分别为 80% 和 20%。当前的数据库大小目前约为10 GB 26 GB,以每月 250 MB 的速度增长。
目前在与 Web 服务器共享的单个四核 Xeon 机器上运行 SQL Server 2008 R2 Standard(RAID 1 中的 12 GB Ram、2 x 10k 300GB SAS 驱动器),希望迁移到 SQL Server …
我有 8 台单独的 SQL Server 2008 R2 机器,每台机器托管 1 个数据库。每个数据库都有相同的表结构和模式,以及完全独特的数据。
我想建立一个报告服务器(可能是 2008 年或 2012 年),它将来自 8 个源服务器的选定表中的行合并到报告服务器上这些表的单个实例中。这是单向复制(不会对报告服务器进行任何更改)。我需要以相对较低的延迟(比如 20-30 秒)从源数据库复制更改。
此外,我想找到方法来实现这一点,对源服务器的影响尽可能小。在我的环境中,这些服务器的第 3 方代理、触发器或模式修改很困难。
我的问题:
谢谢,约翰
使用 SQL Server 2008 R2 企业版
考虑以下语句:
:setvar source_server_name "SERVERNAME\INSTANCENAME"
Run Code Online (Sandbox Code Playgroud)
是否可以在 SQLCMD 模式下使用 TSQL 获取该值
就像是: :setvar source_server_name = SELECT @@servername
谢谢
2013 年 7 月 15 日更新
下面提供的两个答案并没有给出理想的结果,所以我添加了一个更相关的例子。
:setvar source_server_name [myserver]
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 设置为文本字符串 [myserver_1]
我希望能够做到这一点:
create table #tmp(
id int identity(1,1),
server sysname
)
insert into #tmp values('myserver_1'),('myserver_2');
:setvar source_server_name = SELECT server FROM #tmp WHERE id = 1
select '$(source_server_name)'
(No column name)
myserver_1
Run Code Online (Sandbox Code Playgroud)
变量 source_server_name 将设置为 ID 1 的服务器中的值。
问题:如何在 AlwaysOn 可用性组 (AG) 中的所有服务器上运行分布式事务协调器 (DTC)?我不需要在故障转移/切换事件上维护事务。
设置:我有一个带有三台 Windows 2008 R2 服务器的 Windows 故障转移群集 (WSFC),它们都运行 SQL 2012。两台服务器位于一个数据中心,是 AlwaysOn 故障转移群集 (FCI) 的一部分,而第三台服务器位于第二个数据中心。WSFC 是一个多子网集群。这是设置的草图:

我已经能够安装和配置 DTC 以在两个 FCI 节点之间工作,因为它们位于同一子网上并共享存储。我已经配置了几个 AG,它们运行良好。此屏幕截图显示安装在 FCI 上的 DTC:

此屏幕截图显示我可以在其中一个 FCI 节点(以处于活动状态的节点为准)上配置 DTC:

我想将使用 DTC 的应用程序迁移到此集群并使用 AG。我读过 AG(参考)不支持 DTC 。我一直找不到在第二个数据中心的第三个节点上配置 DTC 的方法。当我尝试在第三个节点上配置 DTC 时,它似乎不可用,如下图所示:

在 Brent Ozar 的Free Setup Checklist PDF for Availability Groups 中,他列出了:
集群安装...
29. 如果涉及 FCI,请根据您的计划部分的决定配置 DTC。
In the comments on SQL Server 2012 AlwaysOn Availability Groups Rock Brent says that …
在 SQL Server 2008 中,有一个主表,它通过一对多关系链接到其他三个子表。所以,我们想在主表中使用级联删除,这样当从主表中删除记录时,子表上的所有记录都会被删除。
-- Add page level compression
alter table dbo.TableName
rebuild with (data_compression = page)
;
go
-- Add primary key
alter table dbo.TableName
add constraint PK_TableName
primary key clustered (<Columns>)
;
go
-- Add NC_IXs here
...
...
Run Code Online (Sandbox Code Playgroud)
我看过here(PK创建文档)和here(ALTER TABLE文档),但看不到任何关于是否有任何索引继承表压缩设置的明确信息。 这个特定问题的答案是“不,压缩不是继承的”,在 dba.stackexchange 上找到
我的开发人员已将他们的应用程序设置为使用 GUID 作为几乎所有表的 PK,默认情况下 SQL Server 已在这些 PK 上设置聚集索引。
该系统相对年轻,我们最大的表只有一百万多行,但我们正在查看我们的索引并希望能够快速扩展,因为在不久的将来可能需要它。
所以,我的第一个倾向是将聚集索引移动到 created 字段,它是 DateTime 的 bigint 表示。但是,我可以使 CX 独一无二的唯一方法是在此 CX 中包含 GUID 列,但按创建顺序排列。
这是否会使集群键太宽,是否会提高写入性能?读取也很重要,但此时写入可能是一个更大的问题。
在一些 SQL Server 开发人员中,普遍认为NOT IN速度非常慢,应该重写查询,以便它们返回相同的结果,但不要使用“evil”关键字。(示例)。
这有什么道理吗?
例如,SQL Server 中是否存在一些已知错误(哪个版本?)导致使用NOT IN的查询比使用的等效查询具有更差的执行计划
LEFT JOIN结合了NULL支票或(SELECT COUNT(*) ...) = 0在WHERE条款中?当我执行以下命令时(在管理工作室中,GO 会将命令分成批处理)
use tempdb
begin tran
go
CREATE TYPE dbo.IntIntSet AS TABLE(
Value0 Int NOT NULL,
Value1 Int NOT NULL
)
go
declare @myPK dbo.IntIntSet;
go
rollback
Run Code Online (Sandbox Code Playgroud)
我收到一条死锁错误消息。我的过程已经陷入僵局。我在 2008、2008R2 和 2012 中看到过这种行为。
有没有办法在它创建的同一个事务中使用我新创建的类型?
我有一个将 BlockOnPossibleDataLoss 设置为 false 的 dacpac,但是当我使用 sqlpackage.exe 运行它时部署被阻止,告诉我“列 [a] 被删除,可能会发生数据丢失。”
但是,当我使用完全相同的部署配置文件并从 Visual Studio 2012 发布时,它会通过。
sql-server sql-server-2012 ssdt visual-studio-2012 data-tier-application
sql-server ×10
performance ×2
deadlock ×1
delete ×1
except ×1
hardware ×1
index-tuning ×1
msdtc ×1
replication ×1
sqlcmd ×1
ssdt ×1