云数据库 GAUSSDB-SELECT

时间:2025-03-03 09:50:12

SELECT

  • 【规则】SELECT语句中禁用通配符字段“*”。

使用通配符字段查询表时,如果因业务或数据库升级导致表结构发生变化,可能出现与业务语句不兼容的情况。因此业务应指明所需查询的表字段名称,避免使用通配符。

  • 【规则】避免对大字段(如VARCHAR(2000))执行ORDER BY、DISTINCT、GROUP BY、UNION等会引起排序的操作。

    此类操作将消耗大量的CPU和内存资源,执行效率低下。

  • 【规则】禁止使用LOCK TABLE语句加锁,仅允许使用 SELECT .. FOR UPDATE语句。

    LOCK TABLE提供多种锁级别,但如果对数据库原理和业务理解不足,误用表锁可能触发死锁,导致数据库不可用。

  • 【建议】考虑使用UNION ALL,少使用UNION,注意考虑去重。

    UNION ALL不去重,少了排序操作,速度相对UNION更快。如果没有去重的需求,优先使用UNION ALL。

  • 【建议】避免频繁使用count()获取大表行数,该操作资源消耗较大,影响并行作业执行效率。
    如果不需要实时的行数统计信息,可以尝试使用如下语句来获取表行数。
    SELECT reltules FROM pg_class WHERE relname = 'tablename';

    pg_class中所记录的表行数信息只会在对该表执行ANALYZE以后才会更新。

    目前ANALYZE有两种触发条件:

    • 业务主动发送ANALYZE语句,例如:
      --分析连接库中所有表
      ANALYZE;
      --分析指定表
      ANALYZE tablename;
    • 借助AUTO VACUUM机制,在每间隔一定时间或表的增删达到一定行数时触发。间隔时间和增删比例可通过GUC参数设置。
support.huaweicloud.com/centralized-devg-v2-gaussdb/gaussdb_42_1265.html