Domanda

Ho questa domanda

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

Questo richiede 23 secondi per selezionare e riga aggiornamento uno

Ma se io uso openquery (che io non voglio), allora ci vuole solo mezzo secondo.

Il motivo per cui non voglio utilizzare OPENQUERY è così posso aggiungere parametri alla mia domanda in modo sicuro ed essere al sicuro dalle iniezioni SQL.

Qualcuno sa di qualsiasi motivo per essere in esecuzione così lentamente?

È stato utile?

Soluzione

Ecco un pensiero come alternativa. Creare una stored procedure sul server remoto per eseguire l'aggiornamento e quindi chiamare tale procedura dal vostro istanza locale.

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

Altri suggerimenti

Se siete alla ricerca di perché , ecco una possibilità da di Linchi Shea Blog :

  

Per creare i migliori piani di query quando   si utilizza una tabella su una collegata   del server, il processore di query deve avere   statistiche di distribuzione di dati dal   server collegato. Gli utenti che hanno limitato   autorizzazioni per le colonne della   tavolo potrebbe non avere sufficienti   i permessi per ottenere tutte le informazioni utili   statistiche, e potrebbero ricevere Aless   efficiente piano di query e l'esperienza   scarso rendimento. Se il collegato   serveris un'istanza di SQL Server, per   ottenere tutte le statistiche disponibili, il   utente deve essere proprietario della tabella o membro   del ruolo del server sysadmin, il   ruolo del database db_ownerfixed, o la   db_ddladmin ruolo del database fissata sul   LinkedServer.

(A causa del post di Linchi Tale chiarimento è stato aggiunto alla più recente documentazione BooksOnline SQL).

In altre parole, se il server collegato è configurato con un utente che dispone di autorizzazioni limitate, quindi SQL non può recuperare le statistiche precise per la tavola e potrebbe scegliere un metodo povero per l'esecuzione di una query, tra cui il recupero di tutte le righe.

Ecco un correlata domanda SO sulle prestazioni di query server collegato. La loro conclusione è stata: l'uso ApriQuery per le migliori prestazioni

.

Aggiornamento: alcuni ulteriori posti eccellenti su le prestazioni del server collegato dal blog di Linchi.

è la chiave primaria column1? Probabilmente no. Provate a selezionare i record per l'aggiornamento utilizzando la chiave primaria (dove PK_field = xxx), altrimenti (a volte?) Tutti i record saranno letti per trovare PK per i record da aggiornare.

E 'column1 un campo varchar? E 'questo il motivo per cui stai circonda il valore con i contrassegni 1234 single-virgolette? O è semplicemente un errore di battitura nella tua domanda?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top