在 SQL Server 中,您可以指定连接提示:
这三个连接提示的定义是什么,应该什么时候使用?
我有一些标准 SQL 可以针对单个服务器上的多个数据库运行,以帮助我诊断问题:
select
so.name,
so.type,
MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
@@ServerName as Server,
DB_Name() as DBName
from
sysobjects so with (nolock)
join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name
Run Code Online (Sandbox Code Playgroud)
如何对单个服务器上的所有数据库执行此操作?(除了一次手动连接一个并执行)
在 SQL Server 中,我总是发现获取数据集的最大行数很痛苦,我正在寻找一个方法列表来检索最大行数,并提供一些有关性能和可维护性的指导。
示例表:
DECLARE @Test TABLE (ID INT IDENTITY(1,1), name VARCHAR(50),
dateOfBirth DATETIME, TaxNumber varchar(10))
INSERT INTO @Test (name, dateOfBirth, TaxNumber)
SELECT 'Fred', convert(datetime, '25/01/1976', 103), '123' UNION ALL
SELECT 'Bob', convert(datetime, '03/03/1976', 103), '234' UNION ALL
SELECT 'Jane', convert(datetime, '13/06/1996', 103), '345' UNION ALL
SELECT 'Fred', convert(datetime, '14/02/1982', 103), '456' UNION ALL
SELECT 'Bob', convert(datetime, '25/10/1983', 103), '567' UNION ALL
SELECT 'Jane', convert(datetime, '12/04/1995', 103), '678' UNION ALL
SELECT 'Fred', convert(datetime, '03/03/1976', 103), '789'
select * from …Run Code Online (Sandbox Code Playgroud) 在准备迁移项目时,我们正在尝试识别任何跨数据库选择数据的查询。
这可以是以下形式:
SELECT fieldA, fieldB
FROM dbo.TableA a
JOIN DatabaseB.dbo.TableB b ON b.ID = a.ID
Run Code Online (Sandbox Code Playgroud)
或者
DECLARE @resultFromDatabaseB VARCHAR(50)
SELECT @resultFromDatabaseB = b.ID
FROM DatabaseB.dbo.TableB
SELECT fieldA, fieldB
FROM dbo.TableA a
WHERE a.ID = @resultFromDatabaseB
Run Code Online (Sandbox Code Playgroud)
或任何其他变体(包括插入/更新/等...)
不幸的是,大多数查询不是存储过程,因此我无法对 SQL 文本进行静态分析,我当前的计划要求记录缓存的查询文本并对它们进行静态分析。
这种方法有什么替代方法吗?即:使用扩展事件/跟踪/审计?
我们最近将我们的 SQL Server 分发数据库迁移到了多子网故障转移集群,并且发现偶尔在从发布者添加文章/查看复制状态时,我们会收到如下错误:
无法为链接服务器“repl_distributor”初始化 OLE DB 访问接口“SQLNCLI11”的数据源对象。(.Net SqlClient 数据提供程序)
这似乎是由于链接服务器连接跟一个多子网故障转移群集(如所描述的在这里)
除了遵循在我们发布者的每个节点(也是一个多子网故障转移集群)上实现 ODBC 连接的解决方案之外,还有什么我们可以尝试修复连接到多子网 FCI 的链接服务器吗?
哪个会跑得最快?
我们目前有一些程序需要维护其表的过滤副本。
涉及的表:
[MasterTable] 包含过滤条件[ChildTable] 被过滤[ChildFilterTable] 保存过滤后的记录目前正在通过以下方式完成这项工作:
示例 SQL:
DECLARE @FilterValue INT
/* Get FilterValue to check */
SELECT @FilterValue = FilterValue FROM [MasterTable] WHERE ID = @IDFromChildTable
IF @FilterValue = 123
BEGIN
/* Attempt update */
UPDATE [ChildFilterTable] SET
...
WHERE ChildID = @IDFromChildTable
IF @@ROWCOUNT = 0
BEGIN
/* Row not there yet, insert it! */
INSERT INTO [ChildFilterTable] (ChildID, ....) VALUES (@IDFromChildTable, ....) …Run Code Online (Sandbox Code Playgroud) 如果我们收到一条不检查 where 子句中的值是否已更改的更新语句,那么在触发器中忽略该更新的不同方法是什么?
我知道我们可以对每个单独的字段进行比较(也可以处理 ISNULL 端),但是如果它是一个包含 50 多个字段的表,是否有更快/更简单的方法来做到这一点?
注意:这可用于减少审计记录等中的 IO/噪音...
例子
对于表:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
Run Code Online (Sandbox Code Playgroud)
带有更新程序后触发器,其中包含:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
Run Code Online (Sandbox Code Playgroud)
初始值:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Run Code Online (Sandbox Code Playgroud)
现在运行更新:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
Run Code Online (Sandbox Code Playgroud) 多年来我一直在说,如果您将聚合值分配给一个变量,如果没有返回行,您需要处理该变量。IE:
DECLARE @MyVar INT
SELECT @MyVar = SUM(t.MyValue) FROM dbo.MyTable t WHERE /* clause */
IF @MyVar IS NULL
SET @MyVar = 0
Run Code Online (Sandbox Code Playgroud)
然而,一位开发人员最近指出,他们不需要进行 @@ROWCOUNT 检查,因为 SUM 总是返回一个值(即使没有行)。经过进一步挖掘,我发现 SQL Server 似乎存在不一致的行为:
所以如果我运行:
DECLARE @MyTable TABLE(ID INT, MyValue INT)
/* you get a value of 0 back */
SELECT ISNULL(SUM(t.MyValue),0) FROM @MyTable t WHERE t.ID = 100
Run Code Online (Sandbox Code Playgroud)
我得到一个值为 0 的单行。
但是,如果我添加一个 GROUP BY 子句:
DECLARE @MyTable TABLE(ID INT, MyValue INT)
/* when you add on a GROUP BY, you no longer …Run Code Online (Sandbox Code Playgroud) 我们在 3 个不同的出版物中有一个现有表(发给 3 个不同的订阅者),其中 1 个出版物没有发布所有列。
所有这些都是事务性请求订阅。
我现在需要在此表中添加更多列,我们只想将它们添加到前两个出版物中。然而来自MSDN:
[ @publication_to_add =] 'publication_to_add' 是添加新列的发布的名称。Publication_to_add 是 nvarchar(4000),默认值为 ALL。如果为 ALL,则所有包含此表的发布都会受到影响。如果指定了publication_to_add,则只有该发布添加了新列。
这意味着您希望它指定1 个出版物或所有出版物。
帮助演示问题的示例表/出版物详细信息:
表样
[MyTable] (
ID int IDENTITY(1,1) NOT NULL,
myName varchar(50) NULL,
myDOB datetime,
myJob varchar(100),
mySpouseID int )
Run Code Online (Sandbox Code Playgroud)
发布/订阅者示例
[InternalPublication] All fields, sent to InternalAdmin system
[Reporting] All fields, sent to Reporting/Datawarehouse system
[External] sent to External accessable system, fields sent:
(ID, myName, myDOB)
Run Code Online (Sandbox Code Playgroud)
我如何添加:
[myMarriageDate] datetime NULL,
[myDivorceDate] datetime NULL …Run Code Online (Sandbox Code Playgroud) 在尝试确定最合适的高可用性选项时,我们专注于减少停机时间(计划内或计划外)。我已经能够收集有关故障转移群集实例 (FCI) 的统计信息(通过阅读大量 MSDN 文档和博客)。
我还没有找到有关可用性组的故障转移统计信息/次数的文档。
作为比较 (FCI):
故障转移 2008R2 集群的时间范围从 30 秒到 5 分钟不等(取决于流量以及硬件/网络设置):
进行手动故障转移时,它会完成对 LUN 的写入,将 LUN 切换到新的主动节点,并在新的主动节点上启动 SQL Server 实例。
在进行自动故障转移时,启动节点后,它将对数据库进行一致性检查并回滚任何进行中的事务。
可用性组
我知道,当您比较相同的硬件和流量时,可用性组应该能够更快地进行故障转移。
我无法找到比较两者的任何真实世界的实际指标。
具体来说,是否有人对正在积极使用的可用性组中的主写入节点进行故障转移所需的时间有任何指标?
(故障转移到同步辅助)理想情况下,这将包括对任何 Microsoft 或可信赖来源的引用。请不要基于意见,只有指标。