标签: linked-server

通过链接服务器插入到 SQL Azure 非常慢

我在 SQL Asure 服务器上有一个表,除了集群之外没有索引。我在这个表中插入了大约 1000 行的少量数据,这需要 4 多分钟。虽然,当我用 SSIS 做这件事时,它只需要一秒钟。这是查询:

INSERT INTO DatabaseName.dbo.tmpOurClients
(KodClient,Name ,ShortName,INN,Boss,contact,Email,Adres,Tel,City_ID,DateLop)
SELECT KodClient,Name ,ShortName,INN,Boss,contact,Email,Adres,Tel,City_ID,DateLop
FROM dbo.OurClients
Run Code Online (Sandbox Code Playgroud)

这就是我创建链接服务器的方式:

EXEC sp_addlinkedserver
@server='Azure',
@srvproduct='',
@provider='sqlncli',
@datasrc='ServerName.DATABASE.WINDOWS.NET',
@location='',
@provstr='',
@catalog='db_name'

EXEC sp_addlinkedsrvlogin
@rmtsrvname='Azure',
@useself='false',
@rmtuser='login@server_name.database.windows.net',
@rmtpassword='password'

EXEC sp_serveroption 'Azure', 'Collation Compatible', true;
Run Code Online (Sandbox Code Playgroud)

我已经检查了这个主题Linked server to SQL Azure 非常慢,但没有任何建议对我有帮助。

本地 SQL Server 版本:Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 2012 年 6 月 28 日 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.1(内部版本 7601) …

sql-server linked-server azure-sql-database

4
推荐指数
1
解决办法
5281
查看次数

如何通过sql server中的链接服务器从链接服务器查询?

我有以下设置:

SQL-Server 1  --linked-->  SQL-Server 2  --linked->  SQL-Server 3
Run Code Online (Sandbox Code Playgroud)

问题是我可以通过 SQL Server 2 从 SQL Server 1 查询 SQL Server 3 吗?

不幸的是,我有几个限制:

  • 不能使用 openquery
  • 不能在服务器 2 上使用视图(会有很多视图,并且必须维护)
  • 无法创建从服务器 1 到服务器 3 的链接(由于防火墙问题)
  • 服务器是 MS SQL 服务器

sql-server linked-server

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

减少 SUM(DATALENGTH()) 对链接服务器的影响

我有一个查询,它会向我报告添加记录所用的时间。我还在此查询中跟踪添加到数据库中的图像的大小。从我所见,它看起来像是从链接服务器返回整个图像,然后计算大小。有没有一种简单的方法可以让我在链接的另一侧计算大小,以便更快地返回?

SELECT
    [Date] = CAST(DATEADD(DAY,-@DaysBack,GETDATE()) AS DATE)
    ,NOTES = N.RPMID
    ,TimeTaken = DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate)
    ,PictureSize = SUM(CAST(DATALENGTH(SI.[Image])AS BIGINT))
    ,RecordsAdded = CAST(COUNT(*) AS BIGINT)
FROM
    DBServer1.DB1.dbo.Notes AS N WITH (NOLOCK)
    INNER JOIN DBServer1.DB1.dbo.NoteDistribution AS ND WITH (NOLOCK) ON N.Notes=ND.Notes
    INNER JOIN dbo.Submission_Notes AS SN WITH (NOLOCK) ON SN.RetailPlanGuid=N.RPMID
    LEFT JOIN DBServer1.DB1.dbo.SavedImage SI WITH (NOLOCK) ON SI.Notes=N.Notes
WHERE
    1=1
    AND N.RecordStampWhenAdd > CAST(GETDATE()-@DaysBack AS DATE)
    AND N.RecordStampWhenAdd < CAST(GETDATE()-@DaysBack+1 AS DATE)
    AND DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate) > 0
GROUP BY
    N.RPMID
    ,DATEDIFF("SECOND",SN.PickedUpDate,SN.ProcessedDate)
Run Code Online (Sandbox Code Playgroud)

有问题的部分是返回的图片大小。我希望那里的计算在存储数据的服务器上完成,然后将数字返回给我。对此的任何帮助都会很棒。谢谢。

sql-server linked-server

4
推荐指数
1
解决办法
139
查看次数

链接服务器的 Oracle 等效项是什么?您可以加入 SQL Server 吗?

在 SQL Server 中,我可以创建一个视图,该视图是使用链接服务器位于完全不同服务器中的两个表之间的连接。如果我将其中一台服务器从 SQL Server 更改为 Oracle,我还能这样做吗?

我需要连接表在 Oracle 中

oracle sql-server sql-server-2008-r2 linked-server oracle-12c

4
推荐指数
1
解决办法
8678
查看次数

SQL Server 链接服务器最佳实践 - 分步

您好,感谢您的光临。我是一个偶然的 DBA,正在寻找以正确方式创建链接服务器的一些指导。MS 提供了数据类型的完整描述以及 sp_addlinkedserver、sp_addlinkedsrvlogin 和 sp_serveroption 的所有各种参数的描述,但没有关于如何将各种选项对齐为给定情况的最佳实践的指导。

我有其他 DBA 的例子,他们只是使用了“sa”密码,但我的研究表明我应该使用针对他们的链接服务器用途量身定制的登录。问题是我到目前为止无法找到正确的组合和顺序(操作顺序)来正确创建所有部件和部件,从而导致链接服务器允许两台服务器之间进行有限的通信。

目标:在源服务器之间创建一个链接服务器,这将允许来自源服务器的作业步骤检查某些条件,如果为 TRUE,则在目标服务器上调用 sp_start_job。...仅此而已

根据建议,我在源和目标上创建了两个相同名称/密码的 SQL 身份验证登录,两者都具有有限的“公共”权限。

我创建了链接服务器,试图将本地登录映射到远程登录(想想如果我做到了,我会仔细修改目标登录的权限以找到允许它执行 sp_start_job 的权限)。

但到目前为止,我唯一的奖励是一系列各种类型的失败通知。

有大量在线文档解释了每个不同的 proc/param 的作用,但我很难找到某种概述来解释 procs/params 的组合如何导致不同的预期结果。

我希望得到一些有用的建议,参考一些“尚未发现”的教程,或者甚至是关于如何实现我的目标和培养一点自尊的分步说明。(到目前为止,这项任务除了挫伤我的自尊心之外什么也没做!)

感谢您的时间。

sql-server best-practices linked-server sql-server-2016

4
推荐指数
1
解决办法
622
查看次数

使用功能更新时的远程扫描

为什么在通过链接服务器更新时使用 ISNULL() 使用远程扫描来检索所有行并在本地进行过滤,而不是通过远程查询进行过滤?

UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = ISNULL(number,0)
WHERE accounts = '123'

UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = number
WHERE accounts = '123'
Run Code Online (Sandbox Code Playgroud)

执行计划如下: 执行计划1

该表确实有一个针对帐户列的非聚集唯一索引,但 ISNULL() 未用于帐户列并且该索引应该仍然可用。我在这里错过了什么吗?

sql-server execution-plan linked-server sql-server-2014

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

SQL Server - 是否通过链接服务器查询我的数据库?

有没有办法知道我的 SQL Server 实例上的特定数据库是否正在通过链接服务器查询?

sql-server linked-server

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

无法从链接服务器 X 的 OLE DB 提供程序“SQLNCLI”获取行集

我在通过链接服务器从同一个表进行并发读取时收到此错误。超时设置没问题。发生此错误时,我也开始收到相同查询的以下错误:

“事务(进程 ID X)在锁定资源上与另一个进程发生死锁,并已被选为死锁受害者。重新运行事务..”

这是否意味着可以通过链接服务器执行的读取数量有限制?如果是这样,限制是多少?或者这可能是因为其他原因吗?

此外,使用的查询如下:

SELECT  T.Col1, T.Col2, T.Col3, PG.Col1, PG.Col2, PG.Col3
INTO #TMP_OUTPUT 
FROM  linkedserver1.db1.dbo.table1 T WITH (NOLOCK)
      INNER JOIN #temp2 PG 
      ON T.Col1 = PG.Col1
WHERE T.Col3 = somevalue
Run Code Online (Sandbox Code Playgroud)

谢谢,卡努

sql-server-2008 sql-server deadlock linked-server

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

消息 7391,SQL Server 上的分布式事务 (DTC)

这可能与 DBA 相关或与开发人员相关,老实说我不知道​​。

我有两个数据库服务器:

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

我在服务器 A 中有一个表,其中电子邮件通知排队,我创建了一个“插入后”触发器来sp_send_dbmail使用服务器 B执行,就像这样......

A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)

这就是我需要帮助的奇怪之处,请注意,这似乎是一个记录非常差(或严重缺乏)的功能。

现在我可以使用一些示例数据执行最后一条语句,一切正常。但是当我尝试像这样插入表格时......

USE SampleDB
ALTER TRIGGER [dbo].[mail_inserted] 
   ON [dbo].[tblEmailQueue]
   AFTER INSERT
AS 
BEGIN
    declare @MailTo nvarchar(max), @MailSubject nvarchar(max), @MailBody nvarchar(max)
    -- Initialize vars
    select @MailTo=MailTo from inserted
    select @MailSubject=MailSubject from inserted
    select @MailBody=MailBody from …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server linked-server msdtc distributed-transactions

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

在链接服务器上使用视图时出错

我有这个查询:

SELECT
    -
FROM -.dbo.tb1
WHERE 
    -IN
    (
        SELECT 
            CASE 
                WHEN EXISTS
                (
                    SELECT * 
                    FROM -.dbo.tb2U1 WITH (NOLOCK)
                    WHERE col1 = '8614'
                )
                THEN
                (
                    SELECT TOP (1)
                        CASE WHEN ISNULL(col2,0) IN (1,2,3,6,8) 
                            THEN '2'
                            ELSE '1'
                        END AS col3
                    FROM -.dbo.tb1U1 WITH (NOLOCK)
                    LEFT join -.dbo.tb3U2 WITH (NOLOCK)
                        ON U1.-= U2.-  
                    WHERE 
                        -= '8614'  
                    ORDER by 
                        -DESC
                )  
                ELSE '3'
            END
    );
Run Code Online (Sandbox Code Playgroud)

当我运行它时-,它没问题。它返回我想要的东西:

SELECT
    -
FROM -.dbo.tb1
WHERE 
    -IN
    (
        SELECT 
            CASE 
                WHEN EXISTS
                (
                    SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server view linked-server

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