【建议】尽量避免标量子查询语句的出现。标量子查询是出现在 select 语句输出列 表中的子查询,在下面例子中,下划线部分即为一个标量子查询语句:
SELECT id, (SELECT COUNT(*) FROM films f WHERE f.did = s.id) FROM staffs_p1 s;
标量子查询往往会导致查询性能急剧劣化,在应用开发过程中,应当根据业务逻辑,对标量子查询进行等价转换,将其写为表关联。
【建议】在 where 子句中,应当对过滤条件进行排序,把选择度较大(筛选出的记录数较少)的条件排在前面。
【建议】where 子句中的过滤条件,尽量符合单边规则。即把字段名放在比较条件的一边,优化器在某些场景下会自动进行剪枝优化。形如 col op expression, 其中 col 为表的一个列,op 为‘=’、‘>’的等比较操作符,expression 为不含列名的表达式。
例如,
SELECT id, from_image_id, from_person_id, from_video_id FROM face_data WHERE current_timestamp(6) - time < '1 days'::interval;
改写为:
SELECT id, from_image_id, from_person_id, from_video_id FROM face_data where time >current_timestamp(6) - '1 days'::interval;
【建议】尽量避免不必要的排序操作。排序需要耗费大量的内存及 CPU,如果业务逻辑许可,可以组合使用 order by 和 limit,减小资源开销。gbase 默认按照 ASC & NULL LAST 进行排序。
【建议】使用 ORDER BY 子句进行排序时,显式指定排序方式(ASC/DESC), NULL的排序方式(NULL FIRST/NULL LAST)。
【建议】不要单独依赖 limit 子句返回特定顺序的结果集。如果部分特定结果集, 可以将 ORDER BY 子句与 Limit 子句组合使用,必要时也可以使用 offset 跳过特定结果。
【建议】在保障业务逻辑准确的情况下,建议尽量使用 UNION ALL 来代替 UNION。
【建议】如果过滤条件只有 OR 表达式,可以将 OR 表达式转化为 UNION ALL 以提升性能。
使用 OR 的 SQL 语句经常无法优化,导致执行速度慢。例如,将下面语句
SELECT * FROM scdc.pub_menu
WHERE (cdp= 300 AND inline=301) OR (cdp= 301 AND inline=302) OR (cdp= 302
ANDinline=301);
转换为:
SELECT * FROM scdc.pub_menu WHERE (cdp= 300 AND inline=301) union all
SELECT * FROM scdc.pub_menu WHERE (cdp= 301 AND inline=302) union all
SELECT * FROM tablename
WHERE (cdp= 302 AND inline=301)




