CockroachDB使开发者能够建立快速、可扩展的应用程序,其中一个方法就是提供丰富的、与Postgres兼容的SQL。虽然CockroachDB遵循Postgres的线上协议,但该数据库也有一个为分布式数据库设计的自定义SQL实现。
多年来,我们扩展了分布式SQL的实现,包括基于成本的优化器(CBO)和矢量执行引擎,所有这些都是为了解决开发者的分布式数据的复杂性。在CockroachDB 20.2中,我们很高兴能为开发者提供越来越丰富的SQL功能集,包括对空间数据、物化视图、Enums、ALTER TABLE ,以及用户自定义模式的支持。让我们深入了解这些新功能。
CockroachDB中更强大、更灵活的数据模型
今天的应用需要定义富有表现力的数据模型,并且能够随着应用需求的变化而不断地发展它们。
CockroachDB中的空间数据
CockroachDB现在支持对空间数据进行建模,包括与地图相关的几何数据和与地球表面相关的地理数据。想了解更多关于将PostGIS兼容的SQL与CockroachDB的可扩展性相结合的信息,请查看空间数据教程或看看这个分布式空间数据演示。
CockroachDB中的用户定义模式
使用Postgres的开发者可以利用数据库的层次结构→用户定义的模式→数据库对象(表、视图等)来组织他们的数据。数据组织模式可以支持多个用户或多个应用程序在同一数据库集群中工作,彼此之间是隔离的。此外,Postgres有一个庞大的第三方工具生态系统,可以在其本地的内部实现中利用用户定义的模式。在20.2之前,我们建议用户在任何地方创建一个用户定义模式的数据库,而第三方工具需要使用变通方法。
在20.2版本中,CockroachDB支持用户定义的模式。开发者可以使用下面的例子将只有默认public 模式的数据库转换为用户定义的模式。CockroachDB的开发者现在可以实现类似于Postgres中的数据层次结构。此外,CockroachDB的开发者仍然可以灵活地对当前连接的数据库以外的数据库执行具有完全限定名称的语句。
通过用户定义模式提供的额外的命名层次,开发者可以创建更加复杂和安全的数据层次。下面的例子表明,一个应用程序的单一数据库可以支持不同用户的用户定义模式。对用户定义模式的支持也为那些为CockroachDB添加第三方工具支持的开发者消除了一个已知的障碍。例如,Prisma--Javascript数据访问框架--就遇到了这个问题。
demo@127.0.0.1:53365/defaultdb> show databases;
database_name | owner
----------------+--------
defaultdb | root
teamA | demo
movr | demo
postgres | root
system | node
(5 rows)
demo@127.0.0.1:53365/defaultdb> create database my_app;
CREATE DATABASE
demo@127.0.0.1:53365/defaultdb> use my_app;
SET
demo@127.0.0.1:53365/my_app> ALTER DATABASE teamA CONVERT TO SCHEMA WITH PARENT my_app;
CONVERT TO SCHEMA
demo@127.0.0.1:53365/my_app> create role teamA;
CREATE ROLE
demo@127.0.0.1:53365/my_app> alter schema teamA owner to teamA;
ALTER SCHEMA
demo@127.0.0.1:53365/my_app> show schemas;
schema_name | owner
---------------------+--------
crdb_internal | NULL
information_schema | NULL
teamA | teamA
pg_catalog | NULL
pg_extension | NULL
public | admin
(6 rows)
枚举类型(Enums)
在数据模型中使用Enums可以提供更强的数据完整性,并且可以与大多数编程语言中的Enums相结合,在应用和数据库层验证数据。更强的数据验证使开发人员可以考虑其他技术挑战。一个Enum定义了一个静态值的列表,并且可以被设置为一个列的类型。Enum列只允许用户定义的集合中的值,例如用户界面下拉菜单中的项目。
teamA@127.0.0.1:53365/my_app> CREATE TYPE movie_genre AS ENUM ('drama', 'comedy', 'horror');
CREATE TYPE
teamA@127.0.0.1:53365/my_app> CREATE TABLE employees (favorite_movie_genre movie_genre);
CREATE TABLE
teamA@127.0.0.1:53365/my_app> INSERT INTO employees VALUES ('action');
ERROR: invalid input value for enum movie_genre: "action"
SQLSTATE: 22P02
在线模式的变化与ALTER TABLE
在20.2中,我们扩展了CockroachDB对在线模式变化的支持。这些功能允许开发者对其应用所需的关系进行建模,并随着时间的推移改变数据模型。当与CockroachDB的在线模式变更相结合时,开发者可以在不停机的情况下进行这种变更。
通过 ALTER TABLE...ALTER COLUMN...TYPE语法,开发者现在可以改变一个列的类型。 ALTER TABLE...ADD COLUMN...REFERENCES语法支持在同一事务中向新创建的表添加外键,如下例所示。
模式变更是应用程序开发周期中的一个自然组成部分。最初的模式需要不断发展,以支持未来的业务需求,或者增加以前未知的业务约束。
demo@127.0.0.1:53365/my_app> BEGIN;
BEGIN
demo@127.0.0.1:53365/my_app> CREATE TABLE employees (id INT PRIMARY KEY);
CREATE TABLE
demo@127.0.0.1:53365/my_app OPEN> CREATE TABLE laptops (id INT);
CREATE TABLE
demo@127.0.0.1:53365/my_app OPEN> ALTER TABLE laptops ADD COLUMN employee_id INT REFERENCES employees (id);
ALTER TABLE
demo@127.0.0.1:53365/my_app OPEN> COMMIT;
COMMIT
demo@127.0.0.1:53365/my_app> SHOW CREATE laptops;
table_name | create_statement
-------------+---------------------------------------------------------------------------------------------------------
laptops | CREATE TABLE public.laptops (
| id INT8 NULL,
| employee_id INT8 NULL,
| CONSTRAINT fk_employee_id_ref_employees FOREIGN KEY (employee_id) REFERENCES public.employees(id),
| FAMILY "primary" (id, rowid, employee_id)
| )
(1 row)
CockroachDB在现实世界的OLTP工作负载上的性能有了明显的提高,这一点从我们的TPC-C基准测试结果中可以看出,TPC-C是OLTP基准测试的工业标准。此外,Cockroach实验室继续投资于服务那些读取大量数据的查询,比如在交易工作负载中发现的复杂连接和聚合。
使用TPC-H查询作为代表性的分析性查询,我们看到22个查询中的20个的查询延迟有所下降,查询9的延迟提高了80倍。
在20.1版本中,CockroachDB的矢量执行引擎只用于部分查询。20.2版本将默认开启矢量执行引擎,用于更多复杂的连接和聚合。矢量执行引擎允许更好的内存核算,这在面向行的执行引擎中是不可能的。要阅读更多关于我们如何建立一个矢量执行引擎的信息,请查看这篇文章。
我们还改进了查找连接和连接重排的性能,这是两个关键的数据库组件,其性能影响到许多查询。虽然对查找连接的改变使大多数TPC-H查询受益,但它对查询17的延迟增加有负面影响。这突出了在许多查询中优化执行的棘手路径,Cockroach实验室继续分析以获得新的改进。连接记录算法是CockroachDB基于成本的优化器(CBO)的一部分,随着我们的团队结合现场学习来选择最佳的查询执行计划,CBO在每个版本中都会变得更加智能。
通过矢量查询的执行、更好的查找连接和改进的连接记录,CockroachDB提高了执行效率,使开发者能够用同样的数据库资源做更多的事情。CBO的增强意味着查询将有更好的性能,而开发者不需要了解查询执行的复杂性。相反,开发人员可以专注于他们的应用技术挑战。
CockroachDB支持物化视图和部分索引
CockroachDB现在支持物化视图和部分索引,开发者可以利用它们来提高应用程序的性能。
物化视图允许开发者将查询结果存储为可查询的数据库对象。物化视图作为查询结果的缓存,可以通过REFRESH MATERIALIZED VIEW 来刷新。有了物化视图,开发人员可以有效地访问查询结果,但要权衡的是,一旦底层查询数据发生变化,物化视图数据就会过时。这种数据模型可以支持一些用例,如业务活动的每日报告,对于这些用例来说,拥有实时数据并不重要。
对于一个应用程序,某些查询访问模式可以被很好地定义,并且只针对数据的一个子集进行操作。部分索引可以帮助优化这些查询模式,与完整索引相比,对写入性能的影响更小。由于索引是数据的另一个副本,部分索引意味着并非每一次对表的写入都会产生更新完整索引的开销,并且存储更少的数据。
大多数应用程序都有对其使用情况至关重要的查询,或帮助实现服务级目标(SLO)。一旦确定了这些场景,CockroachDB为开发者提供了广泛的策略,包括物化视图和部分索引来帮助实现应用需求。
排除CockroachDB的故障
在20.2版本中,Cockroach实验室增加了从我们的cockroach sql 命令行和管理界面中对数据库进行检查的方法。这包括对数据库会话和事务进行反省的新方法。
总结
CockroachDB为开发者提供了熟悉的Postgres兼容的SQL界面,而这个数据库的设计无需增加应用的复杂性。开发人员可以利用上述的SQL功能来创建和改变复杂的、高性能的数据模型。我们对Postgres兼容的SQL的改进减少了第三方开发工具对CockroachDB的支持。
在20.2版本中,Cockroach Labs很高兴能与开发者社区合作,增加对Hibernate和Active Record的支持。随着Cockroach Labs不断为开发者提供更多的解决方案,我们致力于投资CockroachDB的CBO、矢量执行引擎以及其他提高整体数据库性能的内部机制。
通过尝试CockroachCloud来检查以上讨论的强大功能。