Pergunta

Eu tenho esta consulta

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

Isso leva 23 segundos para selecionar e atualizar uma linha

Mas se eu usar o OpenQuery (o que não quero), leva apenas meio segundo.

A razão pela qual não quero usar o OpenQuery é para que eu possa adicionar parâmetros à minha consulta com segurança e estar a salvo das injeções de SQL.

Alguém sabe de algum motivo para que esteja funcionando tão devagar?

Foi útil?

Solução

Aqui está um pensamento como uma alternativa. Crie um procedimento armazenado no servidor remoto para executar a atualização e, em seguida, chame esse procedimento da sua instância local.

/* 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'

Outras dicas

Se você está procurando o Por quê, aqui está uma possibilidade de Blog do Linchi Shea:

Para criar os melhores planos de consulta ao usar uma tabela em um servidor vinculado, o processador de consulta deve ter estatísticas de distribuição de dados do servidor vinculado. Os usuários que têm permissões limitadas em quaisquer colunas da tabela podem não ter permissões suficientes para obter todas as estatísticas úteis e podem receber um plano de consulta eficiente e experimentar um desempenho ruim. Se o servidor vinculado é uma instância do SQL Server, para obter todas as estatísticas disponíveis, o usuário deverá possuir a tabela ou ser um membro da função de servidor fixo SYSADmin, a função de banco de dados DB_OWNERFIXED ou a função de banco de dados fixa db_ddladmin no LinkedServer.

(Por causa da publicação de Linchi, esse esclarecimento foi adicionado à mais recente documentação do Booksonline SQL).

Em outras palavras, se o servidor vinculado estiver configurado com um usuário com permissões limitadas, o SQL não poderá recuperar estatísticas precisas para a tabela e poderá escolher um método ruim para executar uma consulta, incluindo a recuperação de todas as linhas.

Aqui está um Related So Pergunta sobre o desempenho da consulta do servidor vinculado. A conclusão deles foi: use o OpenQuery para melhor desempenho.

ATUALIZAÇÃO: Alguns Excelentes postagens adicionais Sobre o desempenho do servidor vinculado no blog de Linchi.

A coluna 1 é a chave primária? Provavelmente não. Tente selecionar registros para atualização usando a chave primária (onde pk_field = xxx), caso contrário (às vezes?) Todos os registros serão lidos para encontrar o PK para que os registros sejam atualizados.

A coluna 1 é um campo Varchar? É por isso que você está em torno do valor 1234 com marcas de citação única? Ou isso é simplesmente um erro de digitação em sua pergunta?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top