Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Determinar a última linha adicionada quando nenhum índice estiver presente


Não, não há nenhuma função predefinida no SQL Server que retornará a "última linha" de uma tabela.

Por definição, uma tabela é um conjunto não ordenado de linhas. Imagine que você joga um monte de bolinhas de gude em um saco. Agora abra o saco e pergunte a outra pessoa qual bola de gude entrou primeiro ou por último. Agora jogue todos eles no chão, e quando outra pessoa entrar na sala, pergunte a ela qual atingiu o chão primeiro ou por último. Você não pode fazê-lo, porque não há informações adicionais que indiquem nada sobre a ordem em que caíram.

O mesmo vale para uma tabela no SQL Server. A menos que você adicione uma coluna IDENTITY, ou uma coluna de data e hora, ou um gatilho, ou use uma funcionalidade externa, como controle de alterações, CDC, auditoria etc., não há como o SQL Server informar qual linha foi inserida por último. Você pode pensar que apenas selecionando da tabela sem uma cláusula order by parece como se estivesse retornando dados na ordem certa, isso é pura coincidência. Aqui está um exemplo:
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, então, por padrão, isso parece estar bem. Resultados:
ID    n
--    -------
1     Sparky
2     Aaron
3     Norbert -- < yes, this is right

No entanto, vamos fazer uma alteração na tabela que seu aplicativo ou qualquer outra coisa que dependa da ordenação acima não terá ideia:
CREATE NONCLUSTERED INDEX x ON dbo.floobat(n);

SELECT ID, n FROM dbo.floobat;

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

Você deve se lembrar disso:se você não incluir uma cláusula ORDER BY, você está dizendo SQL Server que você não se importa com a ordem. Portanto, ele encontrará a maneira mais eficiente de retornar os dados, e isso pode levar a diferentes ordenações observadas. Adicionar o índice acima deu ao SQL Server um caminho de acesso melhor para recuperar os dados. Ele ainda usava uma varredura, mas esse índice era muito mais fino que o índice clusterizado (que só podia caber duas linhas em uma página).

Mesmo sem o índice, você provavelmente não obteria os resultados esperados, pois é complicado pelo fato de que seu Cust_ID coluna não está sendo inserida em ordem crescente. Então, se você inserir 5 e depois de 2 , selecionar sem ORDER BY resultará em 2 então 5 (assumindo que não existe um índice melhor).

Outras coisas além de criar (ou descartar, alterar ou reconstruir) um índice podem causar o mesmo tipo de alteração no comportamento de ordenação. Aplique um service pack, CU ou hotfix; esvaziando o cache do procedimento; usando várias opções de RECOMPILE; atualização de estatísticas; reiniciar o servidor; adicionar ou desabilitar um sinalizador de rastreamento; alterar as opções de uma opção de servidor; mover o banco de dados para um servidor diferente; etc etc.

Portanto, se você quiser rastrear essas informações, precisará adicioná-las de alguma forma, como várias outras respostas abordaram.