2015-10-29 3 views
2

this is the execution planThe image shows the results for the query and its taking 25secs for ~7500 rowsКак уменьшить время выполнения запроса

SELECT dt AS Date 
,monthname 
,dayname 
,(
    SELECT COUNT(1) 
    FROM Calendar 
    WHERE DATEPART(MM, dt) = DATEPART(MM, c.dt) 
     AND DATEPART(YEAR, dt) = DATEPART(YEAR, c.dt) 
    ) AS daysInMonth 
FROM Calendar AS c 
WHERE dt BETWEEN '2000-01-01 00:00:00' 
    AND '2020-02-01 00:00:00' 

выше запрос для получения количества дней данного месяца для определенной даты. здесь iam дает диапазон дат и для всех дат между диапазоном iam, который показывает дни этого месяца.

Изображение показывает результаты запроса и его прием 25 секунд для ~ 7500 строк. может кто-то помочь мне сократить время.

+0

Какой вкус вы используете SQL? MySQL? PostgreSQL? Oracle? Это может иметь значение. – McGlothlin

+0

microsoft sql server 2008 – Kiran

+0

у вас нет MySQL и sql-сервера в то же время –

ответ

6

Попробуйте этот. Здесь вы вычисляете общее количество всего один раз вместо 7500 раз. Также создайте индекс для поля dt

with monthCount as (
     SELECT DATEPART(YEAR, dt) as m_year, 
      DATEPART(MM, dt) as m_month 
      COUNT(1) as total 
     FROM Calendar 
     GROUP BY 
      DATEPART(YEAR, dt), 
      DATEPART(MM, dt) 
) 
SELECT dt AS Date 
     ,monthname 
     ,dayname 
     ,total 
FROM Calendar C 
JOIN monthCount M 
    on DATEPART(YEAR, C.dt) = M.m_year 
    and DATEPART(MM, C.dt) = M.m_month 
WHERE C.dt BETWEEN '2000-01-01 00:00:00' 
       AND '2020-02-01 00:00:00' 
+0

после выполнения внешнего запроса, тогда я получу список дат. то на эти даты я извлекаю месяц и получаю итоговые дни за этот извлеченный месяц – Kiran

+0

не уверен, что я понимаю ваш комментарий, сделал эту работу или нет? Или, может быть, я не понял ваш вопрос? –

+0

say date is '2000-01-01 00:00:00', поэтому с этой даты я извлекаю месяц и за этот месяц я должен указать, сколько дней в этом конкретном месяце .. – Kiran

Смежные вопросы