Vertica是一款基于列存储的MPP (massively parallel processing)架构的数据库。它可以支持存放多至PB(Petabyte)级别的结构化数据。Vertica 支持关系数据库事务处理和ACID 规范,支持SQL-92/SQL-99/SQL-2003 标准,提供ODBC、JDBC、ADO.NET 接口规范驱动,完全兼容传统关系数据库的开发、使用和管理习惯。也就是说我们用来操作mysql的sql语句,也可以当vertica的执行语句。当然,vertica与mysql的函数也是有所不同的,这里就不一一介绍了。提供一个连接,可以去看看:http://blog.youkuaiyun.com/jiangshouzhuang/article/details/34434089 。vertica简单介绍到这里。
接下来说我们的正文,如何解决vertica更新慢的问题。官网原话大概的意思是,vertica不适合做更新和删除操作,经过本人测试也证明vertica的更新和删除效率确实非常慢。那么我们如何去解决这个问题呢?
我们可以采用临时表来解决更新慢的问题。也就是说我们vertica中每个目标表都有一个与其完全相同的临时表(表名不同),这张临时表我们只用来做插入操作。在每次向这张表插入前都需要执行 TRUNCATE TABLE t_user;也就是清空表操作。然后在执行插入。如果这一步完成了,那么久进行关键的一步。合并表。vertica本身支持merge into这样的操作。我们就可以通过这样的操作来解决vertica更新慢的难题了。提供一串命令回去自己研究:
MERGE INTO locations l USING new_locations n
ON (l.customer_id = n.customer_id
AND l.location_x = n.location_x AND
l.location_y = n.location_y)
WHEN MATCHED THEN UPDATE SET location_count = l.location_count + n.location_count
WHEN NOT MATCHED THEN INSERT(customer_id, location_x, location_y, location_count, location_name)
VALUES(n.customer_id, n.location_x, n.location_y, n.location_count, n.location_name);
这上面的语句其实就像我们使用mysql的ON DUPLICATE 主键相同的执行更新操作,不相同的执行插入操作。通过合表操作解决vertica更新慢的问题。
最后说一下vertica执行merge into 的事物问题。我们在使用mysql数据库的时候都知道,在一个事物中我们执行一个update操作,在select是可以得到update后的数据的,但是在vertica同一个事物中执行merge into操作却是不成功的,本人亲测。得出的结论是merge操作之前要确定需要合表的临时表是否需要做更改,如果更改,那么就需要先提交更改的事物,在做合表操作。
下面是测试代码,可以拿去测试一下。
package cn.Data.test; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; /** * Created with IntelliJ IDEA. * User: tianlong * Date: 2017/11/22 * Time: 13:26 * function: */ public class VerticaTest { public static void main(String[] args) { Connection vc = VerticaConnection.getVerticaConnection(); try { vc.setAutoCommit(false); Statement sm = vc.createStatement(); String sql = "MERGE INTO dev_test.base_market_info tg USING dev_test.base_market_info_temp tem\n" + "ON (tg.market_id = tem.market_id)\n" + "WHEN MATCHED THEN UPDATE SET\n" + " market_name = tem.market_name,\n" + " market_store_id = tem.market_store_id,\n" + " updatetime = tem.updatetime\n" + "WHEN NOT MATCHED THEN\n" + "INSERT VALUES\n" + " tem.market_id,\n" + " tem.market_name,\n" + " tem.updatetime\n" + " )"; int i = sm.executeUpdate(sql); System.out.println(i); vc.commit(); vc.close(); sm.close(); } catch (SQLException e) { e.printStackTrace(); } } }
未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!