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.pswp.cn/news/397108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397108.shtml
英文地址,請注明出處:http://en.pswp.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;為了解決該問題…