Производительность межбазы данных (между связанными серверами) - PullRequest
4 голосов
/ 26 мая 2010

У меня есть импорт между 2 связанными серверами. Я получил данные из многократного объединения в таблицу на моей стороне.

Текущий запрос выглядит примерно так:

 select a.*
 from db1.dbo.tbl1 a
      inner join db1.dbo.tbl2 on ...
      inner join db1.dbo.tbl3 on ...
      inner join db1.dbo.tbl4 on ...
      inner join db2.dbo.myside on ...

db1 = связанный сервер

db2 = моя собственная база данных

После этого я использую вставку в + select, чтобы добавить эти данные в мою таблицу, которая находится в db2. (обычно несколько сотен записей - импорт выполняется раз в минуту)

Мой вопрос связан с производительностью. Таблицы на связанном сервере (tbl1, tbl2, tbl3, tbl4) представляют собой огромные таблицы с миллионами записей, что замедляет процесс импорта. Мне сказали, что если я выполню соединение на «другой» стороне (db1-связанный сервер), например, в хранимой процедуре, то, даже если запрос выглядит одинаково, он будет выполняться быстрее. Это правильно? Это довольно сложно проверить. Обратите внимание, что объединение содержит таблицу из моей базы данных.

Также. Есть ли другие "хитрости", которые я мог бы использовать, чтобы сделать это быстрее? Спасибо

Ответы [ 3 ]

2 голосов
/ 28 мая 2010

Это действительно зависит от того, что на самом деле делает ваш запрос. Вы можете использовать «удаленный» совет для объединений, чтобы объединение происходило на связанном сервере. i.e.:

select a.*  
 from db1.dbo.tbl1 a   
      inner remote join db1.dbo.tbl2 on ...  
      inner remote join db1.dbo.tbl3 on ...  
      inner remote join db1.dbo.tbl4 on ...  
      inner join db2.dbo.myside on ... 

(я предполагаю, что вы оставили сервер из вышеперечисленного, и что все ссылки "db1." На самом деле являются "connectedserver.db1".)

Если вы можете выполнять большую часть работы только с информацией на связанном сервере, вы можете использовать OPENQUERY, чтобы ускорить процесс. i.e.:

select a.*  
 from OPENQUERY(db1, 'SELECT a.* from db1.dbo.tbl1 a   
      inner join db1.dbo.tbl2 on ...  
      inner join db1.dbo.tbl3 on ...  
      inner join db1.dbo.tbl4 on ... ') a  
      inner join db2.dbo.myside on ... 

Но лучший способ ускорить его - это иметь управляющую таблицу на связанном сервере, чтобы контролировать, что возвращать, но опять же, это зависит от вашего фактического запроса, того, что он делает, и каких разрешений у вас на связанном сервере .

1 голос
/ 26 мая 2010

Хранимые процедуры кэшируются, поэтому при первом запуске хранимой процедуры это займет некоторое время. Все последующие вызовы этой хранимой процедуры будут выполняться намного быстрее. Вы можете увидеть влияние на производительность, включив статистику выполнения в вашу SSMS.

Чтобы улучшить производительность соединения, убедитесь, что у вас есть индексы.

Обратите внимание, что межсерверные вставки опасны, поскольку вы полагаетесь на сеть. Я также не уверен, можно ли использовать транзакции в этом сценарии. Если нет, то это еще одна проблема.

Я видел сценарий, в котором временная база данных не справлялась с такой вставкой, и исправление было использовать курсор. Это было намного медленнее, но более надежно для этого сценария.

1 голос
/ 26 мая 2010

Правильно разместить хранимую процедуру на db1 для повышения производительности. Таким образом, по каналу требуется меньше данных, поскольку в соединениях фильтруется много данных.

Если данные на другой стороне статичны, почему бы не поместить их в материализованное представление? Таким образом, вам нужно обновлять данные только один раз в день, а не каждый раз, когда выполняется запрос.

...