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操作之前要确定需要合表的临时表是否需要做更改,如果更改,那么就需要先提交更改的事物,在做合表操作。
下面是测试代码,可以拿去测试一下。
未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!
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(); } } }
未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!未经允许不得转载,转载请标明原处!
相关文章推荐
- MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
- MySQL中SELECT+UPDATE处理并发更新问题解决方案
- 服务器数据库编码格式问题解决方案
- MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
- 一个数据库问题的解决:键列信息不足或不正确。更新影响到多行
- [分类声明]浏览器兼容问题解决方案总结(此分类永久更新)
- Hibernate 不能实时获取数据库中更新的记录问题解决
- MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
- Oracle 11.2.0.1客户端导出Oracle 11.2.0.2数据库时有分区表的分区段错误问题解决方案
- 用Sql解决数据库并发更新问题
- MySQL中SELECT+UPDATE处理并发更新问题解决方案分享
- mysql性能优化(五) mysql中SELECT+UPDATE处理并发更新问题解决方案
- 服务器数据库编码格式问题解决方案
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
- 启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题
- linq to sql更新问题解决方案
- SQL2005 连接数据库各种问题解决方案
- 数据库连接问题解决方案