ΠΩΠΩ πραγματικό σεμινάριο το πόστ σου kelman. THANKS.
Στο θέμα με τα non-sarg και τα indexed views, έχω sqlexpress και θα ήθελα να παίζει σωστά και σε τέτοια βάση οπότε μιας και μιλάμε για SPs σκέφτηκα το εξής. Το query μας είναι αυτό.
SELECT * FROM dbo.myEmails INNER JOIN
dbo.myUsers ON dbo.myEmails.UserID = dbo.myUsers.IDs
WHERE (dbo.myUsers.username = @thisUser) AND (datePart(year,dbo.myEmails.dateReceived) = @thisYear) AND (datePart(month,dbo.myEmails.dateReceived) = @thisMonth)
Το πρόβλημα προφανώς είναι ότι χρησιμοποιείται το function μέσα στο select. Άν πιο πρίν στο SP κάνουμε κάτι τέτοιο?
declare @y numeric
declare @m numeric
declare @d numeric
declare @startDate DateTime
declare @endDate DateTime
set @y = @thisYear
set @m = 1
set @d = 1
set @startDate = select dateadd(mm,(@y-1900)* 12 + @m - 1,0) + (@d-1)
set @endDate = select dateadd(mm,(@y -1900)* 12 + @m + 1 - 1,0) + (@d-1)
και στη συνέχεια στο πρώτο query χρησιμοποιήσω το between? Δηλαδή....
SELECT * FROM dbo.myEmails INNER JOIN
dbo.myUsers ON dbo.myEmails.UserID = dbo.myUsers.IDs
WHERE (dbo.myUsers.username = @thisUser) AND (dbo.myEmails.dateReceived between @startDate and @EndDate)
Λογικά έτσι θα παίξει με το index ε? Δεν ξέρω βέβαια τι overhead θα έχω με τους αρχικούς υπολογισμούς... Aν χρησιμοποιούσα string concatenation και μετά conversion σε datetime προφανώς θα ήτανε χειρότερα ε?
Simple Photography