Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Determina l'ultima riga aggiunta quando non è presente alcun indice

No, non esiste una funzione predefinita in SQL Server che restituirà "l'ultima riga" di una tabella.

Per definizione, una tabella è un insieme di righe non ordinato. Immagina di lanciare un mucchio di biglie in una borsa. Ora apri la borsa e chiedi a qualcun altro quale biglia è entrata per prima o per ultima. Ora gettali tutti sul pavimento e quando qualcun altro entra nella stanza, chiedi loro quale ha colpito il pavimento per primo o per ultimo. Non puoi farlo, perché non ci sono informazioni aggiuntive che indichino nulla sull'ordine in cui sono caduti.

Lo stesso vale per una tabella in SQL Server. A meno che non si aggiunga una colonna IDENTITY, una colonna datetime o un trigger o si utilizzino funzionalità esterne come rilevamento delle modifiche, CDC, controllo e così via, SQL Server non ha modo di indicare quale riga è stata inserita per ultima. Potresti pensare che solo selezionando dalla tabella senza una clausola order by sembra come se restituisse i dati nell'ordine giusto, questa è una pura coincidenza. Ecco un esempio:

CREATE TABLE dbo.floobat
(
  ID INT PRIMARY KEY, 
  n VARCHAR(16), 
  x CHAR(4000) NOT NULL DEFAULT ''
);

INSERT dbo.floobat(ID,n) VALUES(1,'Sparky');
INSERT dbo.floobat(ID,n) VALUES(2,'Aaron');
INSERT dbo.floobat(ID,n) VALUES(3,'Norbert'); -- <-- inserted last

SELECT ID, n FROM dbo.floobat;

Ok, quindi per impostazione predefinita, questo sembra andare bene. Risultati:

ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

Tuttavia, apportiamo una modifica alla tabella di cui la tua applicazione o qualsiasi altra cosa si basa sull'ordinamento sopra non avrà idea:

CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

Uh Oh! Risultati:

ID    n
--    -------
2     Aaron
3     Norbert
1     Sparky -- < oops, this is no longer right

Devi ricordare questo:se non includi una clausola ORDER BY, stai dicendo SQL Server di cui non ti interessa ordinare. Quindi troverà il modo più efficiente per restituire i dati e ciò potrebbe portare a un diverso ordinamento osservato. L'aggiunta dell'indice sopra ha fornito a SQL Server un percorso di accesso migliore per il recupero dei dati. Utilizzava ancora una scansione, ma quell'indice era molto più sottile dell'indice cluster (che poteva contenere solo due righe su una pagina).

Anche senza l'indice, probabilmente non otterresti i risultati che ti aspetti, poiché è contorto dal fatto che il tuo Cust_ID la colonna non viene inserita in ordine crescente. Quindi se inserisci 5 e di 2 , la selezione senza ORDER BY risulterà effettivamente in 2 quindi 5 (supponendo che non esista un indice migliore).

Altre cose diverse dalla creazione (o dall'eliminazione, dalla modifica o dalla ricostruzione) di un indice possono causare lo stesso tipo di modifica nel comportamento dell'ordine. Applicare un service pack, CU o hotfix; svuotare la cache delle procedure; utilizzando varie opzioni RICAMBIA; aggiornamento delle statistiche; riavviare il server; aggiungere o disabilitare un flag di traccia; modificare le opzioni di un'opzione del server; spostare il database su un server diverso; ecc. ecc.

Quindi, se vuoi tenere traccia di queste informazioni, dovrai aggiungerle tu stesso in qualche modo, poiché molte delle altre risposte hanno affrontato.