您的位置:首页 > 数据库

vertica数据库更新慢问题解决方案

2017-11-22 14:03 232 查看
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.csdn.net/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();
}
}
}


未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: