I have a SELECT
query to a linked server. It looks similar to this
SELECT @Var1 = (SELECT COL1
FROM [LinkedServer].[dbo].[TableA]
WHERE <Condition1>),
@Var2 = (SELECT COL1
FROM [LinkedServer].[dbo].[TableA]
WHERE <Condition2>),
@Var3 = (SELECT COL1
FROM [LinkedServer].[dbo].[TableA]
WHERE <Condition3>),
...
FROM [LinkedServer].[dbo].[TableB]
WHERE <Condition4>
So there are multiples SELECT
statements to the same table in this linked server. Is there a way to improve the performance? Is copying TableA
to a temp table in local database server a bad idea? Size of TableA
is large.
[UPDATE1]: Updated my query
SELECT VAR_1,
(SELECT SOL
FROM [LinkedServer].[dbo].[TableSol]
WHERE COL_1 = [TableA].COL_1
AND COL_2 = [TableA].COL_2
AND COL_A = [TableA].COL_A) AS VAR_2,
(SELECT SOL
FROM [LinkedServer].[dbo].[TableSol]
WHERE COL_1 = [TableA].COL_3
AND COL_2 = [TableA].COL_4
AND COL_A = [TableA].COL_A) AS VAR_3,
(SELECT SOL
FROM [LinkedServer].[dbo].[TableSol]
WHERE COL_1 = [TableA].COL_5
AND COL_2 = [TableA].COL_6
AND COL_A = [TableA].COL_A) AS VAR_4,
FROM [LinkedServer].[dbo].[TableA]
INNER JOIN [LinkedServer].[dbo].[TableB] ON [TableA].COL_10 = [TableB].COL_11
It took me 15 secs to run the above query. I changed to use crosstab like below:
SELECT VAR_1
SOL.VAR_2,
SOL.VAR_3,
SOL.VAR_4,
FROM [LinkedServer].[dbo].[TableA]
INNER JOIN [LinkedServer].[dbo].[TableB] ON [TableA].COL_10 = [TableB].COL_11
CROSS APPLY (SELECT
CASE
WHEN COL_1 = [TableA].COL_1 AND COL_2 = [TableA].COL_2 THEN SOL
ELSE ''
END AS VAR_2,
CASE
WHEN COL_1 = [TableA].COL_3 AND COL_2 = [TableA].COL_4 THEN SOL
ELSE ''
END AS VAR_3,
CASE
WHEN COL_1 = [TableA].COL_5 AND COL_2 = [TableA].COL_6 THEN SOL
ELSE ''
END AS VAR_4
FROM [LinkedServer].[dbo].[TableSol]
WHERE COL_A = [TableA].COL_A
) AS SOL (VAR_2, VAR_3, VAR_4)
But it took me much longer (> 10 mins and I just stop because it did not finish).
Did I miss something?
Best Answer
The query can be rewritten with a crosstab, in order to avoid hitting TableA multiple times:
This should make it faster. If it doesn't, please post the execution plan, so that we can investigate it further.