Mysql 左join和dbplsql
我从许多不同的表中提取数据,并将它们连接到一个基表,如下所示:Mysql 左join和dbplsql,mysql,r,left-join,dbplyr,Mysql,R,Left Join,Dbplyr,我从许多不同的表中提取数据,并将它们连接到一个基表,如下所示: df <- tbl(ch, dbplyr::in_schema("schem1", 'education_data')) %>% select(ID, ProviderKey,ReportingPeriodKey,EthnicityKey) %>% left_join( tbl(ch, dbplyr::in_schema("data_schem", 'Rep
df <- tbl(ch, dbplyr::in_schema("schem1", 'education_data')) %>%
select(ID, ProviderKey,ReportingPeriodKey,EthnicityKey) %>%
left_join(
tbl(ch, dbplyr::in_schema("data_schem", 'ReportingPeriodDimensions')) %>%
select(ReportingPeriodKey,ReportingYear),
by = "ReportingPeriodKey"
) %>%
left_join(
tbl(ch, dbplyr::in_schema("data_schem", 'ProviderDimensions')) %>%
select(ProviderKey, ProviderName),
by = "ProviderKey"
) %>%
left_join(
tbl(ch, dbplyr::in_schema("sdr", 'EthnicityDim')) %>%
select(EthnicityKey,Ethnicity_description),
by = "EthnicityKey"
) %>%
filter(ReportingYear %in% ("2015","2016","2017"))
当我用show_querydf检查SQL代码时,有一个基表'education_data'的'SELECT'SQL命令,它为每个执行的联接选择了所有变量,在本例中为3x。根据需要连接的维度表的数量,我通常需要连接大约8或9个其他表
这似乎效率很低,尤其是当我在提取包含数百万条记录的表时。使用R命令而不是直接对SQL进行编码,有什么解决办法吗?我猜,与其看到整洁的SQL查询,不如说: 选择a.col1、a.col2、b.col3、c.col4 从表A作为 左联接表_B为B 关于a.col=b.col 左联接表_C为C 关于b.col=c.col 相反,您看到的嵌套查询更像: 选择LHS.col1、LHS.col2、LHS.col3、RHS.col4 从…起 选择LHS.col1、LHS.col2、RHS.col3 从表A中选择LHS 左联接表_B为RHS 在左S.col=右S.col上 作为LHS 左联接表_C为RHS 在左S.col=右S.col上 但布局要差得多 我同意第一个示例的格式更好,更易于阅读,并且具有良好的编码实践。相比之下,dbplyr自动生成的SQL代码相当难看 一般来说,我不担心这一点。人工编写的SQL代码旨在使人和机器可读。从dbplyr自动生成的SQL代码主要是机器可读的。SQL解释器很可能以相同的方式执行这两种变体。随着我使用dbplyr工作的复杂性增加,我相信SQL解释器可以找到一种有效的方法来执行查询 我从未注意到dbplyr自动生成的SQL和等效的人工整理代码之间的主要性能差异。但我没有对此进行广泛的测试。如果您确实运行了这样的测试,那么它们将是补充这个问题的一个很好的答案 如果你关心绩效,你可以做一些事情: 按照@danblack的建议,确保您的表在您要连接的列上有索引。可能是最重要列上的聚集索引。在不离开R的情况下执行此操作的一种方法是DBI::dbExecutesql字符串,用于在此处添加索引,它将执行您在数据库中给它的命令 将关键中间表写入数据库和索引。例如,如果表A是通过连接表B和表C生成的,那么执行A与A的自连接将涉及三个连接B-C-B-C(如果直接从表B和表C工作),但如果已将表A写入数据库A-A,则仅涉及一个连接 根据上下文的不同,可以在连接之前对每个表进行分区,然后将输出表附加在一起。例如,使用R中的循环为每个报告年度运行一个查询。在较小的输入数据集上运行联接往往执行得更快
为什么效率不高?连接是数据库的设计目的。确保与联接相关的表已编制索引。使用show_querydf获取SQL并运行EXPLAIN SELECT。。。。。ReportingYear应该是索引中的第一个,然后是索引中使用的列对,如果主键是第二个元素,则省略主键。仔细阅读和/或其中一段mysql视频/博客/教程。欢迎来到SO。如果卡住了,请包括额外的解释和显示CREATE TABLE。呵呵,我认为我对SQL vs R的工作原理缺乏了解,这一点在这里得到了体现:感谢您的反馈和建议是的,这是有道理的。我把R思想应用到SQL代码中,我发现这并不合适:P