Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Определяне на последния добавен ред, когато няма индекс

Не, в SQL Server няма предварително дефинирана функция, която да върне „последния ред“ на таблица.

По дефиниция таблицата е неподреден набор от редове. Представете си, че хвърляте куп топчета в торба. Сега отворете чантата и попитайте някой друг кой мрамор е влязъл първи или последен. Сега ги хвърлете всички на пода и когато някой друг влезе в стаята, попитайте го кой удари пода пръв или последен. Не можете да го направите, защото няма допълнителна информация, която да показва нещо за реда, в който са паднали.

Същото важи и за таблица в SQL Server. Освен ако не добавите колона IDENTITY, колона за дата и час, или тригер, или използвате външна функционалност като проследяване на промените, CDC, одит и т.н., няма начин SQL Server да ви каже кой ред е вмъкнат последен. Може да помислите че просто избиране от таблицата без подреждане по клауза изглежда тъй като връща данни в правилния ред, това е чисто съвпадение. Ето един пример:

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;

Добре, така че по подразбиране това изглежда е наред. Резултати:

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

Нека обаче направим промяна в таблицата, за която вашето приложение или каквото и да е друго, разчитащо на горния ред, няма да има представа:

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

SELECT ID, n FROM dbo.floobat;

ъъ оо! Резултати:

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

Трябва да запомните това:ако не включите клауза ORDER BY, вие казвате SQL Server, който не ви е грижа за реда. Така че ще намери най-ефективния начин за връщане на данните и това може да доведе до различно наблюдавано подреждане. Добавянето на индекса по-горе даде на SQL Server по-добър път за достъп за извличане на данните. Той все още използваше сканиране, но този индекс беше много по-тънък от групирания индекс (който можеше да побере само два реда на страница).

Дори и без индекса вероятно няма да получите резултатите, които очаквате, тъй като той е усложнен от факта, че вашият Cust_ID колона не се вмъква във възходящ ред. Така че, ако вмъкнете 5 и след 2 , избирането без ORDER BY всъщност ще доведе до 2 след това 5 (ако приемем, че не съществува по-добър индекс).

Други неща, различни от създаването (или премахването, или промяната, или повторното изграждане) на индекс, могат да причинят същия вид промяна в поведението на подреждане. Прилагане на сервизен пакет, CU или актуална корекция; изчистване на кеша на процедурите; използване на различни RECOMPILE опции; актуализиране на статистика; рестартиране на сървъра; добавяне или дезактивиране на флаг за проследяване; промяна на опции за сървърни опции; преместване на базата данни на друг сървър; и т.н. и т.н.

Така че, ако искате да проследите тази информация, ще трябва да я добавите сами по някакъв начин, както се споменава в няколко от другите отговори.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Може ли някой да обясни разликата между две заявки?

  2. Не може да се свърже с SQLServer база данни в Java приложение

  3. Разберете защо имейл не успя да се изпрати в SQL Server (T-SQL)

  4. Какви разрешения са необходими за масово вмъкване в SQL Server от мрежов дял с Windows удостоверяване?

  5. Състояние UNION ALL спрямо OR в заявка за sql сървър