前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SOAR 101 快速入门指南

SOAR 101 快速入门指南

作者头像
DevOps云学堂
发布2019-11-23 08:53:11
6720
发布2019-11-23 08:53:11
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

本文介绍了soar可以提供的功能以及一些使用场景,并给出相关用例。

上篇文章回顾:dpdk-lvs的一次线上故障排查报告

soar开源两周以来,在Github获得了社区2700+颗星的支持,这期间有很多的开源社区同学参与到soar的成长当中,为我们提供了许多优秀的意见和建议。

我们希望能够有更多的人来感受一下这款“SQL优化神器”能够带给你的方便和快捷,这篇文章将会对soar可以提供的功能以及一些使用场景做出介绍,并给出相关用例。

基本用法

1

代码语言:javascript
复制
echo "select title from sakila.film" | ./soar -log-output=soar.log

soar可以通过管道的方式接受传入的SQL,也可以通过-query的方式来传入SQL或指定输入源。使用方式示例如下:

代码语言:javascript
复制
# 从文件读取SQL 
./soar -query file.sql

# 从管道读取SQL 
cat file.sql | ./soar

在日常使用的时候,如果您是为了快速获得简单SQL的评审结果,可以用命令行方式进行传入。但我们建议使用文件的方式进行传入,来避免可能存在的转义问题。

制定配置文件

2

在之前的系列文章中我们提到了配置文件的重要性,配置的正确性决定了soar的服务质量。用户可以通过以下案例的方式来编辑soar的配置文件。在不指定配置文件的情况下,soar默认会从依次检查/etc/soar.yaml,./etc/soar.yaml以及./soar.yaml这三个路径,配置文件优先级依次递减。

代码语言:javascript
复制
vi soar.yaml 
# yaml format config file 
online-dsn:
  addr: 127.0.0.1:3306
  schema: sakila
  user: root 
  password: "1t'sB1g3rt" 
  disable: falsetest-dsn: 
  addr: 127.0.0.1:3306
  schema: sakila
  user: root
  password: "1t'sB1g3rt"
  disable: false

如果您需要临时指定某些变量,可以用命令行参数的形式来指定需要的变量。命令行模式下的配置设置优先级最高。

代码语言:javascript
复制
echo "select title from sakila.film" | ./soar -test-dsn="root:1t'sB1g3rt@127.0.0.1:3306/sakila" -allow-online-as-test -log-output=soar.log

但通过命令行的方式输入配置可能会存在转义的问题,您也可以使用-config的方式来指定您需要的配置文件。

代码语言:javascript
复制
echo "select title from sakila.film" | ./soar -config=mysoar.yaml -allow-online-as-test -log-output=soar.log

启发式规则

3

您可以通过-list-heuristic-rules的方式来查看目前soar支持的全部启发式规则建议,默认输出的是markdown格式的文档,您可以重定向到一个文件中进行查看,soar提供的启发式建议的相关文档就是通过这一方式生成的。

代码语言:javascript
复制
$ soar -list-heuristic-rules

忽略某些规则

soar中是可以通过配置-ignore-rules的方式来忽略某些建议的输出。可以用正则的方式来进行全局匹配,也可以指定某个特定的规则item来进行精准屏蔽,多条规则之间用逗号分离。

代码语言:javascript
复制
$ soar -ignore-rules "ALI.001,IDX.*"

丰富的报告格式

4

soar支持多种输出方式,默认情况下为markdown格式的输出,您可以根据需要设置您的输出方式,比如json,比如html等。

代码语言:javascript
复制
$ soar -report-type json

-reprot-type除了可以调整输出格式,某些特定的功能也是以-report-type的方式来提供的。比如SQL重写,比如fingerprint等。与查看启发式规则一样,想要查看soar支持的全部-report-type,可以通过-list-report-types的方式来查看支持的全部使用方式。

代码语言:javascript
复制
$ soar -list-report-types

快捷的语法检查工具

5

虽然soar的功能非常丰富,但是在某些特定情况下,比如写了一条SQL却并不能肯定语法是否是正确的,那么可以通过soar提供的语法检查工具来对SQL语法进行检查,此时只会检查语法的正确性而不会进行一步的评审。

代码语言:javascript
复制
$ echo "select * from tb" | soar -only-syntax-check 
$ echo $?0$ echo "select * fromtb" | soar -only-syntax-check
At SQL 0 : syntax error at position 16 near 'fromtb'$ echo $? 
1

SQL重写

6

soar提供了一定的基于抽象语法树实现的SQL重写能力。虽然现在这一个功能尚处于研发测试阶段,但是某些小的功能已经相对比较完善了,以下举例几个简单地重写使用场景。

将UPDATE/DELETE/INSERT语法转为SELECT

在某些情况下,我们需要对非查询语句进行性能分析,为了保证安全,我们可以先通过soar将这些语句转化成等价的select语句,在对这些查询语句进行进一步分析。

代码语言:javascript
复制
$ echo "update film set title = 'abc'" | soar -rewrite-rules dml2select,delimiter -report-type rewrite

输出

代码语言:javascript
复制
select * from film;

输入标题合并多条ALTER语句

当线上数据库环境需要需要进行更新操作时,为了让某些在线改表工具正确的执行,我们应该将同一张表的多条alter语句合并为一条。soar提供了这样的功能来方便研发人员或DBA进行合并。

代码语言:javascript
复制
$ echo "alter table tb add column a int; alter table tb add column b int;" | soar -report-type rewrite -rewrite-rules mergealter

输出

代码语言:javascript
复制
ALTER TABLE `tb` add column a int, add column b int ;

EXPLAIN信息分析报告

7

有时我们获取到了EXPLAIN信息,但可能对于MySQL EXPLAIN的内容不熟悉。您可以将mysql输出的EXPLAIN信息交给soar,来帮助辅助解读其中的信息。这里传入的explain可以是普通的表格,也可以是MySQL的JSON格式EXPLAIN。

代码语言:javascript
复制
$ soar -report-type explain-digest << EOF 
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------+ 
| 1 | SIMPLE | film | ALL | NULL | NULL | NULL | NULL | 1131 | | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
EOF

默认输出结果为markdown格式。

代码语言:javascript
复制
## Explain信息 
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---| 
| 1 | SIMPLE | *film* | NULL | ALL | NULL | NULL | NULL | NULL | 0 | 0.00% | ☠️ **O(n)** | | 
### Explain信息解读 
#### SelectType信息解读
* **SIMPLE**: 简单SELECT(不使用UNION或子查询等).
#### Type信息解读
* ☠️ **ALL**: 最坏的情况, 从头到尾全表扫描.

markdown转HTML

8

如果您没有适合的markdown工具,soar也自带了markdown转html这样的功能,尽可能的让所有人都能感受到soar原生报告的优雅。你还可以通过指定-report-css, -report-javascript, -markdown-extensions, -markdown-html-flags这些参数控制HTML的显示格式。

代码语言:javascript
复制
$ cat test.md | soar -report-type md2html > test.html

清理测试环境残余的临时库表

9

如配置了-drop-test-temporary=false或soar异常中止,-test-dsn中会残余以optimizer_为前缀的临时库表。手工清理这些库表可以使用如下命令。

注意:为了不影响正在进行的其他SQL评审,-cleanup-test-database中会删除1小时前生成的临时库表。

代码语言:javascript
复制
./soar -cleanup-test-database
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps持续集成 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档