2025年信息处理技术员数据库优化考试试题及答案解析_第1页
2025年信息处理技术员数据库优化考试试题及答案解析_第2页
2025年信息处理技术员数据库优化考试试题及答案解析_第3页
2025年信息处理技术员数据库优化考试试题及答案解析_第4页
2025年信息处理技术员数据库优化考试试题及答案解析_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年信息处理技术员数据库优化考试试题及答案解析1.单选题(每题1分,共30分)1.1某电商订单表orders(o_id,user_id,sku_id,qty,price,status,pay_time,ship_time,finish_time),数据量8亿行,日均新增400万行。DBA发现“查询最近30天已付款订单”的SQL在MySQL8.0上执行耗时从0.8s暴涨到12s,最可能的原因是A.缓冲池命中率下降B.统计信息过期导致优化器放弃使用pay_time索引C.磁盘碎片率超过95%D.行格式从DYNAMIC变为COMPACT答案:B解析:数据量线性增长,但耗时呈指数级上升,通常是因为优化器误判。MySQL8.0的costmodel对高并发场景敏感,若ANALYZETABLE超过7天未执行,histogram缺失,优化器会放弃pay_time索引转而全表扫描,造成陡升。1.2PostgreSQL15分区表采用DeclarativePartitioning,父表log,子表按月。执行SELECTFROMlogWHEREtsBETWEEN'2025-04-1500:00:00'AND'2025-04-1600:00:00'时,EXPLAIN出现“Append(cost=0.00..2.1M)”却扫描了2025-01到2025-06共6个子表,其根因是A.分区键ts上创建了btree索引B.查询条件未使用分区键的表达式C.子表check约束使用了date_trunc('month',ts)D.父表上存在触发器干扰答案:C解析:check约束若写成CHECK(date_trunc('month',ts)='2025-04-01'),优化器无法将常量范围直接映射到分区,只能穷举所有分区。应改为CHECK(ts>='2025-04-01'ANDts<'2025-05-01'),使约束排除生效。1.3在Oracle19c的ExadataX9M上,对一张压缩表开启EHCCQueryHigh,同时设置PARALLEL64,发现某并行查询仍出现“cellsingleblockphysicalread”等待,最合理的优化手段是A.增加PARALLEL到128B.关闭EHCC改用OLTP压缩C.将表存储在FlashCache的KEEP池D.降低PARALLEL_DEGREE_POLICY为MANUAL答案:C解析:EHCC在SmartScan过滤率不足时,会回退到单块读。KEEP池可让热点区常驻闪存,减少磁盘单块读。盲目提高并行度反而加剧争用。1.4某业务使用RedisCluster做缓存,key格式为sku:stock:{sku_id},value为整数。大促期间出现“MOVED”重定向风暴,CPU飙高。以下改造最能根治的是A.将value改为哈希结构B.使用RedisPipeline批量请求C.在客户端本地缓存slot映射表并开启crc16预计算D.把maxmemory-policy从volatile-lru改为allkeys-lfu答案:C解析:MOVED风暴多由客户端频繁重建slot映射导致。Jedis-lettuce等组件默认懒加载映射表,高并发下反复触发CLUSTERSLOTS。预计算并缓存映射可消除90%以上重定向。1.5某财务系统使用SQLServer2022,表voucher(v_id,v_date,amt)建有列存聚集索引。夜间批处理需更新v_date,但出现“TupleMover”阻塞,解决的最佳方案是A.关闭自动合并B.将更新拆成DELETE+INSERTC.改为行存表D.在列存索引上使用COMPRESSION_DELAY=0答案:B解析:列存表更新会生成deltastore,再等待TupleMover压缩。大夜批一次性更新百万行,deltastore膨胀,压缩线程跟不上。拆成DELETE+INSERT可绕过deltastore,直接生成新rowgroup。1.6MongoDB6.0分片集群,chunk大小默认128MB,文档平均6KB,某集合出现jumbochunk,其文档数约为A.2.1万B.21万C.210万D.2100万答案:B解析:128MB≈134217728B,134217728/6144≈21845,取整约21k,最接近21万。1.7在MySQL8.0.34中,使用innodb_dedicated_server=ON,主机内存64GB,InnoDBBufferPool自动计算值约为A.48GBB.52GBC.56GBD.60GB答案:C解析:公式min(0.75物理内存,物理内存-1G)。0.7564=48GB,但上限为物理内存-1GB=63GB,取min得48GB;然而8.0.34对dedicatedserver放宽到min(0.875物理内存,物理内存-1G),0.87564=56GB,故选C。1.8某时序库使用ClickHouse23.8,表采用MergeTree,按toStartOfHour(ts)分区,按sipHash64(device_id)采样,发现磁盘占用比预期高30%,最可能遗漏的设置为A.TTL未配置B.compresson_codecs未指定C.index_granularity设置过大D.parts_to_throw_insert设置过小答案:B解析:ClickHouse默认使用LZ4,未指定列级codec时,高压缩比列(如Float64)未启用Delta+ZSTD,导致空间浪费。1.9某银行核心系统使用Db211.5,表card_bin(card_no,bin)上建有压缩索引,执行SELECTbinFROMcard_binWHEREcard_no=?仍出现indexscan+fetchfilter,其原因是A.索引未包含include列B.表压缩导致RIDlist膨胀C.card_no定义为人眼可读CHAR(19)且右补空格D.统计信息中CARD=0答案:C解析:CHAR(19)右补空格,输入参数为VARCHAR,发生隐式转换,导致索引失效。应改为VARCHAR(19)FORBITDATA或使用RTRIM。1.10在OceanBase4.2中,对分区表做majorfreeze后,发现sstable的宏块平均填充率仅65%,最可能触发A.merge_thread_count过小B.write_buffer_size过大C.macro_block_size设置过大D.分区切分键选择不合理答案:C解析:宏块默认2MB,若表行宽小,65%填充率说明宏块内部空洞大。调小macro_block_size到512KB可提升填充率至85%以上。1.11某日志系统使用Elasticsearch8.11,索引按天生成,节点磁盘水位85%触发read-only,以下curl指令可立即解除read-only的是A.PUT_cluster/settings-d'{"persistent":{"cluster.routing.allocation.disk.threshold_enabled":false}}'B.PUT_all/_settings-d'{"index.blocks.read_only_allow_delete":null}'C.POST_cache/clearD.POST_forcemerge?max_num_segments=1答案:B解析:read_only_allow_delete是索引级阻塞,需逐索引解除。A关闭阈值只能防止再次触发,不能解除现有阻塞。1.12某SaaS应用使用AmazonAuroraMySQL3.04,读写延迟突增,PerformanceInsight显示“wait/synch/cond/innodb/row_lock”占85%,最合理的排查顺序是A.查看information_schema.innodb_trx→innodb_locks→杀掉大事务B.直接重启实例C.升级实例规格D.关闭binlog答案:A解析:行锁等待需先定位长事务,再分析锁冲突。重启会丢失现场,升级规格无法解决锁热点。1.13在TiDB7.5中,某事务执行UPDATEtSETc=c+1WHEREid=100,id为主键,但commit耗时400ms,最可能的原因是A.未开启异步提交B.未使用悲观锁C.未启用1PCD.未开启CoprocessorCache答案:C解析:TiDB默认悲观事务,若满足单行+主键+无二级索引,可下沉到TiKV走1PC,commit耗时从2RTT降至1RTT。未开启1PC时,需经历Prewrite+Commit两阶段,RTT翻倍。1.14某游戏服务器使用Nginx+Lua共享字典缓存排行榜,但凌晨3点出现“LRUexpired”导致排行榜穿透,其根因是A.共享字典内存不足B.LuaGC暂停C.缓存key未设置随机过期D.未使用resty.lock答案:C解析:大量key在同一秒过期,引发并发回源。应在过期时间上增加随机漂移,如ttl+math.random(0,300)。1.15某数仓使用Hive3.1onTez,小文件平均12MB,NameNodeRPC延迟高,以下参数组合最能合并小文件的是A.tez.grouping.min-size=128MB,hive.merge.smallfiles.avgsize=256MBB.tez.grouping.max-size=16MB,mapreduce.job.reduces=1000C.hive.exec.reducers.bytes.per.reducer=1GBD.hive.merge.mapfiles=false答案:A解析:tez.grouping.min-size控制vertex输入合并阈值,hive.merge.smallfiles.avgsize控制最终输出合并,两者配合可将12MB小文件合并成128MB大文件,显著降低RPC。1.16在SQLServer2022中,使用ResumableOnlineIndexCreate构建列存索引,中途暂停,系统表记录状态的是A.sys.index_resumable_operationsB.sys.dm_db_index_operational_statsC.sys.index_columnsD.sys.dm_tran_locks答案:A解析:sys.index_resumable_operations记录可恢复索引操作的percent_complete、start_time等,支持ALTERINDEXRESUME。1.17某Kafka3.6集群,topicA100分区,rf=3,min.insync.replicas=2,生产者acks=all,出现“OFFSET_OUT_OF_RANGE”异常,其原因是A.消费者组重平衡B.日志段被提前清理C.分区leader宕机D.未启用幂等答案:B解析:acks=all仅保证ISR写入,不阻止segment删除。若消费者位点过期,拉取已删除的offset,即报OUT_OF_RANGE。1.18某图数据库NebulaGraph3.7,属性索引采用Elasticsearch,执行LOOKUPONplayerWHERE=="Tim"yieldplayer.age出现全表扫描,其原因是A.未重建索引B.索引字段未同步C.查询语法错误D.索引分片未分配答案:B解析:Nebula的ES索引为异步管道,写入后需等待listener同步,若同步延迟,LOOKUP回退storage扫描。1.19在CockroachDB23.2中,某表使用REGIONALBYROW,主键为UUID,发现热点,应改为A.主键改为SERIALB.主键改为UUID+region列C.主键改为hashshardedindexD.关闭followerreads答案:C解析:UUID随机性不足,hashshardedindex将主键前缀做shard位,打散range,消除单range写入热点。1.20某实时数仓使用Flink1.18,Kafka→ClickHouse,exactly-once依赖两阶段提交,但ClickHouse重启后数据重复,其原因是A.未开启幂等写入B.ClickHouse未开启事务表C.Flink未启用checkpointD.ClickHouse不支持XID回查答案:D解析:ClickHouse23.8仅支持幂等INSERT,不支持外部XID回查,无法参与2PC,需下游去重或替换为幂等表引擎ReplacingMergeTree。1.21在MySQL8.0中,使用GROUPBYu_idORDERBYNULL仍出现filesort,其原因是A.未覆盖索引B.sql_mode含ONLY_FULL_GROUP_BYC.排序缓冲区不足D.使用了ROLLUP答案:A解析:ORDERBYNULL仅取消隐式排序,若SELECT列含非聚合列且未覆盖,仍需临时表排序。应建复合索引(u_id,…)覆盖。1.22某系统使用HBase2.5,RowKey设计为reverse(timestamp)+device_id,发现scan仍出现热点,其原因是A.未预分区B.reverse长度不足C.使用了Long.MaxValue-timestampD.写入线程过少答案:B解析:reverse仅翻转秒级,若同一秒内百万设备,仍落同一region。应精确到毫秒并加盐。1.23某企业使用PolarDBPostgreSQL14,开启IMCI(列存索引),执行TPCHQ1仍走行存,其原因是A.未设置enable_imci=onB.IMCI未包含所有列C.统计信息未收集D.查询含Array列答案:B解析:IMCI为投影列存,若select列未全部覆盖,优化器放弃使用。1.24在Oracle21c中,使用JSON数据类型,创建索引CREATEINDEXidxONt(JSON_VALUE(j,'$.id'RETURNINGNUMBER)),查询仍全表扫描,其原因是A.未使用JSON_TABLEB.未开启FUNCTION-BASEDINDEXC.查询条件未使用JSON_VALUED.未收集扩展统计答案:C解析:函数索引需与查询表达式完全匹配,包括RETURNING子句。1.25某系统使用SQLite3.44,WAL模式,读并发300,出现“databaseislocked”,其原因是A.未启用sharedcacheB.写事务持有WAL-WRITE锁C.未开启mmapD.page_size过小答案:B解析:WAL下写事务会短暂获取WAL-WRITE排斥锁,若写事务长,读被阻塞。1.26某时序数据库InfluxDB2.7,tagcardinality达800万,查询OOM,其原因是A.未开启TSIB.retention未设置C.shardduration过长D.未使用flux答案:A解析:高基数tag导致倒排索引爆炸,需开启TimeSeriesIndex(TSI)并限制series数量。1.27某系统使用Doris2.0,BrokerLoad导入ORC文件,出现“failedtogetblocklocation”,其原因是A.ORC含复杂类型B.HDFS客户端未配置HAC.BE节点时钟漂移D.未设置timezone答案:B解析:BrokerLoad需访问NameNode,若未配置services,无法解析block位置。1.28在Greenplum7.0中,对分区表执行ALTERTABLEEXCHANGEPARTITION失败,提示“distributionmismatch”,其原因是A.外部表与分区表分布键不同B.未禁用triggerC.外部表含check约束D.未设置gp_enable_exchange_default_partition答案:A解析:GP要求交换双方分布键一致,否则拒绝。1.29某系统使用Cassandra4.1,表采用TWCS,窗口24h,但磁盘仍持续增长,其原因是A.gc_grace_seconds过大B.未关闭compactionC.使用LCSD.未设置default_time_to_live答案:A解析:TWCS依赖gc_grace_seconds判断墓碑是否可删,若设为10天,窗口内数据无法及时清理。1.30某系统使用RocksDB8.7,写放大达38倍,最可能的原因是A.level0_stop_writes_trigger过小B.bloom_bits过大C.未开启dynamic_level_bytesD.使用了FIFO答案:C解析:未开dynamic_level_bytes导致L1大小固定,L0→L1compaction频繁,写放大飙升。2.多选题(每题2分,共20分)2.1以下哪些手段可降低MySQL8.0二级索引的页分裂频率A.使用自增列作为主键B.设置innodb_fill_factor=70C.定期OPTIMIZETABLED.使用COMPRESS行格式E.降低page_cleaners答案:A、B、C解析:自增主键保证顺序插入,fill_factor预留空间,OPTIMIZE重建索引。COMPRESS与页分裂无关,page_cleaners影响刷脏而非分裂。2.2在PostgreSQL15中,以下哪些参数组合可加速并行索引扫描A.max_parallel_workers_per_gather=8B.parallel_tuple_cost=0C.parallel_setup_cost=0D.effective_cache_size=32GBE.work_mem=1GB答案:A、B、C、E解析:降低并行启动与元组成本,增大work_mem,可提升并行度。effective_cache_size影响优化器估算,但不直接加速扫描。2.3以下哪些属于Oracle19c自动索引(AutoIndex)的触发条件A.查询出现全表扫描B.统计信息过期C.重复执行超过3次D.资源消耗超过阈值E.表小于1000行答案:A、C、D解析:自动索引需观测到重复高成本SQL,且表足够大。统计信息过期与触发无关。2.4以下哪些做法可降低KafkaProducer端到端延迟A.linger.ms=0B.batch.size=0C.compression.type=snappyD.acks=1E.enable.idempotence=true答案:A、D解析:linger=0立即发送,acks=1减少等待副本。batch=0反而降低吞吐,压缩增加CPU,幂等与延迟无关。2.5以下哪些属于ClickHouseMergeTree的merge并发控制参数A.background_pool_sizeB.max_bytes_to_merge_at_max_space_in_poolC.parts_to_delay_insertD.max_replica_delay_for_distributed_queriesE.max_insert_threads答案:A、B、C解析:background_pool_size控制merge线程,max_bytes限制单次merge大小,parts_to_delay_insert触发限流。D、E与merge无关。2.6以下哪些属于SQLServer2022的集成PolyBase支持的外部数据源A.OracleB.TeradataC.MongoDBD.ODBCGenericE.REST答案:A、B、D解析:2022版PolyBase原生支持Oracle、Teradata、ODBCGeneric,MongoDB需第三方便利,REST非关系型不在列。2.7以下哪些属于TiDBTiFlash的MPP下推函数A.COUNTB.SUMC.REGEXPD.JSON_EXTRACTE.WindowFunctionROW_NUMBER答案:A、B、E解析:TiFlash7.5已支持下推窗口函数,JSON与正则尚未支持。2.8以下哪些属于HBaseRegion热点自动切分策略A.HexStringSplitB.IncreasingToUpperBoundSplitC.BusyRegionSplitD.DisabledRegionSplitE.SteadyRegionSplit答案:B、C解析:IncreasingToUpperBoundSplit根据size,BusyRegionSplit根据请求热度。HexStringSplit为预分区,非自动。2.9以下哪些属于Redis7.2ACL的权限粒度A.KEYB.PUBSUBC.SCRIPTD.MODULEE.CLUSTER答案:A、B、C、D解析:ACL支持keys、pubsub、script、module级授权,cluster为管理命令,归在ADMIN类。2.10以下哪些属于Flink1.18Checkpoint对齐屏障(barrier)的优化特性A.UnalignedCheckpointB.BufferDebloatingC.ApproximateCheckpointD.ChangelogStateBackendE.LocalRecovery答案:A、B、D解析:Unaligned与BufferDebloating降低barrier对齐时间,Changelog将增量写先记日志。Approximate为近似,LocalRecovery为本地恢复,非对齐优化。3.判断题(每题1分,共10分)3.1MySQL8.0的hashjoin无需索引即可用于非等值连接。答案:错解析:hashjoin仅支持等值连接,非等值需nestedloop。3.2PostgreSQLBRIN索引适合高选择列。答案:错解析:BRIN适合低选择、物理相关性高的列,如时序。3.3Oracle的In-Memory列存与行存可实时双格式同步。答案:对解析:IMCU与buffercache通过dualformat实时维护。3.4MongoDB复合索引{a:1,b:1}可完全替代{a:1}。答案:对解析:最左前缀原则,{a:1,b:1}可服务{a}查询。3.5RedisCluster的hashslot迁移是原子性的。答案:对解析:迁移通过MULTI/EXEC包裹,原子性。3.6Cassandra的LCS读放大一定低于STCS。答案:错解析:LCS减少空间放大,但level多,读放大可能更高。3.7ClickHouse的JOIN默认采用hashjoin,且全部在内存完成。答案:错解析:右表超max_memory_usage会落盘。3.8TiDB的悲观事务在2PC的prewrite阶段即获取锁。答案:对解析:悲观锁在prewrite前已加,避免冲突。3.9HBase的MOB数据建议存储在WAL中。答案:错解析:MOB超阈值直接写HFile,不进WAL。3.10Flink的exactly-once语义依赖source支持重放。答案:对解析:source需可重放offset,否则无法容错。4.填空题(每空2分,共20分)4.1在MySQL8.0中,使用________命令可在线调整innodb_buffer_pool_size而无需重启。答案:SETGLOBALinnodb_buffer_pool_size=32G;4.2PostgreSQL15中,查看分区裁剪是否生效的系统视图是________。答案:pg_partitioned_table4.3Oracle19c中,自动索引的默认任务名称是________。答案:SYS_AUTO_INDEX_TASK4.4Redis7.2的functions采用________语言编写。答案:Lua4.5ClickHouse23.8中,设置________可让后台merge线程最大占用CPU核心数为4。答案:background_pool_size=44.6TiDB7.5中,开启________参数可将单行事务优化为1PC。答案:tidb_enable_1pc=ON4.7SQLServer2022的Resumable索引创建使用________子句。答案:WITH(RESUMABLE=ON)4.8Cassandra4.1中,设置________可让TWCS窗口内数据在压缩后立即删除。答案:unchecked_tombstone_compaction=true4.9Flink1.18的ChangelogStateBackend底层存储格式为________。答案:RocksDB4.10HBase2.5中,________协处理器可在region级别做聚合。答案:AggregateImplementation5.简答题(每题10分,共20分)5.1某社交平台消息表message(msg_id,sender_id,receiver_id,ts,content),数据量日均5亿,MySQL8.0单机,主键msg_id,辅助索引(sender_id,ts)。现发现“查询某用户最近100条私信”需5s,请给出三步优化方案并说明原理。答案:第一步,建立覆盖索引(receiver_id,tsDESC)INCLUDE(sender_id,content)。原理:将过滤+排序+回表三合一,避免filesort与回表,IO降至1%。第二步,按receiver_id分区,采用RANGECOLUMNS(ts)做二级分区,每7天一个分区。原理:分区裁剪使查询只扫最近7天数据,数据量从30亿降至3.5亿。第三步,将content列改为压缩BLOB,外部存储于对象存储,表内保留URL。原理:减少行宽,单页存放更多行,逻辑读下降70%,同时利用对象存储低成本优势。三步叠加,耗时从5s降至30ms。5.2某电商大促使用RedisCluster缓存库存,key=sku:stock:{sku_id},value=整数。高峰出现“超卖”,请分析原因并给出基于Lua脚本的分布式扣减方案,要求支持事务回滚与重入。答案:原因:并发下GET→DECR非原子,竞态条件导致库存为负。方案:使用Lua脚本保证原子性,脚本如下:localkey=KEYS[1]localqty=tonumber(ARGV[1])localorderId=ARGV[2]localheld=redis.call('HGET',key..':held',orderId)ifheldthenreturn{0,held}endlocalstock=tonumber(redis.call('GET',key))ifstock>=qtythenredis.call('DECRBY',key,qty)redis.call('HSET',key..':held',orderId,qty)redis.call('EXPIRE',key..':held',900)return{1,qty}elsereturn{-1,stock}end回滚脚本:localkey=KEYS[1]localorderId=ARGV[1]localheld=redis.call('HGET',key..':held',orderId)ifheldthenredis.call('INCRBY',key,tonumber(held))redis.call('HDEL',key..':held',orderId)return1endreturn0客户端流程:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论