SQL Server 2008, Sybase - большие запросы на выборку по низкой пропускной способности - PullRequest
1 голос
/ 14 февраля 2011

Мне нужно вывести большое количество данных из различных таблиц по линии с очень низкой пропускной способностью. Мне нужно свести к минимуму объем данных, которые отправляются тоже и сюда.

На этой стороне находится база данных Sybase, на этой стороне SQL Server 2008.

Мне нужно извлечь все таблицы из базы данных Sybase, которые связаны с этим офисом. Допустим, у меня есть следующие таблицы в качестве примера:

Farm 
Tree 
Branch 
etc.

(на одной ферме много деревьев, на одном дереве много ветвей и т. Д.)

Допустим, в таблице «Ферма» есть поле с именем «CountryID», и мне нужны только данные, для которых CountryID = 12. Фактические структуры таблиц, которые я рассматриваю, очень сложны (и я также не очень хорошо с ними знаком), поэтому я хочу постараться сделать запросы простыми.

Итак, я думаю о настройке серии представлений:

CREATE VIEW vw_Farm AS 
SELECT * from Farm where CountryID=12

CREATE VIEW vw_Tree AS 
SELECT * from Tree where FarmID in (SELECT FarmID FROM vw_Farm)

CREATE VIEW vw_Branch AS 
SELECT * from Tree where BranchID in (SELECT BranchID FROM vw_Branch)

и т.д.

Чтобы затем перенаправить фактические данные, я бы сделал:

SELECT * from vw_Farm into localDb.Farm
SELECT * from vw_Tree into localDb.Tree
SELECT * from vw_Branch into localDb.Branch

и т.д.

Достаточно просто настроить. Мне интересно, как это будет работать, хотя? Будет ли он выполнять все операторы SELECT на стороне Sybase, а затем просто отправит обратно результат? Кроме того, поскольку это будет итеративный процесс, возможно ли индексировать представления для последующих вызовов?

Любые другие предложения по оптимизации также приветствуются!

Спасибо
Karl

РЕДАКТИРОВАТЬ: просто чтобы уточнить, представления будут настроены в SQL Server. Я использую связанный сервер, использующий Sybase ASE для настройки этих представлений. Что меня особенно беспокоит, так это то, будет ли тот факт, что представление находится в SQL Server на этой стороне, а не на Sybase на этой стороне, будет означать, что для каждой итерации данные из предыдущего представления будут переданы в SQL Server в первую очередь перед вычислениями быть казненным. Я хочу, чтобы Sybase выполнил все проверки и просто передал результаты.

1 Ответ

2 голосов
/ 15 февраля 2011

Трудно быть уверенным без тестирования, но мой несколько уместный опыт (использование связанных серверов с платформами, отличными от Sybase и в SQL Server 2005) заключался в использовании подзапросов (таких как код для vw_Tree и vw_Branch) более или менее гарантирует, что SQL Server извлечет все данные для внешней таблицы в локальную временную таблицу, а затем сопоставит ее с результатами внутреннего запроса.

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

Если вы хотите, чтобы работа на сервере Sybase была выполнена, лучше всего написать код (это могут быть представления или хранимые процедуры) на стороне Sybase и ссылаться на них из SQL Server.

Соединения со связанным сервером, по моему опыту, не особенно устойчивы в нестабильных сетях. Если он доступен, вы можете рассмотреть возможность использования служб Integration Services, а не запросов связанных серверов, но даже это может быть не намного лучше. Возможно, вам придется подумать о том, чтобы вернуться к перемещению текстовых файлов с robocopy и bcp .

...