2010-01-20 33 views
7

Nói ví dụ tôi đang tham gia vào một bảng số để thực hiện một số hoạt động giữa hai ngày trong một subquery, như vậy:Dateadd ảnh hưởng như thế nào đến hiệu suất của truy vấn SQL?

select n 
     ,(select avg(col1) 
      from table1 
     where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
          and dateadd(minute, 15*(n+1), @ArbitraryDate)) 
    from numbers 
where n < 1200 

Sẽ truy vấn thực hiện tốt hơn nếu tôi, nói rằng, xây dựng ngày từ varchars concatenating hơn là sử dụng hàm dateadd?

+0

n là một trường int (hoặc smallint, bất cứ điều gì) trong bảng 1? –

+0

@Patrick Karcher, n là một int từ bảng [number]. – Daniel

+0

MAybe bạn cần cho chúng tôi biết cấu trúc của table1 – HLGEM

Trả lời

4

Giữ dữ liệu theo định dạng datetime sử dụng DATEADD là nhiều khả năng được nhanh hơn

Kiểm tra câu hỏi này: (! Không phải tôi) Most efficient way in SQL Server to get date from date+time?

Câu trả lời được chấp nhận chứng tỏ DATEADD qua chuyển đổi chuỗi. Tôi đã nhìn thấy một quá nhiều năm trước đây cho thấy cùng một

+0

Đó chính xác là loại câu trả lời tôi đã hy vọng. +1 cho bạn để tìm kiếm nó và +1 cho Tomas để có điểm chuẩn tuyệt vời. Cảm ơn! – Daniel

3

Tôi sẽ KHÔNG đi với các varchar nối.

DateAdd sẽ def hoạt động tốt hơn so với nối chuỗi và truyền tới DATETIME.

Như mọi khi, bạn đặt cược tốt nhất là lập cấu hình cho 2 tùy chọn và xác định kết quả tốt nhất, vì không có DB nào được chỉ định.

+0

Lý do cho việc này là gì? – Daniel

4

Hãy cẩn thận với giữa ngày, hãy nhìn vào How Does Between Work With Dates In SQL Server?

Tôi đã từng optmized một truy vấn để chạy từ hơn 24 giờ đến 36 giây. Chỉ cần không sử dụng chức năng ngày hoặc chuyển đổi trên cột, xem tại đây: Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code

để xem truy vấn nào hoạt động tốt hơn, thực hiện cả truy vấn và xem kế hoạch thực hiện, bạn cũng có thể sử dụng số liệu thống kê và thống kê đọc và thời gian cần để thực hiện các truy vấn

+0

Cảm ơn những người đứng đầu lên "giữa". Tôi thấy tôi sẽ nhận được một số chồng lên nhau. – Daniel

2

Miễn là tính toán biến vị ngữ của bạn không bao gồm các tham chiếu đến các cột của bảng bạn đang truy vấn, cách tiếp cận của bạn cũng không quan trọng (đi cho rõ ràng).

Nếu bạn đã bao gồm thứ gì đó từ Table1 trong tính toán, tuy nhiên, tôi muốn xem để quét bảng hoặc quét chỉ mục vì nó có thể không còn là sargable.

Trong mọi trường hợp, hãy kiểm tra (hoặc đăng!) execution plan để xác nhận.

2

Tại sao bạn lại sử dụng truy vấn con tương quan để bắt đầu? Điều đó sẽ làm chậm bạn nhiều hơn so với dateadd. Chúng giống như con trỏ, chúng hoạt động theo từng hàng. Sẽ có công việc như thế này?

select n.n , avgcol1 
    from numbers n 
    left outer join 
     (
     select avg(col1) as avgcol1, n 
     from table1 
     where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
      and dateadd(minute, 15*(n+1), @ArbitraryDate) 
     Group by n 
     ) t 
    on n.n = t.n 
    where n < 1200 
+0

Đó là một ý tưởng hay. Vấn đề là bảng 1 không được liệt kê (hoặc nhất thiết phải liệt kê). – Daniel

+0

Tôi đang đá chính mình vì không thấy điều đó. Rất tốt. –

+0

Tôi đã thay thế kết nối bên trong bằng một bên ngoài bên trái, để truy vấn này tương đương với truy vấn ban đầu. –

3

nhiều khả năng sẽ không có cách nào khác nhau. Tôi sẽ chạy điều này:

SET STATISTICS IO ON; 
SET STATISTICS TIME ON; 

theo sau bởi cả hai biến thể truy vấn của bạn, để bạn xem và so sánh chi phí thực thi thực tế.

+0

Cảm ơn lời khuyên hữu ích này – Daniel

Các vấn đề liên quan