如何快速上手SQLess

2024年 5月 7日 73.5k 0

Github地址:https://github.com/oceanbase/sql-lifecycle-management

SQLess是一款从蚂蚁OceanBase场景孵化的SQL智能诊断优化产品,提供了贯穿研发、集成、运维和持续优化各个阶段的SQL闭环能力。SQLess的愿景是让用户花更少时间关心SQL风险,可以更专注于SQL业务逻辑本身:Less on SQL tuning,More to SQL doing。SQLess在支持OceanBase的同时,将支持MySQL/PostgreSQL等更多数据库,为更多数据库生态的用户提供服务,一起建设通用SQL能力的开源生态。

同时SQLess提供了清晰简单的前端页面,让我们跟随文章快速体验一下主要功能吧!~

安装部署

SQLess支持两种部署方式,本地部署和使用容器部署

本地部署

  • 执行环境: 推荐版本python == v3.8(tested on 3.8)
    建议使用conda((https://github.com/conda/conda))来创建虚拟环境
conda create --name slm_3.8 python=3.8
conda activate slm_3.8
  • 依赖安装
git clone https://github.com/oceanbase/sql-lifecycle-management.git
cd sql-lifecycle-management && make install
  • 数据库初始化
# 填写本地元数据库链接方式
cd sql-lifecycle-management && vim db.cfg
# 本地元数据库初始化
mysql -h host_ip -u user_name -p
source init/init.sql
  • 访问页面
cd sql-lifecycle-management && sh ./start.sh

访问页面http://localhost:8989

使用容器部署

  • build
git clone https://github.com/oceanbase/sql-lifecycle-management.git
cd sql-lifecycle-management
docker build -t <your_tag> .
  • run
docker run -itd -p 8989:8989 <image_id> /bin/bash
docker exec -it <container_id> /bin/bash
  • 元数据库配置
# in docker
vim db.cfg
  • 元数据库初始化
mysql -h host_ip -u user_name -p
source init/init.sql

如果没有现成的元数据库,您也可以使用Docker在本地安装mysql服务

docker run --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<your_password> -dit mysql:latest
  • visit web
sh ./start.sh

visit http://localhost:8989

页面使用

第一次访问

如何快速上手SQLess-1

点击 Add Database Engine

新增数据库资产/引擎

填写数据库版本和发布平台

如何快速上手SQLess-2

填写数据库名和唯一标识

如何快速上手SQLess-3

Optimize

选择需要的优化场景,点击SQL Optimize

如何快速上手SQLess-4

当前SQL Optimize支持三种不同的使用场景:

  1. 不使用统计信息,仅仅提供SQL文本进行优化
  2. table is online,并且提供了在线库的统计信息
  3. table is not online,并且手动输入了统计信息

不使用统计信息

如何快速上手SQLess-5

提供在线库统计信息

如何快速上手SQLess-6

点击Copy,将得到执行的SQL,比如:

(SELECT CAST(CONCAT('{"columns": [',IFNULL(@cols,''),'], "indexes": [',IFNULL(@indexes,''),'], "tables":[',IFNULL(@tbls,''),'],
                    "version": "', VERSION(), '"}') AS CHAR) as metadata_json FROM
 (SELECT (@cols:=NULL), (SELECT (0) FROM information_schema.columns cols
                            WHERE table_schema = 'sqless_test' AND table_name in ('sqless_base')
                            AND (0x00) IN (@cols:=CONCAT_WS(',', @cols, CONCAT('{"schema":"',cols.table_schema,'","table":"',cols.table_name,'",
                                                       "name":"', replace(cols.column_name,'"', '\"'), '","type":"', cols.column_type, '","nullable":',
                                                       IF(cols.IS_NULLABLE = 'YES', 'true', 'false'),  '}')))) ) cols,
 (SELECT (@indexes:=NULL), (SELECT (0) FROM information_schema.statistics indexes
                               WHERE table_schema = 'sqless_test' AND table_name in ('sqless_base')
                               AND (0x00) IN (@indexes:=CONCAT_WS(',', @indexes, CONCAT('{"schema":"',indexes.table_schema,'","table":"',indexes.table_name,'",
                                                             "name":"', indexes.index_name, '","column":"', indexes.column_name, '",
                                                             "cardinality":', indexes.cardinality, ',"unique":', IF(indexes.non_unique = 1, 'false', 'true'), '}')))) ) indexes,
 (SELECT (@tbls:=NULL), (SELECT (0) FROM information_schema.tables tbls
                            WHERE table_schema = 'sqless_test' AND table_name in ('sqless_base') AND (0x00) IN
                            (@tbls:=CONCAT_WS(',', @tbls, CONCAT('{', '"schema":"', `TABLE_SCHEMA`, '",', '"table":"', `TABLE_NAME`, '",', '"rows":',
                                         IFNULL(`TABLE_ROWS`, 0), ',', '"engine":"', IFNULL(`ENGINE`, ''), '"}')))) tbls) x);

将复制到的SQL文本,粘贴到在线的数据库中,获得一个schema的json

将获得的json贴到输入框中

如何快速上手SQLess-7

示例:

{"columns": [{"schema":"sqless_test","table":"sqless_base",
  "name":"a","type":"int(2)","nullable":false},{"schema":"sqless_test","table":"sqless_base",
  "name":"b","type":"int(2)","nullable":false}], "indexes": [{"schema":"sqless_test","table":"sqless_base",
  "name":"PRIMARY","column":"c",
  "cardinality":1,"unique":true}], "tables":[{"schema":"sqless_test","table":"sqless_base","rows":1,"engine":"InnoDB"}],
  "version": "5.7.36"}

然后点击Optimize获得优化的报告展示

人工提供统计信息

选择table is not online,点击Manual Configuration

如何快速上手SQLess-8

可以人为调整表大小和每个列的过滤性

如何快速上手SQLess-9

上传create table ddl

如何快速上手SQLess-10

报告展示

三种模式呈现的报告样式相同,提供索引建议、PMD扫描建议和SQL Rewrite建议。

如何快速上手SQLess-11

Review

跟optimize不同的是,optimize针对的是单SQL场景的优化

review针对的是提供某个xml的优化

当前只支持Mybatis,其他orm框架暂不支持

如何快速上手SQLess-12

上传orm xml文件,同时也可以类似optimize一样,增加create table ddl来帮助优化

如何快速上手SQLess-13

报告展示,Summary会呈现一个整体的情况,点击每一行的view即表示展示某个单一SQL的优化信息,和Optimize相同

如何快速上手SQLess-14

Analysis

功能类似于Review,只是上传的文件不同;Review针对于ORM框架中xml的解析,Analysis针对于slow log的解析

如何快速上手SQLess-15

报告展示和Analysis相同

如何快速上手SQLess-16

Monitor

配置监控

点击Database Asset,选择要配置的监控库,点击Update Monitor

如何快速上手SQLess-17

配置库的连接信息和数据采集内容

目前OceanBase支持4个维度的信息采集:SQL、执行计划、Schema和统计信息

如何快速上手SQLess-18

性能数据查询

监控信息配置完毕后,点击SQL Montior Tab,查询监控数据

选择配置了采集任务的目标库,选择对应时间,点击查询

不同数据库引擎展示的指标不同,以下展示OceanBase的性能指标

如何快速上手SQLess-19

点击左边的SQLID字段,可以展示这个SQL的详细信息,提供优化建议

如何快速上手SQLess-20

也可以点击执行详情展示该SQL在不同采集批次内的详细性能信息

如何快速上手SQLess-21

执行路径Tab页主要展示索引信息,列的NDV数据、SQL的执行计划信息

如何快速上手SQLess-22

如何快速上手SQLess-23

如何快速上手SQLess-24

加入我们

SQLess致力于将开源社区打造成一个开放和有创造力的社区。欢迎任何形式的参与,包括且不限于提问、代码贡献、技术讨论等。期待收到社区想法和反馈,以推动项目持续前进。

Star us, join us, and rock the SQL together!

如何快速上手SQLess-25如何快速上手SQLess-26

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论