当前位置:首页 > 科技数码

视图索引 怎么优化你的SQL查询?以PostgreSQL为例

实际工作中,我们每个人难免都会要写SQL,执行SQL,但是有时时候执行非常慢,甚至获得不了结果。这时候你会怎么办?放弃?去苦口婆心的求隔壁房间胡子擦擦的猥琐DBA大叔?

NO,正确方法是先检查一下你的SQL语句。本文虫虫给你列出来用来排查SQL查询比较慢的常见方法和对策。文中所有方法和例子均基于PostgreSQL,当然这些都可以快速移植到MySQL和其他数据库,因为SQL语句基本上都是相通的。

了解现状

首先,需要先清楚当前数据的环境情况。数据库是不是很繁忙?有多少用户在线,多少查询在执行?当时失败正处在高峰期?

对策:

可以通过询问数据库来了解数据库当前状态。不需要你去@ DBA或者运维,你只需执行SQL语句就可以获得这些信息:

我们可以通过以下语句列出当前所有运行的和空闲的查询:

select * from pg_stat_activity

下面的语句查找导致锁表的查询:

select pid,usename,pg_blocking_pids(pid) as blocked_by,query as blocked_query from pg_stat_activity where cardinality(pg_blocking_pids(pid))> 0;锁

表当时正在更新吗?如果你查询时候恰好遇到ETL进程在更新被锁定的表,你也就无法对其查询。

对策:

了解这些ETL更新执行时间,避开这些时间再执行查询。

有针对性的查询

知道了当前数据库的状态。现在可以具体从你的SQL语句入手了。首先看你的SQL语句:SELECT * from XXX

咦,为啥要 SELECT * ?

对策:

如果知识为了了解表的结构,请从模式树获取表字段。

d 表名

为了执行更快,只SELECT具体的字段值,不要用SELECT * ;

如果有一个特别大的表或宽表(表示字段很多),查询引擎不可能将所有数据都取过来。使用"LIMIT"来限制查询,如果你确实需要关注每一行的内容那另说;

如果要COUNT计算,不要运行查询通过查询结果底部统计行数来获取统计,请使用计算行数的子查询:

select count(*) from(selectidfrom userswhere preferred_language = "zh_CN"and private_profile = True) as temp;大小写

PostgreSQL是区分大小写的,这对于windows下用户习惯SQL Serve的人来说可能有点别扭。

对策:

如果"小写化"或"大写化"数据,比较费劲,在将数据加入查询中之前,先查看字段的形式。

如果在join时候需求,请仅在join一侧使用;尝试使用ILIKE进行不区分大小写的匹配。

避免使用NOT IN

尽量避免使用"IN"或"NOT IN"。此操作需要全表扫描,查询引擎需要对比每一行数据以检查是否满足条件。

对策:

尝试使用"EXCEPT"或"NOT EXISTS",这些对查询计划的影响远小于"NOT IN"。

CTE

CTE(公共表达式)比子查询更易于阅读,但在PostgreSQL中该角色优化有限,查询优化器无法对其变动约束条件实现查询优化。

对策:

CTE和子查询虽然都很有用,但是都有其适用范围。使用CTE时候请考虑表大小,可能返回的行数以及写入时在CTE中执行的操作。

通配符和模糊查询

在LIKE的开头和结尾使用通配符会降低查询效率。并且可能会获得比预期更多的结果。

对策:

在必需地方使用通配符,通常简易,只在LIKE后的开头或者结尾一端使用:

select name, email,location from users where name like "CC%";

尝试写入一张表

将几个嵌套查询用作函数进行操作非常昂贵,这时候尝试写入表会更快。

对策:

如果流程有很多步骤,请考虑创建临时表,以便加入较小的数据子集。

视图的视图

视图是引用查询运行的查询结果。如果要调用多个视图,或者更复杂情况下访问视图的视图,要求查询引擎运行多个查询返回结果。

对策:

如果需要每天/每周/每月等定期的查询快照,不是动态过滤的查询视图,请使用定期结果入表,而不要用视图。

如果要使用嵌套视图,请考虑是否有更直接的方法通过编写查询来获取所需的结果,不要使用多个查询的嵌套视图。

索引

索引通过对数据字段序列化来加速查询,可以以让数据库引擎快速定位数据的位置。索引类型决定了索引的工作方式。

对策:

对数据表中需要经常查询的,使用频繁的字段(或者字段组合)加索引。

评估表中现存的索引确保表中没有太多的索引或者有无用的索引。

总结

本文列出了SQL查询中常见可能会导致性能问题事项,并提供具体对策用以优化。当然这些只是给出了一般性质的建议,针对具体问题具体分析才是解决问题的关键。

1.《视图索引 怎么优化你的SQL查询?以PostgreSQL为例》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《视图索引 怎么优化你的SQL查询?以PostgreSQL为例》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/486833.html

上一篇

lesee 乐视汽车:LeSEE汽车将很快量产

下一篇

移动国际漫游资费 中移动第六次下调国际漫游资费

数据库语言 SQL语句分类

数据库语言 SQL语句分类

0. 说明今天遇到一个同学分不清楚SQL所属的分类,所以我才总结下SQL语句的分类,其实基本上教科书上都会有这个。SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。SQL语句分类简图1. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块...

sql语句查询 SQL常用语句总结(面试很有用哦)

  • sql语句查询 SQL常用语句总结(面试很有用哦)
  • sql语句查询 SQL常用语句总结(面试很有用哦)
  • sql语句查询 SQL常用语句总结(面试很有用哦)
 日常英语口语900句20:过去进行时口语句子

日常英语口语900句20:过去进行时口语句子

288. I was writing some letters to friends of mine.288. 我给我的朋友写了几封信。289. What were you doing at about 4 o’clock yesterday afternoon?289.昨天下午四点钟左右你在干什么?290. I was listening to...

黑曼巴精神是什么 科比布莱恩特霸气语句,黑曼巴精神!励志人生!

  • 黑曼巴精神是什么 科比布莱恩特霸气语句,黑曼巴精神!励志人生!
  • 黑曼巴精神是什么 科比布莱恩特霸气语句,黑曼巴精神!励志人生!
  • 黑曼巴精神是什么 科比布莱恩特霸气语句,黑曼巴精神!励志人生!
季逸超 做完浏览器和输入法,季逸超这次带来了一款搜索引擎Magi

季逸超 做完浏览器和输入法,季逸超这次带来了一款搜索引擎Magi

如果有一个初创团队告诉你,他们的创业项目是做一个搜索引擎,你会是什么反应?上周我就接到了这么一个项目,这款名叫Magi的搜索引擎背后的团队,是之前做猛犸浏览器和Rasgueadol的季逸超和他创立的Peak Labs。那么,Magi相比普通的搜索引擎有什么特别之处呢?简单点说,Magi是一个全新的自然语言搜索引擎+知识图谱服务。普通的搜索引擎,不...

网络经典语句 句句精辟的网络经典语录

  • 网络经典语句 句句精辟的网络经典语录
  • 网络经典语句 句句精辟的网络经典语录
  • 网络经典语句 句句精辟的网络经典语录

安贷客 安贷客:贷款搜索引擎

  • 安贷客 安贷客:贷款搜索引擎
  • 安贷客 安贷客:贷款搜索引擎
  • 安贷客 安贷客:贷款搜索引擎
社会化搜索引擎 Volunia:社会化搜索引擎

社会化搜索引擎 Volunia:社会化搜索引擎

Volunia搜索首页截屏Volunia搜索结果界面截屏。页面上方会列出搜索过该关键词的用户网站名称:Volunia(http://www.volunia.com)上线日期:2012年6月14日产品类型:社会化搜索引擎公司及创始团队:公司在意大利,其创始人兼CEO Mariano Pireddu曾在电信领域有丰富经验。国内竞品:云云网本站讯 6月...