标签: sql-server

SQL Server 索引与统计

之间有什么区别CREATE INDEXCREATE STATISTICS何时该使用的呢?

index sql-server statistics

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

TRY-CATCH 未捕获链接服务器错误

我正在设置一个作业来遍历链接服务器列表并对每个服务器执行特定查询。我正在尝试在 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 linked-server

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

在 SQLCMD 模式下设置变量

使用 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 的服务器中的值。

sql-server sql-server-2008-r2 sqlcmd

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

AlwaysOn AG,带故障转移的 DTC

问题:如何在 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 msdtc availability-groups

14
推荐指数
1
解决办法
6985
查看次数

我应该在添加主键之前还是之后添加页面级压缩?

情况

  • Sql Server 2008 Enterprise 上的数据仓库
  • 36+ 万行堆(别问),60+ 列
  • 每月增加 750k
  • 没有定义主键(我现在已经确定了一个)
  • 无压缩

我在想做什么(按此顺序)

  • 添加页面级压缩
  • 添加PK
  • 添加多个非聚集索引
  • 尽快执行此操作


我现在倾向于什么

-- 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 上找到

sql-server-2008 sql-server

14
推荐指数
1
解决办法
2843
查看次数

在 SQL Server 2012 中索引 PK GUID

我的开发人员已将他们的应用程序设置为使用 GUID 作为几乎所有表的 PK,默认情况下 SQL Server 已在这些 PK 上设置聚集索引。

该系统相对年轻,我们最大的表只有一百万多行,但我们正在查看我们的索引并希望能够快速扩展,因为在不久的将来可能需要它。

所以,我的第一个倾向是将聚集索引移动到 created 字段,它是 DateTime 的 bigint 表示。但是,我可以使 CX 独一无二的唯一方法是在此 CX 中包含 GUID 列,但按创建顺序排列。

这是否会使集群键太宽,是否会提高写入性能?读取也很重要,但此时写入可能是一个更大的问题。

sql-server clustered-index uniqueidentifier index-tuning

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

不应该避免吗?

在一些 SQL Server 开发人员中,普遍认为NOT IN速度非常慢,应该重写查询,以便它们返回相同的结果,但不要使用“evil”关键字。(示例)。

这有什么道理吗?

例如,SQL Server 中是否存在一些已知错误(哪个版本?)导致使用NOT IN的查询比使用的等效查询具有更差的执行计划

  • 一个LEFT JOIN结合了NULL支票或
  • (SELECT COUNT(*) ...) = 0WHERE条款中?

performance sql-server except query-performance

14
推荐指数
1
解决办法
390
查看次数

为什么在唯一索引扫描后使用聚合运算符

我有一个表,其中有一个针对不可为空值过滤的唯一索引。在查询计划中使用了 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)

查询计划: 在此处输入图片说明

sql-server optimization filtered-index

14
推荐指数
1
解决办法
351
查看次数

某些特殊字符的 ISNUMERIC 背后的逻辑是什么?

ISNUMERIC函数有一些意外行为。MSDN 文档说:

ISNUMERIC当输入表达式计算为有效的数字数据类型时返回 1;否则返回 0。有效的数字数据类型包括:int、bigint、smallint、tinyint、decimal、numeric、money、smallmoney、float、real

它还有一个脚注:

ISNUMERIC对于某些非数字字符返回 1,例如加号 (+)、减号 (-) 和有效的货币符号,例如美元符号 ($)。有关货币符号的完整列表,请参阅money 和 smallmoney (Transact-SQL)

好的,因此+-和 列出的货币符号应被视为数字。到现在为止还挺好。

现在是奇怪的部分。首先,链接文章中的一些货币符号不是数字,包括:

  • 欧元货币符号,十六进制 20A0: ?
  • 奈拉符号,十六进制 20A6: ?
  • 里亚尔符号,十六进制 FDFC: ?

这很奇怪,我似乎无法找出原因?这个版本或环境依赖吗?

然而,事情变得更奇怪了。这里还有一些我无法解释的:

  • /不是数字,而是\啊?!
  • 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 sql-server-2012

14
推荐指数
2
解决办法
3078
查看次数

使用 PowerShell 发现所有正在运行的 SQL Server 实例的最有效方法是什么?

我的任务是发现在我们的域中运行的所有 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 powershell smo

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