开发者社区 问答 正文

LM计算引擎 INSERT FROM SELECT语法是什么?



基本语法


分析型数据库支持通过查询方式进行表数据复制,目标表必须是实时写入表:

  • 提供列名的方式,请确保SELECT的列表与提供的INSERT目标表的列匹配(顺序、数据类型):
<PRE prettyprinted? linenums>
  1. INSERT INTO db_name.target_table_name (col1, col2, col3)
  2. SELECT col1, col2, col3 FROM db_name.source_table_name
  3. WHERE col4 = 'xxx';
  • 不提供列名的方式,请确保SELECT的列表与提供的INSERT目标表的列匹配(顺序、数据类型):
<PRE prettyprinted? linenums>
  1. INSERT INTO db_name.target_table_name
  2. SELECT col1, col2, col3, col4 FROM db_name.source_table_name
  3. WHERE col4 = 'xxx';

可通过如下语句查询表的列定义的顺序:<PRE prettyprinted? linenums>
  1. SHOW CREATE TABLE db_name.target_table_name;


多种引擎模式下的执行


目前,INSERT from SELECT支持多种执行模式,在LM模式下:
  • SELECT部分的查询走FRONTNODE + COMPUTENODE的两阶段模式,该模式下具有最好的执行性能,但是SELECT的查询部分不会做最终的数据聚合,所以,查询要考虑是否符合按HASH分区分片计算ONLY的模式,否则写入的数据不保证整体语义的正确性、完整性,默认执行引擎为 COMPUTENODE 时,无需加 /*+engine=COMPUTENODE*/ hint:
<PRE prettyprinted? linenums>
  1. /*+engine=COMPUTENODE*/INSERT INTO db_name.target_table_name (col1, col2, col3)
  2. SELECT col1, col2, col3 FROM db_name.source_table_name
  3. WHERE col4 = 'xxx';

展开
收起
nicenelly 2017-10-26 15:21:23 1880 分享 版权
阿里云 AI 助理回答

SQL数据复制与写入优化

基本语法说明

在分析型数据库中,您可以通过以下两种方式使用INSERT INTO SELECT语句进行表数据的复制:

  1. 提供列名的方式: 确保SELECT子句中的列顺序和数据类型与目标表对应列严格匹配。

    INSERT INTO db_name.target_table_name (col1, col2, col3)
    SELECT col1, col2, col3 FROM db_name.source_table_name
    WHERE col4 = 'xxx';
    
  2. 不提供列名的方式: 同样需要保证SELECT子句中的列顺序、数量及数据类型与目标表完全一致。

    INSERT INTO db_name.target_table_name
    SELECT col1, col2, col3, col4 FROM db_name.source_table_name
    WHERE col4 = 'xxx';
    

若需确认目标表的列定义顺序,可使用如下命令:

SHOW CREATE TABLE db_name.target_table_name;

多种引擎模式下的执行策略

  • LM模式下执行优化
    • 使用/* engine=COMPUTENODE*/提示可以确保查询部分在FRONTNODE和COMPUTENODE之间采用两阶段模式执行,此模式能提供最佳性能。
    • 注意:该模式下SELECT查询不做最终聚合,因此请确保查询逻辑符合按HASH分区计算的限制,以保证写入数据的整体语义正确性和完整性。
    • 示例:
    /* engine=COMPUTENODE*/
    INSERT INTO db_name.target_table_name (col1, col2, col3)
    SELECT col1, col2, col3 FROM db_name.source_table_name
    WHERE col4 = 'xxx';
    

注意事项与优化建议

  • 在设计INSERT INTO SELECT操作时,务必考虑数据分片规则,确保数据分布均匀且能够有效利用并行处理能力。
  • 对于大量数据复制,建议在业务低峰期执行,并监控集群资源使用情况,避免影响其他服务。
  • 考虑到数据的一致性与完整性,当源表数据依赖于特定条件筛选时(如上例中的WHERE col4 = 'xxx'),确保这些条件不会遗漏或错误地过滤目标数据。
  • 若目标表为分区表,明确了解INSERT INTO SELECT对分区的影响,特别是使用INSERT OVERWRITE SELECT时,其会覆盖指定分区的数据。

通过上述指导,您可以更有效地利用INSERT INTO SELECT进行数据复制,同时确保操作的高效性和准确性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答