PCSD考题回顾与答案解析

原创
02/23 00:00
阅读数 760

原文来源:https://tidb.net/blog/df57d8ad

说明1:本文题目仅代表笔者考试时的题目,不代表所有PCSD考题范围。

说明2:所有题目的答案解析均为笔者自行总结,非标准答案。如读者发现有误,可留言告知。

第1题:查询1.1E0+2.2E0=3.3E0的输出是?

A.一定是1

B.会报错

C.可能是0

D.会警告

解析:1.1E0、2.2E0这种科学记数法在TiDB中表示的是近似值(浮点)数,相加后的结果也是近似值,因此这题应该选 C。

https://dev.mysql.com/doc/refman/8.0/en/number-literals.html

mysql> select 1.1E0+2.2E0=3.3E0;
+-------------------+
| 1.1E0+2.2E0=3.3E0 |
+-------------------+
| 0 |
+-------------------+
1 row in set (0.00 sec)
mysql> select 1.1E0+2.2E0;
+--------------------+
| 1.1E0+2.2E0 |
+--------------------+
| 3.3000000000000003 |
+--------------------+
1 row in set (0.00 sec)

第2题:在事务中进行数据修改时(INSERT,UPDATE,DELETE),FOREIGN KEY约束会在事务的哪个阶段检查检验?

A.当DML命令执行时

B.如果不把tidb_disable_txn_auto_retry设置为OFF,FOREIGN KEY约束就不会被检查

C.FOREIGN KEY约束不会被强制检查

D.当事务COMMIT时

解析:TiDB 支持是否开启外键约束检查,由系统变量 foreign_key_checks 控制,其默认值是 ON。在 INSERT 或者 UPDATE 子表时,外键约束会检查父表中是否存在对应的外键值,并对父表中的该行数据上锁,避免该外键值被其他操作删除,导致破坏外键约束。

因此这题应该选A。

https://docs.pingcap.com/zh/tidb/stable/foreign-key#%E5%A4%96%E9%94%AE%E7%BA%A6%E6%9D%9F%E6%A3%80%E6%9F%A5

第3题:以下所有语句均成功执行,最后SELECT语句能否返回被INSERT语句插入的行?

BEGIN;

INSERT INTO test.u1 VALUES(100);

BEGIN;

ROLLBACK;

SELECT * FROM test.u1;

A.可以

B.不可以

解析:第二个BEGIN会触发隐式提交。因此这题应该选A。

https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO test.u1 VALUES(100);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM test.u1;
+------+
| a |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM test.u1;
+------+
| a |
+------+
| 100 |
+------+
1 row in set (0.00 sec)
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM test.u1;
+------+
| a |
+------+
| 100 |
+------+
1 row in set (0.00 sec)

第4题:关于CHAR数据类型,描述正确的是?

A.CHAR(10)表示定长10个字符

B.CHAR(10)表示变长10个字符

C.CHAR(10)表示变长10个字节

D.CHAR(10)表示定长10个字节

解析:关于CHAR类型的官方解释 "定长字符串。CHAR 列的长度固定为创建表时声明的长度。M 表示列长度(字符的个数,不是字节的个数)。长度可以为从 0 到 255 的任何值。和 VARCHAR 类型不同,CHAR 列在写入时会对数据末尾的空格进行截断。"

因此这题应该选A。

https://docs.pingcap.com/zh/tidb/stable/data-type-string#char-%E7%B1%BB%E5%9E%8B

mysql> create table testchar(a char(10));
Query OK, 0 rows affected (1.53 sec)
mysql> insert into testchar values('ABCDEFGHIJ');
Query OK, 1 row affected (0.01 sec)
mysql> insert into testchar values('ABCDEFGHIJK');
ERROR 1406 (22001): Data too long for column 'a' at row 1
mysql> insert into testchar values('一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
mysql> insert into testchar values('一二三四五六七八九十一');
ERROR 1406 (22001): Data too long for column 'a' at row 1

第5题:查询SELECT 'A'=' A'的结果是?

A.警告

B.报错

C.0

D.1

解析:默认情况下'A'和' A'不相等,因此这题应该选C。

mysql> select 'A'=' A';
+----------+
| 'A'=' A' |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)

第6题:以下哪种TiDB实例是有状态的?

A.MVCC Server

B.TiDB Server

C.TiRow Server

D.Placement Driver Server

解析:MVCC Server和TiRow Server不存在,TiDB Server是计算层无状态,PD Server存储元数据是有状态的。因此这题应该选D。

第7题:查询SELECT now() WHERE null=null;它的返回结果是?

A.警告,并且返回空结果

B.错误

C.返回NULL

D.系统当DATETIME

E.系统当前TIMESTAMP

解析:NULL不能进行比较,对于空的判断只能用IS NULL或IS NOT NULL。因此这题应该选A。

mysql> SELECT now() WHERE null=null;
Empty set (0.01 sec)
mysql> SELECT now() WHERE null is null;
+---------------------+
| now() |
+---------------------+
| 2024-02-23 11:12:14 |
+---------------------+
1 row in set (0.00 sec)

第8题:TiDB Server兼容以下哪个数据库的访问协议?

A.PostgreSQL

B.DynamoDB

C.Oracle

D.MySQL

解析:送分题,TiDB兼容MySQL。因此这题应该选D。

第9题:Placement Driver向其它TiDB组件提供什么信息可以用来保证TiDB内部事件的时序?

A.TXN SEQUENCE

B.Raft SEQUENCE

C.Timestamp Oracle(TSO)

D.MVCC Version

解析:PD的功能包括提供元数据信息和TSO。因此这题应该选C。

第10题:以下哪种方式可用来声明最长为9比特的数据类型?

A.SMALLINT

B.BINARY(9)

C.无正确答案

D.BIT(9)

E.BLOB(9)

解析:比特值类型用BIT(M)定义。因此这题应该选D。

https://docs.pingcap.com/zh/tidb/stable/data-type-numeric

第11题:实现TiKV Server数据持久性的是?

A.MariaDB

B.RocksDB

C.MySQL

D.TiRow

解析:送分题,TiKV采用RocksDB进行持久化。因此这题应该选B。

第12题:当Collation是utf8mb4_binary时,以下哪个答案是降序排列A,B,C,a,b,c,1,2,3,+的正确结果?

A.c b a C B A 3 2 1 +

B.C B A c b a 3 2 1 +

C.+ 3 2 1 c b a C B A

D.3 2 1 + C B A c b a

解析:TiDB默认的collation是utf8mb4_bin,基于这个collation查看排序结果,如下示例所示。因此这题应该选A。

mysql> select * from information_schema.collations;
+--------------------+--------------------+------+------------+-------------+---------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------+--------------------+------+------------+-------------+---------+
| ascii_bin | ascii | 65 | Yes | Yes | 1 |
| binary | binary | 63 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | | Yes | 1 |
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
| latin1_bin | latin1 | 47 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | Yes | Yes | 1 |
| utf8_general_ci | utf8 | 33 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 1 |
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | | Yes | 1 |
| utf8mb4_0900_bin | utf8mb4 | 309 | | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 1 |
+--------------------+--------------------+------+------------+-------------+---------+
13 rows in set (0.00 sec)
mysql> select * from information_schema.schemata;
+--------------+---------------------+----------------------------+------------------------+----------+----------------------------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | TIDB_PLACEMENT_POLICY_NAME |
+--------------+---------------------+----------------------------+------------------------+----------+----------------------------+
| def | db_target | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | demo | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | dm_meta | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | INFORMATION_SCHEMA | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | lightning_task_info | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | METRICS_SCHEMA | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | mysql | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | PERFORMANCE_SCHEMA | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | test | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | tflashdb | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | tnt | utf8mb4 | utf8mb4_bin | NULL | NULL |
| def | za | utf8mb4 | utf8mb4_bin | NULL | NULL |
+--------------+---------------------+----------------------------+------------------------+----------+----------------------------+
12 rows in set (0.00 sec)
mysql> insert into testcollation values('A'),('B'),('C'),('a'),('b'),('c'),('1'),('2'),('3'),('+');
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from testcollation order by a desc;
+------+
| a |
+------+
| c |
| b |
| a |
| C |
| B |
| A |
| 3 |
| 2 |
| 1 |
| + |
+------+
10 rows in set (0.00 sec)

第13题:您正在为一个银行系统设计表结构,您将选择哪种数值数据类型来存储用户账户余额?

A.BIGINT

B.DOUBLE

C.DECIMAL

D.FLOAT

解析:首先需要精确数据类型,其次需要有小数位。因此这题应该选C。

第14题:关于MEDIUMTEXT数据类型,描述正确的是?

A.LIKE无法对MEDIUMTEXT的字段进行模糊匹配

B.raft-entry-max-size是影响它最大长度的因素之一

C.MEDIUMTEXT数据类型和CHAR数据类型没有区别

D.MEDIUMTEXT的最长长度是2GB

解析:like可以进行模糊匹配,MEDIUMTEXT和CHAR不一样,最大列长度为 16,777,215。影响长度的参数除了raft-entry-max-size还有一个事务级别的txn-entry-size-limit。因此这题应该选B。

https://docs.pingcap.com/zh/tidb/stable/data-type-string#mediumtext-%E7%B1%BB%E5%9E%8B

第15题:在TiDB Database中,Raft Group复制数据的单位称为?

A.Region

B.Block

C.Cell

D.RDD

解析:送分题,Raft复制单位为Region。因此这题应该选A。

第16题:以下哪种TiDB实例是无状态的?

A.Placement Driver Server

B.TiKV Server

C.TiDB Server

D.MVCC Server

解析:送分题,TiDB Server是计算层无状态。因此这题应该选C。

第17题:以下哪个属性能够缓解Primary Key在TiKV Region上的写入热点问题?

A.AUTO_SHARD

B.LAST_INSERT_ID

C.AUTO_RANDOM

D.AUTO_INCREMENT

解析:AUTO_SHARD没有这个参数,LAST_INSERT_ID返回最后一条 INSERT 语句中自增列的值,AUTO_INCREMENT是自增序列,AUTO_RANDOM可以处理自增主键热点。因此这题应该选C。

第18题:需要创建一个支持三副本的PLACEMENT POLICY,数据主要保存在西雅图,远程同步到东京。选择正确的操作。

A.CREATE PLACEMENT POLICY P1 PRIMARY_REGION="seattle" CONSTRAINTS="seattle,tokyo" FOLLOWERS=2;

B.CREATE PLACEMENT POLICY P1 PRIMARY_REGION="seattle" REGIONS="seattle,tokyo" FOLLOWERS=3;

C.CREATE PLACEMENT POLICY P1 PRIMARY_REGION="seattle" REGIONS="seattle,tokyo" FOLLOWERS=2;

D.CREATE PLACEMENT POLICY P1 PRIMARY_REGION="seattle" REGIONS="tokyo" FOLLOWERS=3;

解析:参数Placement Rule in SQL语句,FOLLOWERS代表follower数量,如有3副本则followers=2,REGIONS是包括PRIMARY_REGION的所有region。因此这题应该选C。

https://docs.pingcap.com/zh/tidb/stable/placement-rules-in-sql#placement-rules-in-sql

https://docs.pingcap.com/zh/tidb/stable/sql-statement-create-placement-policy#create-placement-policy

第19题:以下关于索引的陈述,哪个是正确的描述?

A.只要字段上有索引,并且字段被WHERE子句引用,那么查询一定能利用索引提升效率。

B.二级索引越多越好,便于提升查询的效率。

C.二级索引越多越好,便于提升DML的效率。

D.创建索引要谨慎,非必要不创建。

解析:送分题,索引非必要不创建,过多索引造成DML性能下降。因此这题应该选D。

第20题:以下哪种方式可用来声明最长9位数的整数?

A.SMALLINT

B.INT

C.INT(9)

D.BIGINT(9)

E.无正确答案

解析:smallint有符号数的范围是 [-32768, 32767],无符号数的范围是 [0, 65535]。int有符号数的范围是 [-2147483648, 2147483647],无符号数的范围是 [0, 4294967295]。bigint有符号数的范围是 [-9223372036854775808, 9223372036854775807],无符号数的范围是 [0, 18446744073709551615]。

int(M) zerofill,加上zerofill后M才表现出有点点效果,比如int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加zerofill,则它们没有什么区别.M不是用来限制int个数的.

因此这题应该选E。

https://docs.pingcap.com/zh/tidb/stable/data-type-numeric

https://www.jianshu.com/p/8a8d7e00dc5e

mysql> create table testint(a int);
Query OK, 0 rows affected (1.02 sec)
mysql> insert into testint values(123456789);
Query OK, 1 row affected (0.01 sec)
mysql> insert into testint values(1234567890);
Query OK, 1 row affected (0.00 sec)
mysql> insert into testint values(12345678901);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> drop table testint;
Query OK, 0 rows affected (2.01 sec)
mysql> create table testint(a int(9));
Query OK, 0 rows affected (0.52 sec)
mysql> insert into testint values(123456789);
Query OK, 1 row affected (0.01 sec)
mysql> insert into testint values(1234567890);
Query OK, 1 row affected (0.01 sec)
mysql> insert into testint values(12345678901);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> drop table testint;
Query OK, 0 rows affected (1.02 sec)
mysql> create table testint(a bigint(9));
Query OK, 0 rows affected (0.52 sec)
mysql> insert into testint values(123456789);
Query OK, 1 row affected (0.01 sec)
mysql> insert into testint values(1234567890);
Query OK, 1 row affected (0.00 sec)
mysql> insert into testint values(12345678901);
Query OK, 1 row affected (0.00 sec)
mysql> insert into testint values(123456789012);
Query OK, 1 row affected (0.00 sec)
mysql> insert into testint values(1234567890123);
Query OK, 1 row affected (0.00 sec)

第21题:以下哪个组件不属于TiDB Server?

A.Physical Optimizer

B.RocksDB Scheduler

C.Distributed Exector

D.Local Executor

解析:TiDB Server是计算引擎,负责SQL解析编译执行,而RocksDB属于TiKV部分。因此这题应该选B。

第22题:在什么情况下,以BIGINT数据类型为Primary Key的表,会具有_tidb_rowid字段?

A.这种情况不可能发生

B.TiDB中的每个表都有_tidb_rowid字段

C.Primary key被声明为NonClustered

D.无正确答案

解析:对于非聚簇索引主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。因此这题应该选C。

https://docs.pingcap.com/zh/tidb/stable/shard-row-id-bits#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5

mysql> create table t22_1(a int primary key, b int);
Query OK, 0 rows affected (1.02 sec)
mysql> create table t22_2(a int primary key nonclustered, b int);
Query OK, 0 rows affected (0.52 sec)
mysql> create table t22_3(a int, b int);
Query OK, 0 rows affected (1.02 sec)
mysql> insert into t22_1 values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t22_2 values(1,1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into t22_3 values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> select _tidb_rowid from t22_1;
ERROR 1054 (42S22): Unknown column '_tidb_rowid' in 'field list'
mysql> select _tidb_rowid from t22_2;
+-------------+
| _tidb_rowid |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
mysql> select _tidb_rowid from t22_3;
+-------------+
| _tidb_rowid |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)

第23题:默认情况下,查询SELECT 8/0的结果是?

A.0

B.报错

C.NaN

D.NULL

解析:默认情况下,被除数为 0 值时,系统产生警告,并用 NULL 代替。设置ERROR_FOR_DIVISION_BY_ZERO会导致报错。因此这题应该选D。

https://docs.pingcap.com/zh/tidb/stable/sql-mode#%E9%87%8D%E8%A6%81%E7%9A%84-sql_mode-%E5%80%BC

mysql> select 8/0;
+------+
| 8/0 |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+---------------+
| Level | Code | Message |
+---------+------+---------------+
| Warning | 1365 | Division by 0 |
+---------+------+---------------+
1 row in set (0.00 sec)

第24题:以下哪条命令启动了表t1的TiFlash副本功能?

A.ALTER TABLE 't1' ENABLE TIFLASH REPLICA 1;

B.ALTER TABLE "t1" SET TIFLASH REPLICA 1;

C.ALTER TABLE T1 SET TIFLASH REPLICA 1;

D.ALTER TABLE t1 ENABLE TIFLASH REPLICA 1;

解析:构建tiflash的语句为alter table xx set tiflash replica xx。表名默认大小写不敏感。因此这题应该选C。

https://docs.pingcap.com/zh/tidb/stable/create-tiflash-replicas#%E6%8C%89%E8%A1%A8%E6%9E%84%E5%BB%BA-tiflash-%E5%89%AF%E6%9C%AC

第25题:默认情况下,SELECT 'Welcom'||' to '||'TiDB!';返回?

A.NULL

B.报错

C.Welcome to TiDB!

D.警告,并返回0

解析:默认情况下||视为OR,开启sql_mode为PIPES_AS_CONCAT则当成字符串连接操作符。因此这题应该选D。

https://docs.pingcap.com/zh/tidb/stable/sql-mode#sql-%E6%A8%A1%E5%BC%8F

mysql> SELECT 'Welcom'||' to '||'TiDB!';
+---------------------------+
| 'Welcom'||' to '||'TiDB!' |
+---------------------------+
| 0 |
+---------------------------+
1 row in set, 3 warnings (0.01 sec)
mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'Welcom' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'to' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'TiDB!' |
+---------+------+--------------------------------------------+
3 rows in set (0.00 sec)
mysql> set sql_mode="PIPES_AS_CONCAT";
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT 'Welcom'||' to '||'TiDB!';
+---------------------------+
| 'Welcom'||' to '||'TiDB!' |
+---------------------------+
| Welcom to TiDB! |
+---------------------------+
1 row in set (0.00 sec)

第26题:以下哪项不属于TiDB的数据类型?

A.INTERVAL

B.DATETIME

C.TIME

D.YEAR

解析:DATETIME、TIME、YEAR均属于数据类型,但INTERVAL是用于指定持续时间的关键字,如INTERVAL '1' YEAR,不是数据类型。因此这题应该选A。

https://docs.pingcap.com/zh/tidb/stable/data-type-date-and-time

第27题:SQL语句SELECT NULL=NULL,''=' '的返回是?

A.1,1

B.NULL,1

C.1,0

D.0,0

解析:在V6.5版本下执行结果如下。因此这题应该选B。

mysql> select NULL=NULL,''=' ';
+-----------+--------+
| NULL=NULL | ''=' ' |
+-----------+--------+
| NULL | 1 |
+-----------+--------+
1 row in set (0.00 sec)

第28题:以下关于Prepared Statement优点的陈述中哪一项不正确?

A.减少PARSE阶段的CPU开销。

B.降低客户端与服务器的网络通讯流量。

C.缓解了SQL注入攻击。

D.每次EXECUTE都能帮助优化器确定最优的执行计划。

E.解析一次,执行多次。

解析:预编译语句可以减少语句每次重新编译,编译一次执行多次,可以缓解SQL注入,降低通讯,但是不能帮助优化器确定最优执行计划。因此这题应该选D。

第29题:SQL语句SELECT CONCAT_WS(NULL,'Hello','World'),CONCAT(NULL,'Hello','World');返回是?

A.NULL,NULL

B.NULL,Hello World

C.Hello World,NULL

D.World,NULL

解析:CONCAT_WS是用第一个参数作为连接符连接,如果被连接的串有NULL则当成空串处理;CONCAT是将所有参数拼接,如果有参数为NULL则结果为NULL。但题中CONCAT_WS的连接符是NULL。因此这题应该选A。

mysql> SELECT CONCAT_WS(NULL,'Hello','World'),CONCAT(NULL,'Hello','World');
+---------------------------------+------------------------------+
| CONCAT_WS(NULL,'Hello','World') | CONCAT(NULL,'Hello','World') |
+---------------------------------+------------------------------+
| NULL | NULL |
+---------------------------------+------------------------------+
1 row in set (0.00 sec)
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name'),CONCAT('First name',NULL,'Last Name');
+----------------------------------------------+---------------------------------------+
| CONCAT_WS(',','First name',NULL,'Last Name') | CONCAT('First name',NULL,'Last Name') |
+----------------------------------------------+---------------------------------------+
| First name,Last Name | NULL |
+----------------------------------------------+---------------------------------------+
1 row in set (0.00 sec)

第30题:以下关于MVCC依赖的技术的陈述中哪些项是正确的?(选择2项)

A.Past image

B.在TiKV的Key/Value Pair的Key上加入版本号

C.Timestamp Oracle

D.快照

解析:A无关,快照是基于MVCC,MVCC是基于Key加版本号以及TSO实现的。因此这题应该选B、C。

第31题:哪些SQL MODE会使下面的查询无法运行?(选择2项)

SELECT category_id,gravity,max(mass) FROM planets GROUP BY category_id;

A.ANSI

B.ORACLE

C.无正确答案。该SQL存在错误,无法被执行。

D.ONLY_FULL_GROUP_BY。

解析:ANSI和ONLY_FULL_GROUP_BY会不允许此操作,但ORACLE模式可以。因此这题应该选A、D。

mysql> set session sql_mode='ANSI';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT category_id,gravity,max(mass) FROM planets GROUP BY category_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.planets.gravity' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
mysql> set session sql_mode='ORACLE';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT category_id,gravity,max(mass) FROM planets GROUP BY category_id;
+-------------+---------+-----------+
| category_id | gravity | max(mass) |
+-------------+---------+-----------+
| 1 | 1 | 1 |
+-------------+---------+-----------+
1 row in set (0.02 sec)
mysql> set session sql_mode='ONLY_FULL_GROUP_BY';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT category_id,gravity,max(mass) FROM planets GROUP BY category_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.planets.gravity' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

第32题:SELECT COUNT(*) FROM universe.planets 关于此SQL语句,描述正确的是?(选择2项)

A.相关任务只能在一个TiDB Server上执行,即用户会话连接到的那个TiDB Server.

B.它可以利用到多个TiKV Server并行执行.

C.无论TiKV Server节点数量是多少,COUNT操作只会在TiDB Server上被执行一次.

D.这是典型的TiDB分布式SQL场景.

解析:针对这种大表count,TiDB会下推到TiKV并行执行,从执行计划中也可以看到cop[tikv]。因此这题应该选B、D。

mysql> explain select count(*) from test1;
+----------------------------+-------------+-----------+---------------+---------------------------------+
| id | estRows | task | access object | operator info |
+----------------------------+-------------+-----------+---------------+---------------------------------+
| HashAgg_11 | 1.00 | root | | funcs:count(Column#5)->Column#4 |
| └─TableReader_12 | 1.00 | root | | data:HashAgg_5 |
| └─HashAgg_5 | 1.00 | cop[tikv] | | funcs:count(1)->Column#5 |
| └─TableFullScan_10 | 10000000.00 | cop[tikv] | table:test1 | keep order:false |
+----------------------------+-------------+-----------+---------------+---------------------------------+
4 rows in set (0.00 sec)

第33题:以下哪些陈述最能描述TiDB相对于传统RDBMS的特点?(选择2项)

A.组件解耦,拥有良好的扩展性,支持弹性扩缩容

B.TiDB集群必须依赖共享存储

C.拥有无状态的前端

D.支持ACID、事务强一致

解析:TiDB不依赖共享存储,属于shared nothing架构,因此B不对;传统RDBMS具有ACID事务强一致,因此D不对。因此这题应该选A、C。

第34题:描述UNION操作正确的是?(选择2项)

A.UNION ALL可以合并两个列数不同的结果集,而UNION不可以

B.UNION操作可以去重

C.UNION ALL操作不会去重

D.UNION可以合并两个列数不同的结果集,而UNION ALL不可以

解析:UNION和UNION ALL的区别就是前者会去重,后者不去重,结果集都要是相同的列数。因此这题应该选B、C。

第35题:以下哪些陈述正确描述了TiDB的时区?(选择2项)

A.每个会话可以通过time_zone参数设置当前会话的时区

B.NOW()返回值受时区影响,CURTIME()返回值不受时区影响

C.DATETIME和TIMESTAMP数据类型包含时区信息,DATE和TIME数据类型不包含时区信息

D.当没有设置全局时区time_zone时,默认time_zone使用system时区

解析:TiDB 使用的时区由 time_zone 全局变量和 session 变量决定。time_zone 的默认值是 System,System 对应的实际时区在 TiDB 集群 bootstrap 初始化时设置。

NOW() 和 CURTIME() 的返回值都受到时区设置的影响。TIMESTAMP数据类型包含时区信息,DATETIME不包含。因此这题应该选A、D。

https://docs.pingcap.com/zh/tidb/stable/configure-time-zone#%E6%97%B6%E5%8C%BA%E6%94%AF%E6%8C%81

mysql> SELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;
+--------------------+---------------------+---------------------------+
| @@global.time_zone | @@session.time_zone | @@global.system_time_zone |
+--------------------+---------------------+---------------------------+
| SYSTEM | SYSTEM | Asia/Shanghai |
+--------------------+---------------------+---------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+---------------------+---------------------+------------+----------+
| a | b | c | d |
+---------------------+---------------------+------------+----------+
| 2024-02-23 15:23:15 | 2024-02-23 15:23:15 | 2024-02-23 | 15:23:15 |
+---------------------+---------------------+------------+----------+
1 row in set (0.01 sec)
mysql> select now(),curtime();
+---------------------+-----------+
| now() | curtime() |
+---------------------+-----------+
| 2024-02-23 15:27:24 | 15:27:24 |
+---------------------+-----------+
1 row in set (0.00 sec)
mysql> set time_zone='+10:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t;
+---------------------+---------------------+------------+----------+
| a | b | c | d |
+---------------------+---------------------+------------+----------+
| 2024-02-23 15:23:15 | 2024-02-23 17:23:15 | 2024-02-23 | 15:23:15 |
+---------------------+---------------------+------------+----------+
1 row in set (0.00 sec)
mysql> select now(),curtime();
+---------------------+-----------+
| now() | curtime() |
+---------------------+-----------+
| 2024-02-23 17:27:36 | 17:27:36 |
+---------------------+-----------+
1 row in set (0.00 sec)

第36题:关于GLOBAL TEMPORARY TABLE正确的描述是?(选择全部正确答案)

A.对所有会话都可见

B.表不能与永久表同名

C.当事务结束时,表内数据会被自动清除

D.可以通过information_schema.tables查询到它

E.表的数据仅在当前事务中可见

解析:全局临时表对所有会话可见,不能与永久表同名,事务结束数据自动清除,可以在information_schema查询到,表数据仅在当前事务可见。因此这题应该选A、B、C、D、E。

https://docs.pingcap.com/zh/tidb/stable/dev-guide-use-temporary-tables

mysql> create global temporary table temptbl(a int, b int) on commit delete rows;
Query OK, 0 rows affected (0.53 sec)
mysql> show create table temptbl;
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| temptbl | CREATE GLOBAL TEMPORARY TABLE temptbl (
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ON COMMIT DELETE ROWS |
+---------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> create global temporary table t(a int, b int) on commit delete rows;
ERROR 1050 (42S01): Table 'test.t' already exists
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into temptbl values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from temptbl;
+------+------+
| a | b |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from temptbl;
Empty set (0.00 sec)
mysql> select * from information_schema.tables where TABLE_NAME='temptbl'\G
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test
TABLE_NAME: temptbl
TABLE_TYPE: BASE TABLE
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Compact
TABLE_ROWS: 1
AVG_ROW_LENGTH: 16
DATA_LENGTH: 16
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 0
DATA_FREE: 0
AUTO_INCREMENT: NULL
CREATE_TIME: 2024-02-23 17:35:08
UPDATE_TIME: NULL
CHECK_TIME: NULL
TABLE_COLLATION: utf8mb4_bin
CHECKSUM: NULL
CREATE_OPTIONS:
TABLE_COMMENT:
TIDB_TABLE_ID: 383
TIDB_ROW_ID_SHARDING_INFO: NOT_SHARDED
TIDB_PK_TYPE: NONCLUSTERED
TIDB_PLACEMENT_POLICY_NAME: NULL
1 row in set (0.00 sec)

第37题:TiDB采取默认设置,几天前你通过命令CREATE SEQUENCE test.seq1;创建了一个SEQUENCE,你并不清楚它的使用情况。现在,除了你以外没有其它任何会话使用test.seq1。下正确的陈述是?(选择2项)

A.当连接到TiDB Server 1上执行SELECT NEXTVAL(test.seq1)观察到的返回是10,紧接着你在TiDB Server2上执行SELECT NEXTVAL(test.seq1)的返回一定大于10

B.当连接到TiDB Server 1上执行SELECT NEXTVAL(test.seq1)观察到的返回是1500,紧接着你在TiDB Server2上执行SELECT NEXTVAL(test.seq1)的返回一定大于1500

C.当连接到TiDB Server 1上执行SELECT NEXTVAL(test.seq1)观察到的返回是1500,紧接着你在TiDB Server2上执行SELECT NEXTVAL(test.seq1)的返回不一定大于1500

D.当连接到TiDB Server 1上执行SELECT NEXTVAL(test.seq1)观察到的返回是10,紧接着你在TiDB Server2上执行SELECT NEXTVAL(test.seq1)的返回不一定大于10

解析:默认sequence的cache为1000,如果Server1是10,那么Server2至少应该是1001-2000的cache,所以肯定大于10。但如果Server1是1500,有可能是Server1是1-1000的cache,有可能比1500小。因此这题应该选A、C。

第38题:根据已知信息判断。表STUDENTS没有更新,以下SQL语句能确保反复执行后输出结果顺序不变的是?(选择2项)

A.SELECT name,_tidb_rowid FROM students WHERE score<60;

B.SELECT name,_tidb_rowid FROM students WHERE score<60 ORDER BY _tidb_rowid;

C.SELECT name,_tidb_rowid FROM students WHERE score<60 ORDER BY name;

D.SELECT name,_tidb_rowid FROM students WHERE score<60 ORDER BY name,_tidb_rowid;

E.SELECT name,_tidb_rowid FROM students WHERE score<60 LIMIT 3;

解析:要保证多次顺序不变,必须ORDER BY中有唯一的字段。因此这题应该选B、D。

第39题:找到在每个类别中质量(mass)最大的行星。(选择2个最佳答案)

A. SELECT p.name,p.mass

FROM planets p

WHERE p.mass = (SELECT MAX(mass) FROM planets WHERE category_id <=> p.category_id);

B. SELECT p.name,p.mass

FROM planets p

JOIN (SELECT category_id, MAX(mass) as max_mass FROM planets GROUP BY category_id) c

ON p.mass=c.mass;

C. ...

D. SELECT p.name,p.mass,category_id

FROM planets p

WHERE p.mass=MAX(mass)

GROUP BY category_id;

解析:此题选项内容缺失,遗留给读者考试自行判断。如读者有补充,可告知作者补充完善。

第40题:以下关于Prepared Statement的陈述,正确的描述是?(选择2项)

A.EXECUTE命令能够将执行计划缓存入Plan Cache

B.PREPARE命令能够产生执行计划

C.EXECUTE命令能够产生执行计划

D.PREPARE命令能够将执行计划缓存入Plan Cache

解析:Prepare生成AST,execute根据AST和参数值生成执行计划。每条Prepare第一次Execute会检查查询是否可以使用执行计划缓存,如果可以则将执行计划放进缓存供后续execute获取使用。因此这题应该选A、C。

https://docs.pingcap.com/zh/tidb/stable/sql-prepared-plan-cache#prepare-%E8%AF%AD%E5%8F%A5%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92%E7%BC%93%E5%AD%98

第41题:TiDB支持以下哪些事务隔离级别?(选择2项)

A.Repeatable Read

B.Read COMMITTED

C.Serializable

D.Phantom Read

解析:TiDB支持可重复读和读提交。因此这题应该选A、B。

https://docs.pingcap.com/zh/tidb/stable/transaction-isolation-levels#tidb-%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB

第42题:在集群中的任意TiKV Server所在节点发生故障之后,TiDB Server实例就无法访问数据了,必须修复故障的节点,然后整个TiDB才能恢复正常。

A.对

B.错

解析:B.错。TiDB无状态,任意故障不影响集群使用。

第43题:TiKV不能作为独立的数据库使用。

A.对

B.错

解析:B.错。TiKV 可以独立于 TiDB,与 PD 构成 KV 数据库,此时的产品形态为 RawKV。

https://docs.pingcap.com/zh/tidb/stable/rawkv-backup-and-restore#%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D-rawkv-%E6%95%B0%E6%8D%AE

第44题:以下创建TABLE的命令,不能被执行。

CREATE TABLE t1(id INT PRIMARY KEY, steps ENUM(10,20,30));

A.对

B.错

解析:A.对。枚举类型里面的对象必须为字符串。

mysql> CREATE TABLE tenum(id INT PRIMARY KEY, steps ENUM(10,20,30));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 52 near "10,20,30))"
mysql> CREATE TABLE tenum(id INT PRIMARY KEY, steps ENUM('10','20','30'));
Query OK, 0 rows affected (0.52 sec)
mysql> show create table tenum;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tenum | CREATE TABLE tenum (
id int(11) NOT NULL,
steps enum('10','20','30') DEFAULT NULL,
PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

第45题:在悲观锁模式下,首先禁用AUTOCOMMIT,会话A对表进行DML操作时,会话B也可以对同一张表执行DDL操作。

A.错

B.对

解析:A.错。在v6.3.0中为了保证一致性且TiDB不会返回报错,增加了元数据锁。执行中的DDL语句会等待旧版本元数据的DML语句提交,因此会话B的DDL会等待。

https://docs.pingcap.com/zh/tidb/stable/metadata-lock#%E9%97%AE%E9%A2%98%E6%8F%8F%E8%BF%B0

第46题:DROP DATABASE操作可以使用FLASHBACK命令撤销。前提是在GC safe point窗口未关闭前执行。

A.错

B.对

解析:B.对。TiDB v6.4.0引入flashback database功能,在gc life time时间内可以恢复被drop的database。

https://docs.pingcap.com/zh/tidb/stable/sql-statement-flashback-database#flashback-database

第47题:当你需要实现分页查询时,出于对性能的考虑,最佳实践是使用ORDER BY ...LIMIT <offset>,<n>的用法。

A.对

B.错

解析:B.错。分页最佳实践是使用KeySet Seeker。

第48题:以下查询是无法成功执行的,这个描述是否正确?

tidb> DESC universe.planets;

tidb> DESC universe.moons;

两张表都有id和name字段。

SELECT name from universe.planets p join universe.moons m WHERE p.id=m.id;

A.对

B.错

解析:A.对。因为name在两张表中同名,所以select后的name不知道是来自哪个表。

mysql> SELECT name from planets p join moons m WHERE p.id=m.id;
ERROR 1052 (23000): Column 'name' in field list is ambiguous

第49题:LIKE和RLIKE都能利用到TiKV表达式下推。

A.错

B.对

解析:A.错。RLIKE目前不能下推。

https://docs.pingcap.com/zh/tidb/stable/expressions-pushed-down#%E4%B8%8B%E6%8E%A8%E5%88%B0-tikv-%E7%9A%84%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%88%97%E8%A1%A8

第50题:在任何情况下都应该尽量使用Prepared Statement。

A.错

B.对

解析:A.错。使用 Prepared Plan Cache 会有一定的内存开销,目前多用于OLTP场景,并非任何情况都尽量使用。

第51题:以下两个查询返回的结果必然相同。

查询A:

SELECT p.name as l_name, p.gravity as l_gravity, m.name as r_name

FROM planets p

LEFT JOIN moons m

ON p.id=m.planet_id

WHERE p.gravity <10

ORDER BY 1,2,3;

查询B:

SELECT p.name as l_name, p.gravity as l_gravity, m.name as r_name

FROM planets p

LEFT JOIN moons m

ON p.id=m.planet_id

AND p.gravity <10

ORDER BY 1,2,3;

A.错

B.对

解析:A.错。两者主要区别在p.gravity <10是放在ON里面还是放在WHERE后面。由于是LEFT JOIN,放在ON里面不影响结果集大小,但放在WHERE中会影响结果集大小,所以两者不一样。

mysql> select p.id,p.name,m.gravity from planets p left join moons m on (p.id=m.id and p.name='ccc');
+------+------+---------+
| id | name | gravity |
+------+------+---------+
| 1 | aaa | NULL |
| 2 | bbb | NULL |
| 3 | ccc | 20 |
+------+------+---------+
3 rows in set (0.01 sec)
mysql> select p.id,p.name,m.gravity from planets p left join moons m on (p.id=m.id) where p.name='ccc';
+------+------+---------+
| id | name | gravity |
+------+------+---------+
| 3 | ccc | 20 |
+------+------+---------+
1 row in set (0.00 sec)

第52题:不考虑DDL语句的情况下,AUTO_INCREMENT属性可以确保字段值按INSERT的时间顺序单调增长。

A.错

B.对

解析:A.错。出于性能原因,自增编号是系统批量分配给每台 TiDB 服务器的值(默认 3 万个值),因此自增编号能保证唯一性,但分配给 INSERT 语句的值仅在单台 TiDB 服务器上具有单调性。

https://docs.pingcap.com/zh/tidb/stable/auto-increment#auto_increment

--Server1
mysql> create table tauto(a int primary key auto_increment, b int);
Query OK, 0 rows affected (0.52 sec)
mysql> insert into tauto(b) values(1);
Query OK, 1 row affected (0.01 sec)
mysql> insert into tauto(b) values(2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tauto(b) values(3);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tauto;
+---+------+
| a | b |
+---+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+---+------+
3 rows in set (0.00 sec)
--Server2
mysql> insert into tauto(b) values(4);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tauto(b) values(5);
Query OK, 1 row affected (0.01 sec)
mysql> insert into tauto(b) values(6);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tauto;
+-------+------+
| a | b |
+-------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 30001 | 4 |
| 30002 | 5 |
| 30003 | 6 |
+-------+------+
6 rows in set (0.00 sec)

第53题:在对一张表启用了CACHE功能之后,除了NOCACHE,该表无法执行其它变更结构的DDL操作。

A.对

B.错

解析:A.对。对缓存表执行 DDL 语句会失败。若要对缓存表执行 DDL 语句,需要先去掉缓存属性,将缓存表设回普通表后,才能对其执行 DDL 语句。

https://docs.pingcap.com/zh/tidb/stable/cached-tables

第54题:当REPLACE INTO和INSERT...ON DUPLICATE KEY UPDATE对具有Primary Key的表操作时,功能相同。

A.错

B.对

解析:B.对。replace into相当于delete+insert,如果Key不存在则直接插入,如果存在相当于更新,insert ...on duplicate key update也是一样的含义。

第55题:启用了TiFlash之后,为使分析型查询从列存读取数据,必须使用HINT。

A.对

B.错

解析:B.错。sql引擎有自动判断的能力,不一定要使用HINT才可以。

第56题:TiKV Server可以解析并执行SQL语句。

A.对

B.错

解析:B.错。解析并执行SQL的是TiDB Server。

第57题:如果TiDB中所有的TiDB Server同时断电并且磁盘损坏,那么会导致业务数据丢失。

A.对

B.错

解析:B.错。TiDB Server不保存任何数据。

第58题:执行TRUNCATE TABLE 和 DROP TABLE 后丢失的数据都可以被FLASHBACK操作挽救,前提是在GC safe point窗口未关闭前执行。

A.错

B.对

解析:B.对。truncate和drop都可以闪回,只要未被GC。

第59题:查看执行计划的两个语句EXPLAIN和EXPLAIN ANALYZE功能相同。

A.错

B.对

解析:A.错。送分题,前者只显示执行计划,后者还会实际执行语句。

第60题:在一个Prepared Statement语句中可以预编译多条SQL语句。

A.对

B.错

解析:B.错。一个Prepared Statement只能预编译一条SQL。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部