Speed up a select in SQL Server

时间:2018-02-01 18:29:44

标签: sql-server performance indexing

I have a table that has values like these :

Table 1 :

 Name   |     DateTimeFrom    |   DateTimeTo
  A     |   2017-02-03 02:00  |  2017-02-10 23:55
  B     |   2017-01-03 14:00  |  2017-05-10 19:55

And another table that has values like these :

Table 2:

Name |    Date    |  Hour   | Value
  A  | 2017-01-01 |  00:00  |  0.25
  A  | 2017-01-01 |  00:15  |  0.25
  A  | 2017-01-01 |  00:30  |  0
  A  | 2017-01-01 |  00:45  |  0
  A  | 2017-01-01 |  01:00  |  0.25  

[...] Contains values 0 or 0.25 every 15mins

Result :

 Name   |     DateTimeFrom    |   DateTimeTo       | Value
  A     |   2017-02-03 02:00  |  2017-02-10 23:55  |  345.0
  B     |   2017-01-03 14:00  |  2017-05-10 19:55  |  1202

I've created a view that contains all the columns from table 1 and the SUM of all the values from the table 2 according to the daterange on the table 1. The problem is that Table 2 contains more than 3 million rows and the SELECT takes about 10 mins...

Is there a way to speed up the process ? I tried to create an index on the table 2 but I don't know which index (clustered ? on which columns ? ) i must create to lower the execution time.

Edit (here is the query) :

  SELECT Name, DateTimeFrom, DateTimeTo FROM Table1 
LEFT OUTER JOIN Table2 ON Table1.Name = Table2.Name AND Table1.DateTimeFrom <= 
CAST(Table2.Date AS DATETIME) + CAST(Table2.Hour AS DATETIME) 
  AND (CASE WHEN Table1.DateTimeTo IS NULL THEN GETDATE() ELSE 
Table1.DateTimeTo END) > CAST(Table2.Date AS DATETIME) + CAST(Table2.Hour AS DATETIME)

1 个答案:

答案 0 :(得分:-3)

Op(Swapper) - Are you trying to only return the past 2 days?

Start with a non clustered index on table 2 date include value column.

Then add a filter for only the data set you need, no one can consume 3 million records. something like where datetimefrom > datediff(month, 1, sysdatetime()) (in the view definition)

A second thought, why compute this data over and over again via a view, consider materializing this data into a table.