我在 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 1 --linked--> SQL-Server 2 --linked-> SQL-Server 3
Run Code Online (Sandbox Code Playgroud)
问题是我可以通过 SQL Server 2 从 SQL Server 1 查询 SQL Server 3 吗?
不幸的是,我有几个限制:
我有一个查询,它会向我报告添加记录所用的时间。我还在此查询中跟踪添加到数据库中的图像的大小。从我所见,它看起来像是从链接服务器返回整个图像,然后计算大小。有没有一种简单的方法可以让我在链接的另一侧计算大小,以便更快地返回?
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 中,我可以创建一个视图,该视图是使用链接服务器位于完全不同服务器中的两个表之间的连接。如果我将其中一台服务器从 SQL Server 更改为 Oracle,我还能这样做吗?
我需要连接表在 Oracle 中
oracle sql-server sql-server-2008-r2 linked-server oracle-12c
您好,感谢您的光临。我是一个偶然的 DBA,正在寻找以正确方式创建链接服务器的一些指导。MS 提供了数据类型的完整描述以及 sp_addlinkedserver、sp_addlinkedsrvlogin 和 sp_serveroption 的所有各种参数的描述,但没有关于如何将各种选项对齐为给定情况的最佳实践的指导。
我有其他 DBA 的例子,他们只是使用了“sa”密码,但我的研究表明我应该使用针对他们的链接服务器用途量身定制的登录。问题是我到目前为止无法找到正确的组合和顺序(操作顺序)来正确创建所有部件和部件,从而导致链接服务器允许两台服务器之间进行有限的通信。
目标:在源服务器之间创建一个链接服务器,这将允许来自源服务器的作业步骤检查某些条件,如果为 TRUE,则在目标服务器上调用 sp_start_job。...仅此而已。
根据建议,我在源和目标上创建了两个相同名称/密码的 SQL 身份验证登录,两者都具有有限的“公共”权限。
我创建了链接服务器,试图将本地登录映射到远程登录(想想如果我做到了,我会仔细修改目标登录的权限以找到允许它执行 sp_start_job 的权限)。
但到目前为止,我唯一的奖励是一系列各种类型的失败通知。
有大量在线文档解释了每个不同的 proc/param 的作用,但我很难找到某种概述来解释 procs/params 的组合如何导致不同的预期结果。
我希望得到一些有用的建议,参考一些“尚未发现”的教程,或者甚至是关于如何实现我的目标和培养一点自尊的分步说明。(到目前为止,这项任务除了挫伤我的自尊心之外什么也没做!)
感谢您的时间。
为什么在通过链接服务器更新时使用 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)
该表确实有一个针对帐户列的非聚集唯一索引,但 ISNULL() 未用于帐户列并且该索引应该仍然可用。我在这里错过了什么吗?
有没有办法知道我的 SQL Server 实例上的特定数据库是否正在通过链接服务器查询?
我在通过链接服务器从同一个表进行并发读取时收到此错误。超时设置没问题。发生此错误时,我也开始收到相同查询的以下错误:
“事务(进程 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)
谢谢,卡努
这可能与 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
我有这个查询:
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) linked-server ×10
sql-server ×10
deadlock ×1
msdtc ×1
oracle ×1
oracle-12c ×1
trigger ×1
view ×1