【问题标题】:How to reduce the query execution time如何减少查询执行时间
【发布时间】:2016-01-29 02:50:24
【问题描述】:

 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'

上述查询用于获取特定日期的特定月份的天数。这里我给出日期范围和范围之间的所有日期,我只是显示该月的日期。

该图显示了查询的结果,大约 7500 行需要 25 秒。谁能帮我减少时间。

【问题讨论】:

  • 你使用什么风格的 SQL? MySQL? PostgreSQL?甲骨文?这可能会有所作为。
  • 微软 sql server 2008
  • 你不能同时拥有mysql和sql server
  • 根据您的查询,看来您使用的是 SQL Server 而不是 MySQL
  • 你有 dt 的索引吗?向我们展示您的查询的解释计划stackoverflow.com/questions/7359702/…

标签: sql sql-server sql-server-2008


【解决方案1】:

试试这个。在这里,您只计算一次总数,而不是 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'

【讨论】:

  • 在执行外部查询之后,我会得到日期列表。然后对于那个日期,我正在提取月份并获取该提取月份的总天数
  • 不确定我是否理解您的评论,这是否有效?或者我没听懂你的问题?
  • 说日期是 '2000-01-01 00:00:00' 所以从那个日期开始我提取月份和那个月份我应该告诉那个特定月份有多少天..跨度>
  • 月份是一月,所以我应该显示 31 天。在日历表中显示该特定年份的月份 jan 的天数。
  • 如果您想知道一个月有多少天,这是一种非常简单的方法。检查这个问题stackoverflow.com/questions/691022/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2020-02-10
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多