上期给大家分享了在交互式分析中如何给表导入数据,在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方式查看执行计划,获取诊断信息。
作者:May-交互式分析