2015-01-30 3 views
8

Una query che uso da anni ha improvvisamente iniziato a generare un errore strano. Quando ho apportato una modifica estetica alla query (1 + x anziché x + 1), l'errore non si verifica più. Il proc memorizzato che si sta lamentando non esiste più nemmeno sul server!Perché questo errore di sybase va via con qualsiasi modifica alla query?

Sono molto curioso se qualcuno ha qualche idea su quale sia il problema e perché questo "cambiamento" lo risolva?

La query prima:

UPDATE SOME_DB..JOB_QUEUE 
SET ERROR_COUNT = ERROR_COUNT + 1, 
    JOB_START_TIME = '{1}' 
WHERE JOB_ID = {0} 

La query dopo:

UPDATE SOME_DB..JOB_QUEUE 
SET ERROR_COUNT = 1 + ERROR_COUNT, 
    JOB_START_TIME = '{1}' 
WHERE JOB_ID = {0} 

L'errore getta:

Sybase.Data.AseClient.AseException: Procedure sp_net_dblatency expects parameter @heartbeat, which was not supplied. 

Mi chiedevo se qualcuno ha qualche idea che cosa sta succedendo Qui?

Modifica. Ecco il proc memorizzato.

create procedure sp_net_dblatency 
    @heartbeat datetime 
as 
    update DATABASE_1234..LATENCY set [email protected], END_UTC_TIME=getutcdate() where DATABASE_NAME=db_name() 
    if (@@ROWCOUNT = 0) 
     insert DATABASE_1234..LATENCY (DATABASE_NAME, START_UTC_TIME, END_UTC_TIME) values (db_name(), @heartbeat, getutcdate()) 
+0

Forse la tua sp è stata compromessa e un parametro @hearbeat inserito nel codice. La tua semplice correzione ha causato il suo ri-complimento. –

+0

Lo sp usato per esistere e @heartbeat era un parametro. Ma lo SP è stato cancellato mesi fa. – anthonybell

+0

Sono stati rimossi anche tutti i sinonimi associati alla sp_netiq_dblatency? – xQbert

risposta

3

L'ottimizzatore di Sybase può aver memorizzato nella cache un piano che fa riferimento erroneamente alla procedura eliminata. Presta attenzione alla cronologia e memorizza nella cache tutti i tipi di statistiche e genera piani basati su molte informazioni memorizzate nella cache. Occasionalmente, ho scoperto che può iniziare a generare piani molto cattivi su query molto grandi. L'ho incontrato poche volte e segnalato come un bug a Sybase, ma non sono stati in grado di riprodurlo (e non sono stato in grado di riprodurlo in modo affidabile).

La soluzione alternativa consiste nel modificare leggermente la query o aggiungere un'istruzione del piano per sovrascrivere i piani errati. Le query con istruzioni PLAN utilizzeranno il piano fornito anziché generarne uno. Spero possa aiutare.

Problemi correlati