Медленный запрос при подключении к связанному серверу - PullRequest
8 голосов
/ 18 ноября 2010

У меня есть этот запрос

UPDATE linkeddb...table SET field1 = 'Y' WHERE column1 = '1234'

Это займет 23 секунды, чтобы выбрать и обновить одну строку

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

Кто-нибудь знает, по какой причине он работает так медленно?

Ответы [ 4 ]

9 голосов
/ 08 декабря 2010

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

/* On remote server */
create procedure UpdateTable
    @field1 char(1),
    @column1 varchar(50)
as
    update table
        set field1 = @field1
        where column1 = @column1
go

/* On local server */
exec linkeddb...UpdateTable @field1 = 'Y', @column1 = '1234'
4 голосов
/ 08 декабря 2010

Если вы ищете , почему , есть возможность из блога Линчи Ши :

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

(Из-за сообщения Линчи это пояснение было добавлено в последнюю документацию BooksOnline SQL).

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

Вот связанный вопрос SO о производительности запросов связанного сервера,Их вывод был следующим: используйте OpenQuery для лучшей производительности.

Обновление: несколько дополнительных превосходных сообщений о производительности связанных серверов из блога Линчи.

2 голосов
/ 18 ноября 2010

Является ли столбец column1 первичным ключом? Возможно нет. Попробуйте выбрать записи для обновления, используя первичный ключ (где PK_field = xxx), в противном случае (иногда?) Все записи будут считаны, чтобы найти PK для записей для обновления.

1 голос
/ 18 ноября 2010

Является ли column1 полем varchar? Поэтому вы заключаете значение 1234 в одинарные кавычки? Или это просто опечатка в вашем вопросе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...