之间有什么区别CREATE INDEX和CREATE STATISTICS何时该使用的呢?
我正在设置一个作业来遍历链接服务器列表并对每个服务器执行特定查询。我正在尝试在 TRY-CATCH 块内执行查询,因此如果某个特定服务器出现问题,我可以将其记录下来,然后继续处理其他服务器。
我在循环内执行的查询如下所示:
BEGIN TRY
SELECT *
FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
Run Code Online (Sandbox Code Playgroud)
如果连接到服务器出现问题,代码会立即失败并且不会传输到CATCH块。如果服务器连接但在实际查询中存在错误,例如被零除,那么这会被CATCH块按预期捕获。
例如,我为一个我知道不存在的名称创建了一个链接服务器。执行上述操作时,我只得到:
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"An error has occurred while establishing a connection to the server.
When connecting to SQL Server 2005, this failure may be …Run Code Online (Sandbox Code Playgroud) 使用 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 …
-- 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条款中?我有一个表,其中有一个针对不可为空值过滤的唯一索引。在查询计划中使用了 distinct。是否有一个原因?
USE tempdb
CREATE TABLE T1( Id INT NOT NULL IDENTITY PRIMARY KEY ,F1 INT , F2 INT )
go
CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL
GO
INSERT INTO T1(f1,F2) VALUES(1,1),(1,2),(2,1)
SELECT DISTINCT F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL
SELECT F1,F2 FROM T1 WHERE F1 IS NOT NULL AND F2 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
查询计划:

该ISNUMERIC函数有一些意外行为。MSDN 文档说:
ISNUMERIC当输入表达式计算为有效的数字数据类型时返回 1;否则返回 0。有效的数字数据类型包括:int、bigint、smallint、tinyint、decimal、numeric、money、smallmoney、float、real。
它还有一个脚注:
ISNUMERIC对于某些非数字字符返回 1,例如加号 (+)、减号 (-) 和有效的货币符号,例如美元符号 ($)。有关货币符号的完整列表,请参阅money 和 smallmoney (Transact-SQL)。
好的,因此+、-和 列出的货币符号应被视为数字。到现在为止还挺好。
现在是奇怪的部分。首先,链接文章中的一些货币符号不是数字,包括:
???这很奇怪,我似乎无法找出原因?这个版本或环境依赖吗?
然而,事情变得更奇怪了。这里还有一些我无法解释的:
/不是数字,而是\(啊?!)REPLICATE(N'9', 308)是数字,但REPLICATE(N'9', 309)不是第一个也是最基本的问题是:如何解释上述情况?更重要的是:背后的逻辑是什么ISNUMERIC,所以我可以自己解释/预测所有案例?
这是重现事物的好方法:
DECLARE @tbl TABLE(txt NVARCHAR(1000));
INSERT INTO @tbl (txt)
VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'),
(NCHAR(8356)), (NCHAR(8352)), …Run Code Online (Sandbox Code Playgroud) 我的任务是发现在我们的域中运行的所有 SQL Server 实例。在某些情况下,每个服务器有多个实例。我见过两种不同的 PowerShell 方法来查找这些实例,但似乎都没有找到所有实例。
1) 使用 WMI
$srvr = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer $computerName
$instances = $srvr | ForEach-Object {$_.ServerInstances} | Select @{Name="fullName";Expression={$computerName +"\"+ $_.Name}}
return $instances
Run Code Online (Sandbox Code Playgroud)
2)使用远程注册表(与 Get-SQLInstance 1 一样)
我遇到的最大问题是,并非我所知道的所有服务器都使用 SQL Server WMI 提供程序运行,也不是所有服务器都允许远程注册。有没有第三种方法?我可以使用远程桌面访问所有服务器,但我正在查看大约 30 台机器,并希望尽可能避免手动步骤。这仅需要适用于 SQL Server 2008 及更高版本,虽然了解其他 SQL Server 服务 (SSIS/SSAS/SSRS) 会很好,但我主要关注 SQL Server 本身。
sql-server ×10
except ×1
index ×1
index-tuning ×1
msdtc ×1
optimization ×1
performance ×1
powershell ×1
smo ×1
sqlcmd ×1
statistics ×1