Mysql SQL查询作为瞬态RoR(ActiveRecord)模型
遗憾的是,我找不到很多关于我正在尝试做什么的信息。我会尽量简短地把它分解一下 我正在处理一个遗留数据库,相信我,这也让我很沮丧,但事实就是如此,所以我们必须在这个参数范围内工作 我有一个数十万行的数据库,还有一个需要生成的特别糟糕的统计/报告。最初它是在一个大的查询中,但这使得使用它非常令人沮丧,因为它不允许非常枯燥的架构。我将查询分解为几个视图,并最终将它们合并到一个最终视图中,该视图对测试/开发非常有效,但我相信一些阅读本文的资深/有经验的人可能已经猜到了,它相当缓慢。最明显的加速方法是将where子句应用于连接在一起的内部视图。这使整个过程加快了一个大的数量级 所以,考虑到这一点,我想 为什么我不能创建一个模型并定义它应该使用的大型联合/选择感染SQL,并将模型上的任何where子句应用于每个子选择 我的想法是,这将基本上创建一个虚拟模型,我找不到任何这个名称的东西,所以我在这里抓住的是在任何地方都不存在的虚拟模型,但当被查询时,它将返回与其他更持久的模型最有可能有关系的瞬态对象 为了说明这一点,我将发布一个大的令人讨厌的sql。从这个角度来看,它本质上是总结/计算会员销售的统计数据等Mysql SQL查询作为瞬态RoR(ActiveRecord)模型,mysql,sql,ruby-on-rails,activerecord,view,Mysql,Sql,Ruby On Rails,Activerecord,View,遗憾的是,我找不到很多关于我正在尝试做什么的信息。我会尽量简短地把它分解一下 我正在处理一个遗留数据库,相信我,这也让我很沮丧,但事实就是如此,所以我们必须在这个参数范围内工作 我有一个数十万行的数据库,还有一个需要生成的特别糟糕的统计/报告。最初它是在一个大的查询中,但这使得使用它非常令人沮丧,因为它不允许非常枯燥的架构。我将查询分解为几个视图,并最终将它们合并到一个最终视图中,该视图对测试/开发非常有效,但我相信一些阅读本文的资深/有经验的人可能已经猜到了,它相当缓慢。最明显的加速方法是将w
SELECT
`traffic`.`date` AS `date`,
`traffic`.`site_id` AS `site_id`,
`traffic`.`partner_id` AS `partner_id`,
`traffic`.`visits` AS `visits`,
`traffic`.`clicks` AS `clicks`,
`traffic`.`signups` AS `signups`,
`payout`.`signup_total` AS `signup_total`,
`payout`.`upgrade_total` AS `upgrade_total`,
`payout`.`recurring_total` AS `recurring_total`,
`payout`.`referring_total` AS `referring_total`,
`payout`.`negative_total` AS `negative_total`,
`payout`.`fee_total` AS `fee_total`,
`payout`.`carryover_total` AS `carryover_total`,
`payout`.`adjustment_total` AS `adjustment_total`,
`payout`.`payment_total` AS `payment_total`,
`payout`.`payment_nums` AS `payment_nums`
FROM (
((SELECT CAST(`traffic_date` AS DATE) AS `date`,
`site_id`,
`partner_id`,
Sum(IF(tracking_type = 1, count, 0)) AS `visits`,
Sum(IF(tracking_type = 6, count, 0)) AS clicks,
Sum(0) AS signups
FROM `tracking`.`tracking_partner_ad_event`
WHERE `partner_id` = 1796279
GROUP BY 1, 2, 3)
UNION
(SELECT CAST(`traffic_date` AS DATE) AS `date`,
`site_id`,
`partner_id`,
Sum(count) AS visits,
Sum(0) AS clicks,
Sum(0) AS signups
FROM `tracking`.`tracking_partner_traffic_visit`
WHERE `partner_id` = 1796279
GROUP BY 1, 2, 3)
UNION
(SELECT CAST(`processed_date` AS DATE) as `date`,
`site_id`,
`partner_id`,
Sum(0) AS visits,
Sum(0) AS clicks,
Sum(1) AS signups
FROM `user_account_entry`
WHERE `trans_type` = 2 AND `status` <> 2 AND `partner_id` = 1796279
GROUP BY 1, 2, 3)
) AS `traffic`
JOIN
(SELECT
`period` AS `period_id`,
`partner_id`,
`processed_date`,
`site_id`,
SUM(IF(`payout_type`=1, amount, 0)) AS `signup_total`,
SUM(IF(`payout_type`=2, amount, 0)) AS `upgrade_total`,
SUM(IF(`payout_type`=3, amount, 0)) AS `recurring_total`,
SUM(IF(`payout_type`=8, amount, 0)) AS `referring_total`,
SUM(IF(`payout_type`=4, amount, 0)) AS `negative_total`,
SUM(IF(`payout_type`=7, amount, 0)) AS `fee_total`,
SUM(IF(`payout_type`=9, amount, 0)) AS `carryover_total`,
SUM(IF(`payout_type`=5, amount, 0)) AS `adjustment_total`,
SUM(IF(`payout_type`=6, amount, 0)) AS `payment_total`,
GROUP_CONCAT(`payment_num` ORDER BY 1) AS `payment_nums`
FROM `partner_account_entry` AS `e`
WHERE `partner_id` = 1796279
GROUP BY 1,2 ORDER BY 1,2
) AS `payout` ON (
(
(`traffic`.`date` = `payout`.`processed_date`) AND
(`traffic`.`site_id` = `payout`.`site_id`) AND
(`traffic`.`partner_id` = `payout`.`partner_id`)
)
)
) GROUP BY 1,2,3 ORDER BY 1
如您所见,通过在partner_id上选择,此查询得到了显著优化
TL;DR:我希望将上面的SQL封装在一个模型中,即使任何查询都要求提供partner_id,以模拟可以传递并进一步链接的rails AR对象
这是不合理的要求吗?巨大的努力?这怎么可能呢?我找不到现有的例子,这让我担心,但也让我困惑;这不是一个合理的策略吗?为什么不存在解决方案