数据库版本:
OceanBase_CE-v4.3.5.3
集群配置:
租户资源配置:10核32G
TPCH数据量:80G
执行SQL:
select count(1) from supplier
经常性查不出数据(1000秒也查不出),有时候0.2秒出数据。集群还没正式在业务启用,新的集群
数据量:507100
数据库版本:
OceanBase_CE-v4.3.5.3
集群配置:
租户资源配置:10核32G
TPCH数据量:80G
执行SQL:
select count(1) from supplier
经常性查不出数据(1000秒也查不出),有时候0.2秒出数据。集群还没正式在业务启用,新的集群
数据量:507100
表是否有主键 索引。手动收集下统计信息再试试呢?
CREATE TABLE `partsupp` (
`ps_partkey` bigint(20) NOT NULL,
`ps_suppkey` bigint(20) NOT NULL,
`ps_availqty` bigint(20) DEFAULT NULL,
`ps_supplycost` bigint(20) DEFAULT NULL,
`ps_comment` varchar(199) COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`ps_partkey`, `ps_suppkey`)
) ORGANIZATION INDEX DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 TABLEGROUP = 'tpch_tg_partsupp_part'
partition by key(ps_partkey)
(partition `p0`,
partition `p1`,
partition `p2`,
partition `p3`,
partition `p4`,
partition `p5`,
partition `p6`,
partition `p7`,
partition `p8`,
partition `p9`)
使用的是官方提供的TPCH建表语句:https://github.com/oceanbase/obdeploy/blob/master/plugins/tpch/3.1.0/create_tpch_mysql_table_part.ddl
如果遇到查询不出情况参考下面方法提供一下相关信息,或使用obdiag采集一下异常sql
1)设置trace信息
SET ob_enable_show_trace=‘ON’;
2)执行sql。
3)获取上个命令的trace
select last_trace_id();
4)获取trace对应的节点
select query_sql,svr_ip from gv$ob_sql_audit where trace_id=‘第三步获取的trace信息’;
5)取对应的svr_ip节点 过滤日志
grep “第三步获取的trace信息” observer.log*
grep “第三步获取的trace信息” rootservice.log*
obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”
有一点疑问:
2)执行sql。
3)获取上个命令的trace
select last_trace_id();
我的SQL一直跑不完执行中。 如何执行select last_trace_id()呢?
count(1)语句50w行数据查不出来感觉数据库存在问题,先发一份observer日志看看
A机器上装的OBD,并且安装OBProxy
三个ServerZone的机器是B、C、D。
应该贴哪个Server的observer.log呢
执行SQL使用A机器的OBProxy 的方式连接
还有个线索:
select count(1) from partsupp -- 查不出
select count(1) from partsupp PARTITION(p2,p5,p8,p1,p3,p4,p6,p7,p9,p0); -- 秒出(0.3秒)
select count(1) from partsupp PARTITION(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9); -- 查不出
统计信息问题吧
explain select count(1) from partsupp ; 执行计划看下 这个不会执行,秒出
可不可能 丢 包 ??? 这么小的数据量,explain 看着收集统计信息了。
select /*+ parallel(8) */ count(1) from partsupp ;
增加并行指令也不行,丢包? 从何看起,你指的是我本地到OBProxy之间,还是OBProxy到OBServer之间? 按说不至于。
select 'partsupp',count(1) from partsupp PARTITION(p2,p5,p8,p1,p3,p4,p6,p7,p9,p0)
为什么这个就秒出。 只是增加了强制从所有分区读取数据(结合前贴,表被分成了10个分区),他就没事
select count(1) from partsupp PARTITION(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9); -- 查不出
这样就不行,区别仅仅是前者我是按照Server分组的顺序来(结合前贴我贴的标分布图),后置是按分区号的顺序来
还有个线索,我新建了DB,还利用TPCH生成了partsupp这张表,但是建表的时候不再设置分区策略(对比之下之前那张表50W数据分了3个Server总计10个分区),填充了24000000行数据,select count(1)秒出
学习了。但是没有明白造成问题的原因。
在执行 select count(1) 的时候,换个窗口查询 select * from gv$ob_processlist; 获取到trace_id
gv$sql_plan_monitor 根据trace_id 查看各个执行计划的算子 耗时 -物理执行计划
查看逻辑执行计划
set ob_query_timeout=1000000;
SELECT DBMS_XPLAN.DISPLAY_ACTIVE_SESSION_PLAN(3221668463,‘typical’,‘172.28.15.212’,‘2882’) --mysql模式
截图看下
gv$sql_plan_monitor在业务租户下是个空视图,在系统租户有数据,但是根据
select * from gv$ob_processlist查出的trace_id没有数据。
SVR_IP | SVR_PORT | SQL_PORT | ID | USER | HOST | DB | TENANT | COMMAND | TIME | TOTAL_TIME | STATE | INFO | PROXY_SESSID | MASTER_SESSID | USER_CLIENT_IP | USER_HOST | RETRY_CNT | RETRY_INFO | SQL_ID | TRANS_ID | THREAD_ID | SSL_CIPHER | TRACE_ID | TRANS_STATE | ACTION | MODULE | CLIENT_INFO | LEVEL | SAMPLE_PERCENTAGE | RECORD_POLICY | LB_VID | LB_VIP | LB_VPORT | IN_BYTES | OUT_BYTES | USER_CLIENT_PORT | PROXY_USER | SERVICE_NAME | TOTAL_CPU_TIME | TOP_INFO | MEMORY_USAGE |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
192.168.3.2 | 2882 | 2881 | 2098472941 | root | 192.168.0.242:56306 | tpchtest | tpch | Query | 5.123369 | 416.381605 | ACTIVE | select count(1) from partsupp | 13882346890940579955 | 117.158.147.195 | % | 96 | -4265 | E25990F47499EBFBC20C482A6C1FE399 | 0 | 3706606 | YB42C0A80302-000640CA6DDE6AD0-0-0 | 1 | 10 | SAMPLE_AND_SLOW_QUERY | 0 | 0 | 60324 | 5 |
查询语句:
select * from gv$sql_plan_monitor where TRACE_ID='YB42C0A80302-000640CA6DDE6AD0-0-0'
没有结果
查看逻辑执行计划
SELECT DBMS_XPLAN.DISPLAY_ACTIVE_SESSION_PLAN(2098472941,'typical','192.168.3.2','2882') -- mysql模式
结果:
==================================================================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
------------------------------------------------------------------------------------------------------------------
|0 |SCALAR GROUP BY | |1 |10555 |0 |0 |0 |0 |
|1 |└─PX COORDINATOR | |1 |10555 |0 |0 |0 |0 |
|2 | └─EXCHANGE OUT DISTR |:EX10000|1 |10555 |0 |0 |0 |0 |
|3 | └─MERGE GROUP BY | |1 |10554 |0 |0 |0 |0 |
|4 | └─PX PARTITION ITERATOR| |507100 |1364 |0 |0 |0 |0 |
|5 | └─TABLE FULL SCAN |partsupp|507100 |1364 |0 |0 |0 |0 |
==================================================================================================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))]), filter(nil), rowset=256
group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))])
1 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
2 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
dop=1
3 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))])
4 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256
force partition granule
5 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256
access(nil), partitions(p[0-9])
is_index_back=false, is_global_index=false,
range_key([partsupp.ps_partkey], [partsupp.ps_suppkey]), range(MIN,MIN ; MAX,MAX)always true,
pushdown_aggregation([T_FUN_COUNT(*)])
这样查一下
SELECT DBMS_XPLAN.DISPLAY_ACTIVE_SESSION_PLAN(2098472941,‘all’,‘192.168.3.2’,‘2882’) – mysql模式
如果不使用obproxy的话 直连的时候 是否有这样的问题 有时候查不出来数据
集群三个服务器分别直连的结果:
192.168.0.158 秒出
192.168.2.221 20秒
192.168.3.2 查不出
当我使用OBProxy的时候观察ob_processlist,有时候SVR_IP会是192.168.3.2,结果就是查不出,有时候会是192.168.2.221 ,很慢,几十秒,能查出。
学习了
SELECT DBMS_XPLAN.DISPLAY_ACTIVE_SESSION_PLAN(3222062055,'all','192.168.3.2','2882')
==================================================================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)|
------------------------------------------------------------------------------------------------------------------
|0 |SCALAR GROUP BY | |1 |10555 |0 |0 |0 |0 |
|1 |└─PX COORDINATOR | |1 |10555 |0 |0 |0 |0 |
|2 | └─EXCHANGE OUT DISTR |:EX10000|1 |10555 |0 |0 |0 |0 |
|3 | └─MERGE GROUP BY | |1 |10554 |0 |0 |0 |0 |
|4 | └─PX PARTITION ITERATOR| |507100 |1364 |0 |0 |0 |0 |
|5 | └─TABLE FULL SCAN |partsupp|507100 |1364 |0 |0 |0 |0 |
==================================================================================================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))]), filter(nil), rowset=256
group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT_SUM(T_FUN_COUNT(*)))])
1 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
2 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
dop=1
3 - output([T_FUN_COUNT_SUM(T_FUN_COUNT(*))]), filter(nil), rowset=256
group(nil), agg_func([T_FUN_COUNT_SUM(T_FUN_COUNT(*))])
4 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256
force partition granule
5 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256
access(nil), partitions(p[0-9])
is_index_back=false, is_global_index=false,
range_key([partsupp.ps_partkey], [partsupp.ps_suppkey]), range(MIN,MIN ; MAX,MAX)always true,
pushdown_aggregation([T_FUN_COUNT(*)])
Used Hint:
-------------------------------------
/*+
*/
Qb name trace:
-------------------------------------
stmt_id:0, SEL$1 > SEL$EA493D33
Outline Data:
-------------------------------------
/*+
BEGIN_OUTLINE_DATA
GBY_PUSHDOWN(@"SEL$EA493D33")
PQ_GBY(@"SEL$EA493D33" LOCAL)
FULL(@"SEL$EA493D33" "tpchtest"."partsupp"@"SEL$1")
SIMPLIFY_GROUP_BY(@"SEL$1")
OPTIMIZER_FEATURES_ENABLE('4.3.5.3')
END_OUTLINE_DATA
*/
Optimization Info:
-------------------------------------
partsupp:
table_rows:507100
physical_range_rows:507100
logical_range_rows:507100
index_back_rows:0
output_rows:507100
table_dop:1
dop_method:Table DOP
avaiable_index_name:[partsupp]
stats info:[version=1970-01-01 08:00:00.000000, is_locked=0, is_expired=0]
dynamic sampling level:0
estimation method:[DEFAULT, STORAGE]
Plan Type:
DISTRIBUTED
Parameters:
:0 => 1
Note:
Degree of Parallelisim is 1 because of table property
Const Parameter Constraints:
:0 = 1