Sql 提高具有相关日期范围的联接表的查询性能 信息

Sql 提高具有相关日期范围的联接表的查询性能 信息,sql,database,performance,Sql,Database,Performance,我需要一些帮助来找出查询一组表的最佳方法。需要从两个相互关联的表中找出数据可用的最短和最长月份。有关表格和列的说明如下: 股票 stock_id | region_id 地区 region_id | region_name 股票收益 stock_id | month | return 地区回报 region_id | return_type_id | month | return 返回型 return_type_id | return_type_name 问题 我已经为此在创建了一个沙

我需要一些帮助来找出查询一组表的最佳方法。需要从两个相互关联的表中找出数据可用的最短和最长月份。有关表格和列的说明如下:

股票

stock_id | region_id
地区

region_id | region_name
股票收益

stock_id | month | return
地区回报

region_id | return_type_id | month | return
返回型

return_type_id | return_type_name
问题 我已经为此在创建了一个沙盒

我想回答的问题是:对于给定的起始月和结束月190001、201310,股票VTI及其对应区域1的最早和最新可用回报数据是什么?然后,此数据将用于根据日期范围进一步查询具有正确开始月和结束月的其他表

下面描述的我当前的查询在执行时间方面开始缓慢增长,因为这是将在大多数网页加载上运行的主要查询,所以我担心性能

关于数据,模式不是一成不变的,如果更适合这些类型的查询,可以对其进行更改。此外,ReturnType目前与EAV类似,但它在生产表中的选项5有限。StockReturns表目前有超过100000行,上限为200万条记录。RegionReturns表有3000行,上限为5000

目前,我正在查询以下内容:

SELECT s.stock_id
    ,MIN(sr.month) AS start_month
    ,MAX(sr.month) AS end_month
FROM StockReturns sr
INNER JOIN Stocks s ON sr.stock_id = s.stock_id AND s.stock_id = 'VTI'
INNER JOIN Regions r ON s.region_id = r.region_id
INNER JOIN RegionReturns rf  ON s.region_id = rf.region_id
  AND rf.return_type_id = 1
  AND sr.month = rf.month
INNER JOIN RegionReturns mkt ON s.region_id = mkt.region_id
  AND mkt.return_type_id = 2
  AND sr.month = mkt.month
WHERE sr.month BETWEEN 190001 AND 201310
GROUP BY s.stock_id
在这种情况下,答案应该是:

stock_id | start_month | end_month
--------- ------------- ----------
VTI      | 201301      | 201302

您可以消除与Regions表的连接,因为只有在需要区域名称时才会连接到该表。因为您只是检查股票区域是否存在两种返回类型,所以还可以使用exist子句

试试这个怎么样

SELECT sr.stock_id, 
       MIN(sr.month) AS start_month, 
       MAX(sr.month) AS end_month

FROM   StockReturns sr,
       Stocks s

WHERE  sr.stock_id = s.stock_id
AND    s.stock_id = 'VTI'
AND    sr.month BETWEEN 190001 AND 201310
AND    EXISTS (SELECT 1 
               FROM   RegionReturns rr
               WHERE  rr.region_id = s.region_id
               AND    rr.return_type_id = 1
               AND    rr.month = sr.month)
AND    EXISTS (SELECT 1 
               FROM   RegionReturns rr
               WHERE  rr.region_id = s.region_id
               AND    rr.return_type_id = 2
               AND    rr.month = sr.month)

GROUP BY sr.stock_id

这个查询看起来不错。您是否使用正确的硬件运行?即使有200万行,只要索引正确,查询也应该在几秒钟内返回。我会把重点放在索引上,因为它似乎是你的瓶颈。请发布执行计划,以便我们可以看看你有什么。还有,您使用的是什么数据库?我正在使用sqlite进行开发和基准测试。我创建了各种索引来支持查询,并准备了一个包含1000000行的示例数据库。当使用我的查询时,查询计时器报告用户8.751938 sys 0.546234的CPU时间。这对于这个用途来说太长了。我以下面描述的方式运行查询,它使用CPU时间用户0.010647 sys 0.000222运行。有没有想过为什么会这样?只需在上面描述的一个示例数据库上尝试一下,它运行得非常快。你有没有想过为什么会这样?至于连接,我需要它,因为这会反馈到ORM中,并且只能通过区域表进行水合。