如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦
一、问题背景
自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句来查询表或索引的存储方式。那么,具体该如何操作呢?

二、测试表
说明:这里仅列举了部分组合,还有其他的组合应该也是类似的,不再赘述,欢迎测试,拍砖。
-- 行存表,行存索引
create table t1(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t1_c2(c2)) partition by hash(c1) partitions 3;
create table t2(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t2_c2(c2)) partition by hash(c1) partitions 3 with column group(all columns);
create table t3(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t3_c2(c2) with column group(all columns)) partition by hash(c1) partitions 3 with column group(all columns);-- 行存表,纯列存索引
create table t4(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t4_c2(c2) with column group(each column)) partition by hash(c1) partitions 3;-- 行存表,行列混合索引
create table t5(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t5_c2(c2) with column group(each column,all columns)) partition by hash(c1) partitions 3;-- 纯列存表,行存索引
create table t6(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t6_c2(c2) with column group(all columns)) partition by hash(c1) partitions 3 with column group(each column);
create table t7(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t7_c2(c2)) partition by hash(c1) partitions 3 with column group(each column);-- 行列混合表,行列混合索引
create table t8(c1 int,c2 int,c3 int,c4 int,c5 int,primary key(c1),key idx_t8_c2(c2) with column group(each column,all columns)) partition by hash(c1) partitions 3 with column group(each column,all columns);
三、摸索
从列存相关的语法上可以看出,引入列存后新增加了 with column group (xxx) 的关键字,可以尝试搜一下哪些表的列上涉及了 column_group 相关的字段,从下面的结果看目前并没有标准表或者视图提供这样的信息。
MySQL [oceanbase]> select distinct table_name from __all_virtual_table
where table_id in (select distinct table_id from __all_virtual_column where column_name like '%column_group%');
+--------------------------------------------+
| table_name |
+--------------------------------------------+
| __all_table_history |
| __all_column_group |
| __all_column_group_history |
| __all_column_group_mapping |
| __all_column_group_mapping_history |
| __all_virtual_core_all_table |
| __all_virtual_table |
| __all_virtual_table_history |
| __all_virtual_column_group |
| __all_virtual_column_group_mapping |
| __all_virtual_column_group_history |
| __all_virtual_column_group_mapping_history |
+--------------------------------------------+
12 rows in set (0.97 sec)
从 __all_virtual_column_group 表的 column_group_type 字段,凭感觉可以标识。
MySQL [oceanbase]> desc __all_virtual_column_group;
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| tenant_id | bigint(20) | NO | PRI | NULL | |
| table_id | bigint(20) | NO | PRI | NULL | |
| column_group_id | bigint(20) | NO | PRI | NULL | |
| gmt_create | timestamp(6) | NO | | NULL | |
| gmt_modified | timestamp(6) | NO | | NULL | |
| column_group_name | varchar(389) | NO | | | |
| column_group_type | bigint(20) | NO | | NULL | |
| block_size | bigint(20) | NO | | NULL | |
| compressor_type | bigint(20) | NO | | NULL | |
| row_store_type | bigint(20) | NO | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
10 rows in set (0.02 sec)
从代码 src/share/schema/ob_schema_struct.h 找到 column_group 类型的枚举值。
enum ObColumnGroupType : uint8_t
{DEFAULT_COLUMN_GROUP = 0,ALL_COLUMN_GROUP,ROWKEY_COLUMN_GROUP,SINGLE_COLUMN_GROUP,NORMAL_COLUMN_GROUP,MAX_COLUMN_GROUP
};
四、结论
经过测试发现如何标识 表或者索引是行存/纯列存/行列冗余的方式存储,这里之所以给 "结论"使用引号扩起来,原因:
1、受限于自己测试的 case 可能不完善,存在错误的情况,欢迎一起测试,交流。
2、随着版本的迭代,针对枚举值可能会有调整/比如增删等,应以实际版本中的枚举值为准。
- 某个租户下当同一个 table_id 的 column_group_type 包含3 但是不包含1,输出:纯列存表
- 某个租户下当同一个 table_id 的 column_group_type 包含1 和 3,输出:行列混合表
- 其他情况均输出 :纯行存表
五、查询sql和结果
说明:可以按需调整 tenant_name/database_name
sql_1(混合查询)
select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_name
from __all_virtual_column_group cg
join dba_ob_tenants t1 on cg.tenant_id = t1.tenant_id
join cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_id
left join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_id
where t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')
group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
order by t1.tenant_name,t2.database_name, t2.table_name;
sql1_查询结果
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| test1 | row_column_db | t1 | 596454 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t2 | 596462 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t3 | 596470 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | t4 | 596478 | NULL | USER TABLE | 纯行存表 | NULL |
| test1 | row_column_db | idx_t1_c2 | 596455 | 596454 | INDEX | 纯行存索引 | t1 |
| test1 | row_column_db | idx_t2_c2 | 596463 | 596462 | INDEX | 纯行存索引 | t2 |
| test1 | row_column_db | idx_t3_c2 | 596471 | 596470 | INDEX | 纯行存索引 | t3 |
| test1 | row_column_db | idx_t4_c2 | 596479 | 596478 | INDEX | 纯列存索引 | t4 |
| test7 | db100 | t8 | 500070 | NULL | USER TABLE | 行列混合表 | NULL |
| test7 | db100 | idx_t8_c2 | 500071 | 500070 | INDEX | 行列混合索引 | t8 |
| test7 | db600 | t5 | 500045 | NULL | USER TABLE | 纯行存表 | NULL |
| test7 | db600 | t6 | 500053 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | t7 | 500061 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | idx_t5_c2 | 500046 | 500045 | INDEX | 行列混合索引 | t5 |
| test7 | db600 | idx_t6_c2 | 500054 | 500053 | INDEX | 纯行存索引 | t6 |
| test7 | db600 | idx_t7_c2 | 500062 | 500061 | INDEX | 纯行存索引 | t7 |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
16 rows in set (3.45 sec)
sql2_查询纯列存的表/索引
select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_name
from __all_virtual_column_group cg
join dba_ob_tenants t1 on cg.tenant_id = t1.tenant_id
join cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_id
left join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_id
where t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')
group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
having(t2.table_type = 'user table' and sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0)or(t2.table_type = 'index' and sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0)
order by t1.tenant_name, t2.database_name, t2.table_name;
sql2_查询结果
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
| test1 | row_column_db | idx_t4_c2 | 596479 | 596478 | INDEX | 纯列存索引 | t4 |
| test7 | db600 | t6 | 500053 | NULL | USER TABLE | 纯列存表 | NULL |
| test7 | db600 | t7 | 500061 | NULL | USER TABLE | 纯列存表 | NULL |
+-------------+---------------+------------+----------+---------------+------------+-----------------+-----------------+
3 rows in set (3.48 sec)
sql3_查询行列冗余的表/索引
SELECT tenant_name,database_name,table_name,table_id,data_table_id,table_type,storage_type,main_table_name
FROM (select t1.tenant_name,t2.database_name,case when t2.table_type = 'user table' then t2.table_namewhen t2.table_type = 'index' then t2.index_nameend as table_name,t2.table_id,t2.data_table_id,t2.table_type,casewhen t2.table_type = 'user table' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存表'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合表'else '纯行存表'endwhen t2.table_type = 'index' thencasewhen sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) = 0 then '纯列存索引'when sum(case when cg.column_group_type = 3 then 1 else 0 end) > 0 and sum(case when cg.column_group_type = 1 then 1 else 0 end) > 0 then '行列混合索引'else '纯行存索引'endend as storage_type,coalesce(t3.table_name, null) as main_table_namefrom __all_virtual_column_group cgjoin dba_ob_tenants t1 on cg.tenant_id = t1.tenant_idjoin cdb_ob_table_locations t2 on cg.tenant_id = t2.tenant_id and cg.table_id = t2.table_idleft join cdb_ob_table_locations t3 on t2.data_table_id = t3.table_idwhere t1.tenant_name in ('test1','test7')and t2.database_name in ('row_column_db','db100','db600')and t2.table_type in ('user table', 'index')group by t1.tenant_name, t2.database_name, t2.table_name, t2.table_id, t2.data_table_id, t2.table_type, main_table_name
) subquery
WHERE storage_type IN ('行列混合表', '行列混合索引')
ORDER BY tenant_name, database_name, table_name;
sql3_查询结果
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| tenant_name | database_name | table_name | table_id | data_table_id | table_type | storage_type | main_table_name |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
| test7 | db100 | idx_t8_c2 | 500071 | 500070 | INDEX | 行列混合索引 | t8 |
| test7 | db100 | t8 | 500070 | NULL | USER TABLE | 行列混合表 | NULL |
| test7 | db600 | idx_t5_c2 | 500046 | 500045 | INDEX | 行列混合索引 | t5 |
+-------------+---------------+------------+----------+---------------+------------+--------------------+-----------------+
3 rows in set (3.33 sec)相关文章:
如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦
一、问题背景 自OceanBase 4.3.0版本起,支持了列存引擎,允许表和索引以行存、纯列存或行列冗余的形式创建,且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外,也有用户询问如何通过SQL语句…...
回归预测 | MATLAB实GRU多输入单输出回归预测
回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…...
【OpenGL/Assimp】渲染模型、半透明材质与封装光源
文章目录 渲染成果Assimp库准备:Mesh类修改:透明贴图使用:光源封装:使用方式在如下测试环境中: 渲染成果 Assimp库准备: 从GitHub拉取源码,根据网络教程,借助CMake生成VS工程项目&a…...
pandas与sql对应关系【帮助sql使用者快速上手pandas】
本页旨在提供一些如何使用pandas执行各种SQL操作的示例,来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...
音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流
通过FFmpeg命令可以将一个媒体文件转推RTP: ffmpeg -re -stream_loop -1 -i input.mp4 -c:v copy -an -f rtp rtp://192.168.0.102:5400 但是通过ffplay尝试播放上述产生的RTP流时会报错:“Unable to receive RTP payload type 96 without an SDP file …...
大语言模型预训练、微调、RLHF
转发,如有侵权,请联系删除: 1.【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF) 2.老婆饼里没有老婆,RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...
vue3后台系统动态路由实现
动态路由的流程:用户登录之后拿到用户信息和token,再去请求后端给的动态路由表,前端处理路由格式为vue路由格式。 1)拿到用户信息里面的角色之后再去请求路由表,返回的路由为tree格式 后端返回路由如下: …...
解决idea中无法拖动tab标签页的问题
1、按 Ctrl Alt S 打开设置,找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可...
WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)
一、项目背景和建设目标 随着企业业务的不断扩展,仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率,本方案旨在构建一套全面、高效、易用的仓库管理系统(WMS)。该系统将涵盖库…...
25/1/12 嵌入式笔记 学习esp32
了解了一下位选线和段选线的知识: 位选线: 作用:用于选择数码管的某一位,例如4位数码管的第1位,第2位) 通过控制位选线的电平(高低电平),决定当前哪一位数码管处于激活状…...
【NLP】ELMO、GPT、BERT、BART模型解读及对比分析
文章目录 一、基础知识1.1 Word Embedding(词嵌入)1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…...
go语言学习(数组,切片,字符串)
字符串 如果里面存储的是汉字,那么其实就是存储的是UTF--8编码,所以一个字会对应多个字节.如果想要获取汉字的个数,可以使用rune,来处理unicode字符 length: utf8.RuneCountInString( s) 如果只使用len()获取的是字节的个数, 字符串的功能 1,获取字节长度 len(xx) 2,获取字…...
PM 实战 - 智能药盒PRD + 市场规模分析
写在前面 智能硬件 PRD 实例资源很少,Po下个人作品,假定前提为to Boss需求,目标在于覆盖产品设计核心部分(用户画像Persona、产品逻辑图、产品架构图、软件原型图、硬件低保真设计、用例Use Case、硬件标准)。不是申请…...
SQL刷题快速入门(二)
其他章节:SQL刷题快速入门(一) 承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下…...
hive迁移后修复分区慢,怎么办?
我有1个30TB的分区表,客户给的带宽只有600MB,按照150%的耗时来算,大概要迁移17小时。 使用hive自带的修复分区命令(一般修复分区比迁移时间长一点),可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...
代码随想录算法训练营day27
代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天,希望自己能够坚持下来! 今日任务: ● 贪心算法理论基础 ● 455.…...
python 代码使用 DeepXDE 库实现了一个求解二维非线性偏微分方程(PDE)的功能
import deepxde as dde import numpy as np import matplotlib.pyplot as plt import tensorflow as tf# 设置时空计算域 Lx 1 # x 范围从 0 到 1 Ly 1 # y 范围从 0 到 1 Lt 0.05 # t 范围从 0 到 0.05 geom dde.geometry.Rectangle([0, 0], [Lx, Ly]) # 空间域 timed…...
【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...
VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。
以下是一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源(可以提高安装速度): bash复制代码 npm config set registry https://registry…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
