Il valore RID richiesto è maggiore dell'ultimo valore RID della pagina. Impossibile recuperare la riga dalla pagina in base a tale valore: DEPRECATA

Microsoft.SQLServer.2008.Could_not_retrieve_row_from_page_by_RID_because_the_requested_RID_has_a_higher_number_than_the_last_RID_on_the_page_1_5_Rule (Rule)

Knowledge Base article:

Riepilogo

Questo errore si verifica quando il tentativo di recuperare una riga da una pagina di dati specificandone l'ID (o RID, Row ID) ha esisto negativo in quanto l'ID richiesto è un numero maggiore dell'ultimo ID di riga della pagina. Può verificarsi anche durante la normale elaborazione se la pagina foglia di un indice non cluster danneggiato fa riferimento a un valore RID errato o non presente in una pagina di dati.

Cause

Se l'errore si verifica in una tabella di sistema durante un'operazione di sola lettura mentre altri utenti stanno aggiornando le tabelle di sistema con DDL, si tratta probabilmente di un errore 624 temporaneo, il quale non segnala un indice danneggiato. Per assicurarsi che non esistano danni, eseguire DBCC CHECKTABLE senza clausola di correzione.

Soluzioni

La procedura di recupero dipende dal momento in cui si è verificato l'errore. Se il problema persiste, le procedure seguenti potrebbero non essere sufficienti per risolvere il danno all'indice. In questo caso, rivolgersi al servizio di supporto tecnico. Tenere a portata di mano l'output sia dell'istruzione DBCC CHECKTABLE, se si è alla ricerca di possibili danni alla tabella di sistema, che dell'istruzione DBCC CHECKDB.

L'errore si è verificato durante la normale elaborazione

Eseguire DBCC CHECKTABLE con la clausola REPAIR_REBUILD. Se il problema non viene risolto, eliminare e ricreare gli indici interessati.

Importante: se l'esecuzione di DBCC CHECKDB con la clausola REPAIR_REBUILD non è sufficiente per risolvere il problema dell'indice o in caso di dubbio sugli effetti di tale esecuzione sui dati, rivolgersi al servizio di supporto tecnico.

Indice sconosciuto, query sconosciuta

Il modo più rapido per risolvere questo problema consiste nell'eseguire DBCC CHECKDB con la clausola REPAIR_REBUILD. Questa operazione consente di correggere tutti i danni degli indici dell'intero database. Se a causa delle dimensioni elevate del database si desidera evitare l'esecuzione di DBCC CHECKDB, per individuare l'indice da eliminare e ricreare, procedere come indicato di seguito.

Se non si conosce l'indice, ma si conosce la query in cui si è verificato il problema, eseguire la procedura descritta di seguito. Se non si conosce né l'indice né la query, seguire le istruzioni della sezione successiva "Indice e query sconosciuti".

Individuare l'indice da eliminare leggendo l'output Showplan della query in cui si è verificato l'errore. Se si impostano su ON l'opzione SET SHOWPLAN_TEXT e l'opzione SET NOEXEC e quindi si esegue la query, l'output indicherà l'indice non cluster utilizzato dalla query per accedere alla tabella.

Ad esempio:

USE pubs GO SET SHOWPLAN_TEXT ON GO SET NOEXEC ON GO SELECT title FROM titles WHERE title 'Cooking' GO

Di seguito viene fornito il set di risultati:

StmtText----------------SET NOEXEC ON(1 riga interessata)

StmtText----------------SELECT title FROM titles WHERE title 'Cooking' (1 riga interessata)

StmtText-------------|--Index Seek(OBJECT:([pubs].[dbo].[titles].[titleind]), SEEK:([titles].[title] ;[@1]) ORDERED FORWARD) (1 riga interessata)

Impostare SET NOEXEC su OFF e SET SHOWPLAN_TEXT di nuovo su OFF: SET NOEXEC OFF GO SET SHOWPLAN_TEXT OFF GO

Eliminare e ricreare l'indice individuato nel passaggio 1, in questo esempio l'indice titleind).

Indice e query sconosciuti

Se non si conoscono né l'indice né la query, ricompilare tutti gli indici non cluster della tabella nel modo seguente:

Esaminare l'output generato da DBCC CHECKDB quando è stato ottenuto il nome della tabella.

Se l'ID di oggetto è inferiore a 100, non è possibile eliminare e ricreare gli indici. Non proseguire con il passaggio 2 o 3. È necessario ripristinare il database da un backup valido noto.

Se l'ID di oggetto è uguale o maggiore di 100, proseguire con il passaggio 2.

Utilizzare sp_helpindex per ottenere l'elenco di tutti gli indici della tabella, quindi ricompilare tutti gli indici non cluster utilizzando uno dei metodi seguenti:

Eliminare e ricreare ogni indice non cluster della tabella.

Se la tabella include un indice cluster, eliminarlo e ricrearlo. In questo modo tutti gli indici non cluster vengono ricompilati automaticamente. Se la tabella è di grandi dimensioni, è possibile che lo spazio non sia sufficiente per eseguire questa operazione. In genere è necessario uno spazio pari a 1,2 volte le dimensioni della tabella.

Dopo avere ricreato l'indice appropriato, eseguire DBCC CHECKTABLE sulla tabella per assicurarsi che il problema sia stato effettivamente risolto.

Element properties:

TargetMicrosoft.SQLServer.2008.DBEngine
CategoryEventCollection
EnabledFalse
Event_ID624
Event Source$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$
Alert GenerateTrue
Alert SeverityError
Alert PriorityNormal
RemotableTrue
Alert Message
Il valore RID richiesto è maggiore dell'ultimo valore RID della pagina. Impossibile recuperare la riga dalla pagina in base a tale valore.
{0}
Event LogApplication
CommentMom2008ID='{B490F74B-6850-44E0-AB8A-3E86B10D96F2}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}

Member Modules:

ID Module Type TypeId RunAs 
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ DataSource Microsoft.Windows.EventProvider Microsoft.SQLServer.SQLDefaultAccount
GenerateAlert WriteAction System.Health.GenerateAlert Default

Source Code:

<Rule ID="Microsoft.SQLServer.2008.Could_not_retrieve_row_from_page_by_RID_because_the_requested_RID_has_a_higher_number_than_the_last_RID_on_the_page_1_5_Rule" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" Enabled="false" ConfirmDelivery="true" Remotable="true" Comment="Mom2008ID='{B490F74B-6850-44E0-AB8A-3E86B10D96F2}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Windows!Microsoft.Windows.EventProvider" RunAs="SQL!Microsoft.SQLServer.SQLDefaultAccount">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>624</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>2</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2008.Could_not_retrieve_row_from_page_by_RID_because_the_requested_RID_has_a_higher_number_than_the_last_RID_on_the_page_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>