Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 左join和dbplsql_Mysql_R_Left Join_Dbplyr - Fatal编程技术网

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