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

Cách hiệu quả nhất trong SQL Server để lấy ngày từ ngày + giờ?

Tôi phải thừa nhận rằng tôi đã không nhìn thấy chuyển đổi sàn float do Matt hiển thị trước đây. Tôi đã phải kiểm tra điều này.

Tôi đã thử nghiệm một lựa chọn thuần túy (sẽ trả về Ngày và Giờ, và không phải là những gì chúng tôi muốn), giải pháp thống trị ở đây (floor-float), một giải pháp 'ngây thơ' phổ biến được đề cập ở đây (stringconvert) và giải pháp được đề cập ở đây mà tôi đã bằng cách sử dụng (theo tôi nghĩ là nhanh nhất).

Tôi đã kiểm tra các truy vấn trên máy chủ thử nghiệm MS SQL Server 2005 chạy trên Máy chủ Win 2003 SP2 với CPU Xeon 3GHz chạy trên bộ nhớ tối đa (32 bit, vậy là khoảng 3,5 Gb). Đó là đêm nơi tôi ở nên máy chạy không tải hầu như không tải. Tôi đã có tất cả cho riêng mình.

Đây là nhật ký từ quá trình chạy thử nghiệm của tôi, chọn từ một bảng lớn chứa các dấu thời gian thay đổi theo cấp độ mili giây. Bộ dữ liệu cụ thể này bao gồm các ngày khác nhau trong 2,5 năm. Bản thân bảng có hơn 130 triệu hàng, vì vậy đó là lý do tại sao tôi giới hạn ở hàng triệu hàng đầu.

SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2

Thời gian biên dịch và phân tích cú pháp SQL Server:thời gian CPU =0 ms, thời gian trôi qua =1 ms.

(1000000 hàng bị ảnh hưởng) Bảng 'tblMeasureLogv2'. Quét đếm 1, đọc lôgic 4752, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Thời gian thực thi máy chủ SQL:thời gian CPU =422 mili giây, thời gian đã trôi qua =33803 mili giây.

(1000000 hàng bị ảnh hưởng) Bảng 'tblMeasureLogv2'. Quét đếm 1, đọc lôgic 4752, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Thời gian thực thi SQL Server:thời gian CPU =625 mili giây, thời gian đã trôi qua =33545 mili giây.

(1000000 hàng bị ảnh hưởng) Bảng 'tblMeasureLogv2'. Quét đếm 1, đọc lôgic 4752, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Thời gian thực thi SQL Server:thời gian CPU =1953 mili giây, thời gian đã trôi qua =33843 mili giây.

(1000000 hàng bị ảnh hưởng) Bảng 'tblMeasureLogv2'. Quét đếm 1, đọc lôgic 4752, đọc vật lý 0, đọc trước đọc 0, đọc lôgic 0, đọc lôgic vật lý 0, đọc trước lôgic đọc 0.

Thời gian thực thi SQL Server:thời gian CPU =531 ms, thời gian đã trôi qua =33440 ms. Thời gian biên dịch và phân tích cú pháp SQL Server:thời gian CPU =0 ms, thời gian trôi qua =1 ms.

Thời gian thực thi máy chủ SQL:thời gian CPU =0 mili giây, thời gian đã trôi qua =1 mili giây.

Chúng ta đang thấy gì ở đây?

Hãy tập trung vào thời gian CPU (chúng tôi đang xem xét chuyển đổi) và chúng tôi có thể thấy rằng chúng tôi có những con số sau:

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

Từ đó, tôi thấy có vẻ như DateAdd (ít nhất là trong trường hợp cụ thể này) nhanh hơn một chút so với phương pháp truyền theo tầng.

Trước khi bạn đến đó, tôi đã chạy thử nghiệm này vài lần, với thứ tự của các truy vấn đã thay đổi, kết quả giống nhau.

Đây có phải là điều gì đó lạ trên máy chủ của tôi hay là gì?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hồ sơ truy vấn 101 - Có, nó thực sự có thể cải thiện hiệu suất máy chủ SQL của bạn

  2. Chèn dữ liệu máy chủ SQL vào Salesforce bằng con trỏ

  3. Nối nhiều hàng thành một chuỗi văn bản duy nhất bằng cách nhóm

  4. Hàm DECODE () trong SQL Server

  5. SQL để tìm ký tự không phải số đầu tiên trong một chuỗi