sql >> Databáze >  >> RDS >> Sqlserver

Určit poslední přidaný řádek, když není přítomen žádný index

Ne, v SQL Serveru není žádná předdefinovaná funkce, která vrátí "poslední řádek" tabulky.

Podle definice je tabulka neuspořádaná sada řádků. Představte si, že hodíte hromadu kuliček do pytle. Nyní otevřete pytel a zeptejte se někoho jiného, ​​který mramor šel dovnitř jako první nebo jako poslední. Nyní je všechny hoďte na podlahu, a když do místnosti přijde někdo další, zeptejte se jich, kdo udeřil na podlahu jako první nebo jako poslední. Nemůžete to udělat, protože neexistují žádné další informace, které by naznačovaly něco o pořadí, ve kterém padly.

Totéž platí pro tabulku v SQL Server. Pokud nepřidáte sloupec IDENTITY nebo sloupec datetime nebo trigger nebo nepoužijete externí funkce, jako je sledování změn, CDC, auditování atd., SQL Server vám nemůže sdělit, který řádek byl vložen jako poslední. Můžete si myslet že pouhý výběr z tabulky bez pořadí podle klauzule vypadá jako že vrací data ve správném pořadí, je to čistá náhoda. Zde je příklad:

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, takže ve výchozím nastavení se to zdá být v pořádku. Výsledky:

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

Udělejme však změnu v tabulce, o které vaše aplikace nebo cokoliv jiného, ​​co závisí na výše uvedeném uspořádání, nebude mít ponětí:

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

SELECT ID, n FROM dbo.floobat;

A jé! Výsledky:

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

Musíte si zapamatovat toto:pokud neuvedete klauzuli ORDER BY, říkáte to SQL Server, na kterém vám nezáleží. Bude tedy hledat nejefektivnější způsob, jak vrátit data, což by mohlo vést k odlišnému pozorovanému uspořádání. Přidání výše uvedeného indexu poskytlo serveru SQL Server lepší přístupovou cestu k načítání dat. Stále používal skenování, ale tento index byl mnohem tenčí než seskupený index (na který se vešly pouze dva řádky na stránku).

I bez indexu byste pravděpodobně nedosáhli očekávaných výsledků, protože je to spletité tím, že vaše Cust_ID sloupec se nevkládá vzestupně. Pokud tedy vložíte 5 a než 2 , výběr bez ORDER BY ve skutečnosti povede k 2 pak 5 (za předpokladu, že neexistuje lepší index).

Jiné věci než vytvoření (nebo zrušení, změna nebo přebudování) indexu mohou způsobit stejný druh změny v chování řazení. Použít aktualizaci service pack, CU nebo opravu hotfix; vyprázdnění mezipaměti procedur; pomocí různých možností PŘEKOMPILOVÁNÍ; aktualizace statistik; restartování serveru; přidání nebo zakázání příznaku trasování; změna možností volby serveru; přesunutí databáze na jiný server; atd. atd.

Pokud tedy chcete tyto informace sledovat, budete je muset nějakým způsobem přidat sami, jak se zabývalo několik dalších odpovědí.



  1. Porovnávání řetězců v PHP stejným způsobem jako MySQL

  2. MySql vloží binární data do db bez chyb

  3. Jak definovat celé číslo bez znaménka v SQLAlchemy

  4. Přepnutí oddílu na SQL Server (T-SQL)