AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-508

Andrew Bickerton's questions

Martin Hope
Andrew Bickerton
Asked: 2018-05-22 05:36:30 +0800 CST

链接到多子网故障转移集群的服务器连接

  • 6

我们最近将我们的 SQL Server 分发数据库迁移到多子网故障转移群集,并且发现偶尔在从发布者添加文章/查看复制状态时,我们会收到如下错误:

无法为链接服务器“repl_distributor”初始化 OLE DB 提供程序“SQLNCLI11”的数据源对象。(.Net SqlClient 数据提供者)

这似乎是由于链接服务器连接与多子网故障转移集群通信(如此处所述)

除了在我们的发布者(也是多子网故障转移集群)的每个节点上实现 ODBC 连接的解决方案之外,我们还可以尝试修复连接到多子网 FCI 的链接服务器吗?

sql-server sql-server-2016
  • 2 个回答
  • 5308 Views
Martin Hope
Andrew Bickerton
Asked: 2018-03-22 01:16:08 +0800 CST

事务复制报告正常,但跟踪令牌未到达

  • 2

我这里有一个奇怪的问题。我在我们的测试复制设置中尝试使用“从 lsn 初始化”,现在已经破坏了我们一个数据库中的所有出版物,从头开始重建(应用新快照)并没有解决问题。

在复制监视器中,分发代理连续运行并报告:

没有可用的复制事务

Tracer 令牌报告:

  • 发布者到分销商:00:00:02
  • 订阅者的分销商:待定...
  • 总延迟:待定...

当我使用以下方法调查分发日志时:

SELECT time,
       CAST(comments AS XML) AS comments,
       runstatus,
       duration,
       xact_seqno,
       delivered_transactions,
       delivered_commands,
       average_commands,
       delivery_time,
       delivery_rate,
       delivery_latency / (1000 * 60) AS delivery_latency_Min,
       agent_id
FROM dbo.MSlogreader_history WITH (NOLOCK)
WHERE agent_id = 5
ORDER BY time DESC;

SELECT *
FROM dbo.MSdistribution_history
WHERE agent_id = 125
ORDER BY time DESC;

我可以从以下位置看到最新的 xact_seqno:

  • LogReader 代理为:0x00000378000384880003
  • 分销代理为:0x000CA68B000010A8000A000000070000

作为对其他数据库之一的比较(去同一个订阅者),我得到:

  • LogReader 代理是:0x00000D140001F52A0003
  • 分发代理为:0x00000D140001F52A0003000000000000

对我来说,分发代理似乎正在记住旧的损坏 xact_seqno(从我在测试“从 lsn 初始化”时出错时起),但现在它似乎已经永久地破坏了该数据库的所有复制。

服务器:

  • PubA - 一个发布者托管多个可复制的数据库
  • Dist - 一个独立的分销商
  • SubA - 第一个订阅者
  • SubB - 第二个订阅者

数据库:

  • PubA.DB1 = 工作正常的发布者数据库
  • PubA.DB2 = 已损坏的发布者数据库
  • SubA.PullWorking1 = 第一个订阅者拥有来自 DB1 的有效拉取订阅
  • SubA.PullBroken2 = 第一个订阅者也从 DB2 获得了损坏的拉取订阅
  • SubA.PushWorking1 = 第二个订阅者有一个来自 DB1 的有效推送订阅
  • SubA.PushBroken2 = 第 2 个订阅者也有来自 DB2 的中断推送订阅

出版物:

  • PubA.DB1.PushPub_works
  • PubA.DB1.PullPub1_works
  • PubA.DB1.PullPub2_works
  • PubA.DB2.PushPub_broken
  • PubA.DB2.PullPub_broken
sql-server-2016 transactional-replication
  • 1 个回答
  • 2116 Views
Martin Hope
Andrew Bickerton
Asked: 2015-02-18 04:39:40 +0800 CST

为什么表中没有行时 SUM() 返回 0?

  • 5

多年来我一直在说,如果您将聚合值分配给没有返回行时需要处理的变量。IE:

DECLARE @MyVar INT

SELECT @MyVar = SUM(t.MyValue) FROM dbo.MyTable t WHERE /* clause */

IF @MyVar IS NULL
    SET @MyVar = 0

然而,一位开发人员最近指出,他们不需要进行@@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

我得到一个值为 0 的单行。

但是,如果我添加 GROUP BY 子句:

DECLARE @MyTable TABLE(ID INT, MyValue INT)

/* when you add on a GROUP BY, you no longer get a record back */
SELECT ISNULL(SUM(t.MyValue),0) FROM @MyTable t WHERE t.ID = 100 GROUP BY t.ID

我没有返回任何行(这是我所期望的),我已经对 MS 文档进行了一些挖掘,但找不到对这种行为差异的参考。谁能解释为什么会这样?这也是 SQL Server 工作方式的变化吗?

注意:我的测试是在 SQL Server 2008R2

** 编辑:回顾我过去发送的一些电子邮件并更正了我的支票,我一直在说如果值仍然为 NULL,请处理它...(不处理任何行并分配为 NULL)

sql-server
  • 1 个回答
  • 16002 Views
Martin Hope
Andrew Bickerton
Asked: 2012-01-31 04:46:08 +0800 CST

在触发器中,如何检查是否没有字段更改?

  • 5

如果我们收到一条更新语句,它不检查 where 子句中的值是否已更改,那么在触发器中忽略该更新的不同方法是什么?

我知道我们可以对每个单独的字段进行比较(也处理 ISNULL 端),但是如果它是一个有 50 多个字段的表,有没有更快/更简单的方法呢?

注意:这可用于减少审计记录等中的 IO/噪音...

例子

对于以下表格:

CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1), 
 Field1 varchar(10) NULL,
 Field2 varchar(20) NULL)

带有更新后触发器,其中包含:

INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted

具有初始值:

INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'

现在运行更新:

UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
sql-server trigger
  • 2 个回答
  • 11100 Views
Martin Hope
Andrew Bickerton
Asked: 2011-09-17 03:46:14 +0800 CST

哪个更快:选择现有行与不存在行的更新?

  • 5

哪个跑得最快?

  1. 使用主键从表中选择(整数、聚集索引、1,000,000+ 行)
  2. 尝试在不存在该行的不同表上进行更新?(整数主键、聚集索引、200,000+ 行的 where 子句)

背景

我们目前有一些程序需要维护其表的过滤副本。

涉及的表:

  • [MasterTable]包含过滤条件的
  • [ChildTable]被过滤
  • [ChildFilterTable]保存过滤后的记录

目前正在通过以下方式完成:

  1. 选择过滤条件
  2. 如果过滤条件匹配,则:
    1. 尝试更新
    2. 如果没有更新记录,则插入一条新记录

示例 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, ....)
    END
END

拟议变更

改成:

  1. 尝试更新
  2. 如果没有更新记录,则:
    1. 选择过滤条件
    2. 如果过滤条件匹配则:插入一条新记录

所以:

DECLARE @FilterValue INT

/* Attempt update */
UPDATE [ChildFilterTable] SET
    ...
WHERE ChildID = @IDFromChildTable

IF @@ROWCOUNT = 0
BEGIN
    /* Get FilterValue to check */
    SELECT @FilterValue = FilterValue FROM [MasterTable] WHERE ID = @IDFromChildTable

    IF @FilterValue = 123
    BEGIN
        /* Row not there yet, insert it! */
        INSERT INTO [ChildFilterTable] (ChildID, ....) VALUES (@IDFromChildTable, ....)
    END
END

注意:业务规则确认过滤器值一旦设置就永远不会改变,[MasterTable]因此我们无需担心更新与过滤器记录不匹配的值(即:如果它在 ChildFilterTable 中,我们要更新它。

sql-server-2008 sql-server-2005
  • 3 个回答
  • 2290 Views
Martin Hope
Andrew Bickerton
Asked: 2011-08-10 07:03:57 +0800 CST

sp_repladdcolumn - 是否可以提供出版物列表以添加此列?

  • 4

设想

我们在 3 个不同的出版物中有一个现有的表(去 3 个不同的订阅者),其中 1 个出版物没有发布所有列。

所有这些都是事务拉订阅。

我现在需要在此表中添加更多列,并且我们只想将它们添加到前两个出版物中。但是来自MSDN:

[ @publication_to_add =] 'publication_to_add' 是添加新列的发布的名称。publish_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 )

发布者/订阅者示例

[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)

问题

如何添加:

[myMarriageDate] datetime NULL,
[myDivorceDate] datetime NULL

并且只添加到出版物[InternalPublication]和[Reporting]中?

注:样品是为保护无辜而编造的

sql-server sql-server-2005
  • 2 个回答
  • 1645 Views
Martin Hope
Andrew Bickerton
Asked: 2011-06-21 02:09:49 +0800 CST

日志阅读器如何处理批量更新

  • 4

关键问题

我们遇到的延迟不是将更改从分发服务器应用到订阅服务器(如果我们观察复制监视器,它的延迟通常小于 1 秒),而是提交给发布者数据库的事务到达分发服务器所需的时间.

部分问题是我们有几个过滤器应用于我们最易变的表之一,并且在每次更新/插入/删除时,LogReader.exe 需要根据应用的任何过滤器检查将记录放入哪个发布。

从我们所做的测试来看,似乎每应用一个额外的过滤器都会成倍地增加 LogReader 处理每个事务所花费的时间。

(编辑 23/06/2011:添加了有关过滤器的更多详细信息)

背景

在我们的复制设置中,我们有几个出版物在高度易变的表上有过滤器(2 小时内平均有 150 万笔交易)。在繁忙时期,这可能导致 LogReader 以 20 秒的延迟运行(通常 < 1 秒)

我们已经确定了几个改进领域(减少过滤器数量、减少更新数量、外包处理等),一个潜在的改进领域是改变应用更新的方式。

示例表(以帮助解释)

myTable
----------------
myID         int
myGroupID1   int
myGroupID2   int
Suspended    bit
FilterFlag1  int
FilterFlag2  int
FilterFlag3  int

为了复制来说明这一点,我们将有 5 个[myTable]的出版物:

Publication  Filter
-----------  ------
NoFilter1    [all records]*  
NoFilter2    [all records]*  
Filter1      FilterFlag1 = 1
Filter2      FilterFlag2 = 1
Filter3      FilterFlag1 = 1 AND FilterFlag2 = 1  
  • 其他表格合并到这些出版物中,这就是为什么具有相同过滤器(无)的同一个表格出现在多个出版物中的原因。

当前更新进程

大多数更新此表的应用程序通过循环遍历其对象集合、将更改应用到该单个对象然后将更改提交到数据库,然后再移动到下一个对象来执行此操作。

从数据库跟踪的角度来看,这意味着当发生更改时我们会得到多达 120 个更新语句

例子

update [myTable] set Suspended = @Suspended 
where myID = @pID

建议的更新过程

由于对象集合实际上是基于组 ID 的,一个潜在的改进是进行批量更新(而不是单独更新),然后刷新对象集合。将更新语句的数量减少到 1 或 2(取决于业务场景)。

例子

update [myTable] set Suspended = @Suspended 
where myGroupID1 = @groupID1 
      and myGroupID1 = @groupID2

对 LogReader 的影响?

从应用程序处理的角度来看,进行一次更新对我来说很有意义(应用程序和数据库之间的往返次数更少 = 更快),但是我不确定 LogReader 将如何处理这两种情况,因为它需要处理更新的每条记录交易..

LogReader 在批量更新时会更快还是更慢地处理这些记录?

sql-server replication
  • 1 个回答
  • 451 Views
Martin Hope
Andrew Bickerton
Asked: 2011-02-04 02:55:19 +0800 CST

Redgate SQL Search 对服务器的影响

  • 8

我是许多Redgate工具的忠实粉丝,但在我目前的工作场所,它们对与实时服务器交互的任何事情(尤其是影响性能)都非常偏执。

所以我的问题专门针对他们的SQL 搜索工具,它对服务器有什么影响?我假设会有:

  1. 初始索引(它与什么交互,对服务器影响的想法,是否可以自定义为不索引实时服务器)
  2. 后续连接/刷新(如何确定是否有要重新索引的更改以及对服务器的性能/负载影响)?
sql-server tools
  • 2 个回答
  • 931 Views
Martin Hope
Andrew Bickerton
Asked: 2011-02-02 01:35:35 +0800 CST

如何获得 MAX 行

  • 21

在 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 @Test

给出:

ID          name      dateOfBirth             TaxNumber
----------- --------- ----------------------- ----------
1           Fred      1976-01-25 00:00:00.000 123
2           Bob       1976-03-03 00:00:00.000 234
3           Jane      1996-06-13 00:00:00.000 345
4           Fred      1982-02-14 00:00:00.000 456
5           Bob       1983-10-25 00:00:00.000 567
6           Jane      1995-04-12 00:00:00.000 678
7           Fred      1976-03-03 00:00:00.000 789

如果我想检索最年长的人(按姓名分组)的完整详细信息,我可以使用哪些方法?

期望的输出:

ID          name      dateOfBirth             TaxNumber
----------- --------- ----------------------- ----------
1           Fred      1976-01-25 00:00:00.000 123
2           Bob       1976-03-03 00:00:00.000 234
6           Jane      1995-04-12 00:00:00.000 678
sql-server
  • 1 个回答
  • 9470 Views
Martin Hope
Andrew Bickerton
Asked: 2011-01-28 01:04:53 +0800 CST

哈希,合并和循环连接之间的区别?

  • 46

在 SQL Server 中,您可以指定连接提示:

  • 哈希连接
  • 合并加入
  • 循环连接

这三个连接提示的定义是什么,应该在什么时候使用它们?

sql-server
  • 2 个回答
  • 61109 Views
Martin Hope
Andrew Bickerton
Asked: 2011-01-27 05:03:46 +0800 CST

如何对服务器上的所有数据库执行 SQL

  • 39

我有一些标准 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

如何对单个服务器上的所有数据库执行此操作?(除了一次手动连接一个并执行之外)

sql-server
  • 6 个回答
  • 66764 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve