query lente durante la connessione al server collegato
-
26-09-2019 - |
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?
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?