postgresql返回行数_怎么优化你的SQL查询?以PostgreSQL为例

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

11a2c83d19eaffc4fa80136393b05cdd.png

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 表名
83cee48faa28f8ac5cd7774f8a840023.png

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

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

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

select count(*) from(selectidfrom userswhere preferred_language = 'zh_CN'and private_profile = True) as temp;
d66521c2fc7a2f670247b7dfee5f19d2.png

大小写

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

对策:

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

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

避免使用NOT IN

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

对策:

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

CTE

146d680de4e2d6cb7851d16ffd0d4f01.png

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

对策:

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

通配符和模糊查询

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

对策:

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

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

7a7ee032b167d10215f887de3e0db2a2.png

尝试写入一张表

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

对策:

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

视图的视图

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

对策:

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

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

索引

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

对策:

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

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

首次构建android studio gradle 下载缓慢的问题

1、先使用其他工具下载gradle, https\://services.gradle.org/distributions/gradle-2.14.1-all.zip 2、然后放在C:\Users\Administrator\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv 目录中 随机码文件夹可以通过先尝试构建,让…

288. Unique Word Abbreviation

题目&#xff1a; An abbreviation of a word follows the form <first letter><number><last letter>. Below are some examples of word abbreviations: a) it --> it (no abbreviation)1 b) d|o|g --> d…

jqgrid mysql 分页_jQgrid 分页显示

当使用jqgrid去显示数据的时候&#xff0c;如果数据太多&#xff0c;那么jqgrid就会绘制的很慢&#xff0c;这样很影响用户的体验&#xff0c;十分影响用户的心情&#xff0c;所以我们采用分页的方式去取数据&#xff0c;这样就能避免用户长时间的等待&#xff0c;从而提升用户…

echarts 词云_python Flask+爬虫制作股票查询、历史数据、股评词云网页

自学python的数据分析&#xff0c;爬虫后&#xff0c;花了几天时间看视频学习Flask做了一个简单的股票查询网页。本来还想着加入一些其他功能&#xff0c;比如财务指标分析&#xff0c;舆情分析&#xff0c;最完美的想法是做成一个股票评分系统&#xff0c;输入股票代码可以自动…

JavaSE基础知识(6)—异常和异常处理

一、异常的理解及体系结构图 1、理解 异常&#xff1a;程序运行过程中发生的不正常现象。java中的错误&#xff1a;   语法错误   运行异常   逻辑错误 2、体系图 java程序在执行过程中所发生的异常分为两类&#xff1a; Error&#xff1a;Java虚拟机无法解决的严重问题。…

peripheralStateNotificationCB

1 /*********************************************************************2 * fn peripheralStateNotificationCB 外围设备 状态 通知 回调函数3 *4 * brief Notification from the profile of a state change. 通知来自于profile的状态改变&#xff01;5 *6 * …

mysql dump 1017_MySQL数据库导出 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...

本文内容主要来自MySQL官方文档&#xff1a;“MySQL5.1 Reference&#xff0c;2.10.3. 将MySQL数据库拷贝到另一台机器”注意&#xff1a;参数名与值间可以不用空格&#xff0c;如-uroot或-u root均可&#xff1b;某些参数会有不同含义1.数据库导出(-A导出所有数据库&#xff0…

Jsp2.0自定义标签(第二天)——自定义循环标签

今天是学习自定义标签的第二天&#xff0c;主要是写一个自定义的循环标签。 先看效果图&#xff1a; 前台页面Jsp代码 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <%taglib prefix"myout…

正则表达式以什么开头以什么结尾_股票hk是什么意思,股票st开头是什么意思,新通联股票...

股票hk是什么意思,股票st开头是什么意思,新通联股票股票hk是什么意思,股票st开头是什么意思,新通联股票我们首先解决时间跨度问题&#xff1a;如果您为诸如退休之类的遥远目标投资&#xff0c;则应主要投资股票(同样&#xff0c;我们建议您通过共同基金投资)。心理控制第一&…

读书笔记--SQL必知必会03--排序检索数据

3.1 排序数据 子句&#xff08;clause&#xff09; SQL语句由子句构成。一个子句通常由一个关键字加上所提供的数据组成。 ORDER BY子句可以取一个或多个列的名字&#xff0c;将SELECT语句检索出的数据进行排序。 ORDER BY子句可以使用非检索的列排序数据。 ORDER BY子句必须作…

mysql中编写匿名块_Oracle数据库之Oracle_PL/SQL(1) 匿名块

本文主要向大家介绍了Oracle数据库之Oracle_PL/SQL(1) 匿名块&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习Oracle数据库有所帮助。1. PL/SQL 简介PL/SQL是一种比较复杂的程序设计语言, 用于从各种环境中访问Oracle数据库。为什么使用PL/SQL&#xff1f;Ora…

安装了多个Oracle11g的客户端,哪个客户端的tnsnames.ora会起作用?

如果我们由于需要安装了多个Oracle的client&#xff0c;哪个客户端的tnsnames.ora会起作用呢&#xff1f; 答案是&#xff1a; 在安装好clinent端后&#xff0c;安装程序会把client的bin目录放到path里面&#xff0c;path中在前面的client会被首先搜索&#xff0c;其中的tnsnam…

电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...

尝试断一下网&#xff0c;或者重启一下系统看一下是否解决&#xff1b;也可能是开启了网络代理&#xff0c;可以重置一下浏览器或者网络设置&#xff1b;还可以使用安全管家软件&#xff0c;扫描一下网络设置。以下是详细介绍&#xff1a;1、有时候系统显示已经连接其实并没有真…

Atcoder ARC101 E 树dp

https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp&#xff0c;好像是容斥做的&#xff0c;但是看不懂&#xff0c;而且也好像没讲怎么变n^2&#xff0c;看了写大佬的代码&#xff0c;自己理解了一下 #include <bits/stdc.h> #include <ext/pb_ds/assoc…

compress命令--Linux命令应用大词典729个命令解读

内容来源于人民邮电出版社《Linux命令应用大词典》讲述729个命令&#xff0c;1935个例子学习Linux系统的参考书、案头书&#xff0c;遇到不懂的命令或命令选项一查即可争取每天都发布内容本文出自 “airfish2000” 博客&#xff0c;更多命令查看博客&#xff1a;http://airfish…

javaweb学习总结(三十九)——数据库连接池

javaweb学习总结(三十九)——数据库连接池 数据库连接池的实现及原理 JNDI 在 J2EE 中的角色转载于:https://www.cnblogs.com/daishuguang/p/5041845.html

python getopterror_python3 getopt用法

python channel_builder.py -s /Users/graypn/ -d /Users/graypn/Documents -m 7 --outreport/xx.html参数也分长格式和短格式短格式&#xff1a;-s长格式&#xff1a;--sourceopts, args getopt.getopt(sys.argv[1:], "hs:d:m:v:p:c:",["help", "sr…

excel删除空行_Excel里99.9%的人都踩过的坑,早看早避开!

本文作者丨可可&#xff08;小 E 背后的小仙女&#xff09;本文由「秋叶 Excel」原创发布如需转载&#xff0c;请在公众号发送关键词「转载」查看说明2019 年上班第一天感觉怎么样呢&#xff1f;望着满屏幕铺天盖地的表格&#xff0c;我只能摸摸自己还没下去的小肚子&#xff0…

CentOS 6.5 Zabbix-agent3.2 安装 1.0版

1.关闭防火墙service iptables stop2.更换源、安装zabbix-agentrpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpmyum install -y zabbix-agent3.修改配置文件vim /etc/zabbix/zabbix_agentd.confServer192.168.8.228 ser…

centos下利用httpd搭建http服务器方法

centos下利用httpd搭建http服务器方法 1. 解决的问题 在开发测试过程中&#xff0c;分析图片任务需要将图片保存在服务器端&#xff0c;通过url来访问和下载该图片&#xff0c;这就需要使用一台图片服务器&#xff0c;但常常遇到图片服务器匮乏的情况&#xff0c;为了解决该问题…