Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xác định hàng mới nhất được thêm vào khi không có chỉ mục nào

Không, không có hàm xác định trước nào trong SQL Server sẽ trả về "hàng cuối cùng" của bảng.

Theo định nghĩa, bảng là một tập hợp các hàng không có thứ tự. Hãy tưởng tượng bạn ném một loạt các viên bi vào một chiếc túi. Bây giờ hãy mở túi và hỏi người khác xem viên bi nào đã đi vào đầu tiên hay cuối cùng. Bây giờ, hãy ném tất cả chúng xuống sàn và khi có người khác vào phòng, hãy hỏi họ xem cái nào rơi xuống sàn đầu tiên hay cuối cùng. Bạn không thể làm điều đó, bởi vì không có thông tin bổ sung cho biết bất cứ điều gì về thứ tự mà họ đã giảm.

Điều này cũng đúng với một bảng trong SQL Server. Trừ khi bạn thêm cột IDENTITY, hoặc cột ngày giờ hoặc trình kích hoạt hoặc sử dụng chức năng bên ngoài như theo dõi thay đổi, CDC, kiểm tra, v.v., không có cách nào để SQL Server cho bạn biết hàng nào được chèn sau cùng. Bạn có thể nghĩ rằng mà chỉ cần chọn từ bảng mà không có thứ tự theo mệnh đề trông giống như nó đang trả về dữ liệu theo đúng thứ tự, đây hoàn toàn là sự trùng hợp ngẫu nhiên. Đây là một ví dụ:

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, theo mặc định, điều này có vẻ ổn. Kết quả:

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

Tuy nhiên, hãy thực hiện một thay đổi đối với bảng mà ứng dụng của bạn hoặc bất kỳ thứ gì khác dựa trên thứ tự ở trên sẽ không có ý tưởng về:

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

SELECT ID, n FROM dbo.floobat;

Ồ ồ! Kết quả:

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

Bạn phải nhớ điều này:nếu bạn không bao gồm mệnh đề ORDER BY, bạn đang nói với SQL Server mà bạn không quan tâm đến thứ tự. Vì vậy, nó sẽ tìm ra cách hiệu quả nhất để trả lại dữ liệu và điều đó có thể dẫn đến các thứ tự được quan sát khác nhau. Việc thêm chỉ mục ở trên đã cung cấp cho SQL Server một đường dẫn truy cập tốt hơn để truy xuất dữ liệu. Nó vẫn sử dụng tính năng quét, nhưng chỉ mục đó nhỏ hơn chỉ mục được phân nhóm (chỉ có thể vừa với hai hàng trên một trang).

Ngay cả khi không có chỉ mục, bạn có thể sẽ không nhận được kết quả như mong đợi, vì nó phức tạp bởi thực tế là Cust_ID của bạn cột không được chèn theo thứ tự tăng dần. Vì vậy, nếu bạn chèn 5 và hơn 2 , việc chọn mà không có ORDER BY thực sự sẽ dẫn đến 2 rồi đến 5 (giả sử không tồn tại chỉ mục tốt hơn).

Những thứ khác ngoài việc tạo (hoặc bỏ, hoặc thay đổi, hoặc xây dựng lại) một chỉ mục có thể gây ra cùng một loại thay đổi trong hành vi sắp xếp. Áp dụng gói dịch vụ, CU hoặc hotfix; xóa bộ đệm thủ tục; sử dụng các tùy chọn RECOMPILE khác nhau; cập nhật số liệu thống kê; khởi động lại máy chủ; thêm hoặc vô hiệu hóa cờ theo dõi; thay đổi các tùy chọn tùy chọn máy chủ; di chuyển cơ sở dữ liệu sang một máy chủ khác; v.v ... vv

Vì vậy, nếu bạn muốn theo dõi thông tin này, bạn cần phải tự thêm thông tin theo một cách nào đó, như một số câu trả lời khác đã giải quyết.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Máy chủ sql sắp xếp dữ liệu của bạn như thế nào?

  2. SQL Server FOR JSON PATH Ví dụ (T-SQL)

  3. Kiểm tra xem một chuỗi có chứa một chuỗi con trong SQL Server 2005 hay không bằng cách sử dụng một quy trình được lưu trữ

  4. LINQ to SQL mỗi hàng thứ N từ bảng

  5. cách tốt hơn để tạo bảng tháng / năm