什么情况下索引会失效
对索引列使用函数:WHERE DATE(create_time) = '2025-01-01':应改为WHERE create_time BETWEEN '2025-01-01' AND '2025-01-02'
隐式类型转换:WHERE phone = 12345678(phone是VARCHAR: 应用引号包裹)
使用!=或<>:负向查询通常不走索引
使用LIKE '%xxx':前导通配符会导致全表扫描
OR条件中有非索引列:WHERE indexed_col = 1 OR non_indexed_col = 2
10. 如何优化跨节点JOIN的性能?
考察点:分布式SQL优化能力。
参考答案:
- 分布键对齐:确保JOIN的两张表使用相同的分布键,避免数据重分布
- 小表复制:将维度表设为REPLICATION表,复制到所有DN,实现本地JOIN
- 谓词下推:在JOIN前先过滤数据,减少传输量
- 调整work_mem:增加内存,避免Hash Join溢出到磁盘
- 使用列存储:对分析型查询启用列存,减少I/O
11. 如何定位和解决GaussDB的慢查询?
考察点:性能排查思路,这是一个高频开放性问题。
参考答案(结合之前对话中的调优知识):
- 开启慢查询日志:log_min_duration_statement = 1000(记录超过1秒的SQL)
- 获取执行计划:EXPLAIN ANALYZE查看实际执行路径和耗时
- 检查统计信息:执行ANALYZE更新统计信息,防止优化器选错计划
- 定位瓶颈:是否全表扫描 → 检查索引是否跨节点数据重分布 → 检查分布键设计是否锁等待 → 查询pg_locks
- 优化SQL:改写低效写法、添加覆盖索引、调整分片策略
