为什么透过链接服务器写入,速度会很慢
原因是 通过链接服务器写入时,是逐行写入数据库,逐行insert,触发触发器等等
,写入的数据有几行,就触发几次触发器,inserted,deleted等系统表每次只有一行数据
如果是同一台服务器插入的时,一个sql命令是批量插入的,只触发一个触发器,inserted,deleted会有多行数据
测试用例:
建表:
CREATE TABLE [dbo].[TEST_BATINSERT](
[PLUCODE] [varchar](20) NULL,
[SCANCODE] [varchar](20) NULL
) ON [PRIMARY]
建触发器:
CREATE
TRIGGER
[dbo]
.
TEST_BATINSERT_INSERT
ON
[dbo]
.
[TEST_BATINSERT]
FOR
INSERT
AS
BEGIN
IF
UPDATE
(
plucode
)
BEGIN
IF
(
select
len
(
ltrim
(
rtrim
(
plucode
)))
from
inserted
)
>
2--这种写法当isnerted只有一行数据时,可以执行通过,有多行数据时,语法不正确,会报错
BEGIN
IF
isnumeric
((
select
ltrim
(
rtrim
(
plucode
))
from
inserted
))
=
1
BEGIN
SELECT
1
END
END
END
END
测试语句
语句1
INSERT
TEST_BATINSERT
(
PLUCODE
,
SCANCODE
)
SELECT
TOP
1 PLUCODE
,
SCANCODE
FROM TEST_BATINSERT_1
测试结果,没问题,说明触发器中的inserted语句只有一行数据
语句2
INSERT
TEST_BATINSERT
(
PLUCODE
,
SCANCODE
)
SELECT
TOP
2 PLUCODE
,
SCANCODE
FROM TEST_BATINSERT_1
测试结果:不正常。说明触发器中的inserted语句有多行数据
在另外一台服务器上执行:
语句1
INSERT
[LNKSER]
.
LNKDB
.
dbo
.
TEST_BATINSERT
(
PLUCODE
,
SCANCODE
)
SELECT
TOP
1 productNo
,
productNo
FROM
[TEST_BATINSERT_1]
测试结果,没问题,说明触发器中的inserted语句只有一行数据
语句2
INSERT [LNKSER]. LNKDB
.
dbo
.
TEST_BATINSERT
(
PLUCODE
,
SCANCODE
)
SELECT
TOP
2 productNo
,
productNo
FROM TEST_BATINSERT_1
测试结果,没问题,说明触发器中的inserted语句只有一行数据
结论:如果要进行跨服务器交换数据,尽量用链接服务器进行读操作,避免进行写和删的操作。