今天聊聊怎么高效SELECT

上期给大家分享了在交互式分析中如何给表导入数据,在PostgreSQL中的标准insert语句,往期精彩传送门:今天聊聊怎么给表写入数据 ,同时相关的建表操作也可以参见往期:今天来聊聊怎么高效建表

通常来说,数据存储需要耗费存储资源,当查数据的时候,也会耗费计算资源,如何快速查询到想要的结果又能省去不必要的计算资源,也是性能优化的一大挑战。今天小编就为大家讲解,如何在交互式分子中,高效使用SELECT以达到快速查询数据又能节约资源的目的。

语法

SELECT [ALL | DISTINCT [ON (expression [, ...])]]
  * | expression [[AS] output_name] [, ...]
  [FROM from_item [, ...]]
  [WHERE condition]
  [GROUP BY grouping_element [, ...]]
  [HAVING condition [, ...]]
  [{UNION | INTERSECT | EXCEPT} [ALL] select]
  [ORDER BY expression [ASC | DESC | USING operator] [, ...]]
  [LIMIT {count | ALL}]

使用示例

1.SELECT *

直接使用SELECT语句查整个表,如示例:

select * from test;

在使用select * 时,会整个表做索引,但实际业务中,整张表的数据并不是所有的都会同时需要,因此会浪费大量的计算资源,当整个表数据量特别大时,也会耗费大量时间去查询。

2. SELECT FROM

当要大量查询某些字段时,一般建议不做整张表的查询,而是查需要的列,示例如下:

select id,name from test;

3.GROUP BY

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

SELECT kind, sum(length) AS total FROM films GROUP BY kind;

说明:group by 里面的字段包含不能float/double这种浮点型。

4.DISTINCT/COUNT DISTINCT

在表中,可能会包含重复值,使用distinct来返回不同的值,而count distinct是用来计算非重复数据的数目。

//distinct用法
SELECT DISTINCT ON (location) location, time, report
    FROM weather_reports
    ORDER BY location, time DESC;
 
//精确uv
SELECT c1, COUNT(DISTINCT c2) FROM table GROUP BY c1

//非精确uv
SELECT c1, approx_count_distinct(c2) FROM table GROUP BY c1
    

5.UNION

UNION用于将两个或者更多的 SELECT 语句的运算结果组合起来。

说明:每个 SELECT 语句必须有相同数量的选中列、相同数量的列表达式、相同的数据类型,并且它们出现的次序要一致,不过长度不一定要相同。

 SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         LEFT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
    UNION
         SELECT  ID, NAME, AMOUNT, DATE
         FROM CUSTOMERS
         RIGHT JOIN ORDERS
         ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

6.ORDER BY

ORDER BY用于对查询的结果进行排序。可用于根据指定的列对结果集进行排序。

说明:默认排序是升序,若要使用降序,需要使用DESC关键字

SELECT Company, OrderNumber FROM Orders ORDER BY Company;

//降序排列
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC;

7.WHERE

where用于按照指定条件来选择数据。

SELECT * FROM Persons WHERE FirstName='Bush';

使用优化

1.只需要查某些列,将select全表替换成select指定字段

select * from table
替换成:
select id,name from table;

2.对于查询较大的数据,加一些过滤条件以及限定条件

select id,value from table where id=123 limit 1000;

3.对于数据量较大的表,查询主要以等值查询为主要查询场景时,建议可以创建或者将原表修改为Hash Clustering表,利用CLUSTERED字段加速该字段的filter效率。

4.对于数据量不大但查询时长明显较大时,需要判断是否存在数据倾斜问题:可以通过ANALYZE EXPLAIN方式查看执行计划,获取诊断信息。

若是在使用交互式分析过程中,有任何问题,欢迎进群咨询。
image.png

猜你喜欢

转载自yq.aliyun.com/articles/740810