當前位置:首頁 » 編程語言 » sql優化顧問

sql優化顧問

發布時間: 2023-01-06 01:39:49

A. sql執行與優化

SQL優化

執行計劃,表關聯查詢順序,優化策略與思路

下面再向前走一些,容我根據自己的認識說一下查詢執行的流程是怎樣的:

1.連接

1.1客戶端發起一條Query請求,監聽客戶端的『連接管理模塊』接收請求

1.2將請求轉發到『連接進/線程模塊』

1.3調用『用戶模塊』來進行授權檢查

1.4通過檢查後,『連接進/線程模塊』從『線程連接池』中取出空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創建一個新的連接請求

2.處理

2.1先查詢緩存,檢查Query語句是否完全匹配,接著再檢查是否具有許可權,都成功則直接取數據返回

2.2上一步有失敗則轉交給『命令解析器』,經過詞法分析,語法分析後生成解析樹

2.3接下來是預處理階段,處理解析器無法解決的語義,檢查許可權等,生成新的解析樹

2.4再轉交給對應的模塊處理

2.5如果是SELECT查詢還會經由『查詢優化器』做大量的優化,生成執行計劃

2.6模塊收到請求後,通過『訪問控制模塊』檢查所連接的用戶是否有訪問目標表和目標欄位的許可權

2.7有則調用『表管理模塊』,先是查看table cache中是否存在,有則直接對應的表和獲取鎖,否則重新打開表文件

2.8根據表的meta數據,獲取表的存儲引擎類型等信息,通過介面調用對應的存儲引擎處理

2.9上述過程中產生數據變化的時候,若打開日誌功能,則會記錄到相應二進制日誌文件中

3.結果

3.1Query請求完成後,將結果集返回給『連接進/線程模塊』

3.2返回的也可以是相應的狀態標識,如成功或失敗等

3.3『連接進/線程模塊』進行後續的清理工作,並繼續等待請求或斷開與客戶端的連接

接下來再走一步,讓我們看看一條SQL語句的前世今生。

首先看一下示例語句

示例語句

執行順序

SQL解析

1. FROM

當涉及多個表的時候,左邊表的輸出會作為右邊表的輸入,之後會生成一個虛擬表VT1。

(1-J1)笛卡爾積

計算兩個相關聯表的笛卡爾積(CROSS JOIN) ,生成虛擬表VT1-J1。

兩次全表掃描

哈希索引,查找復雜度都是 O(1)

2. WHERE

對VT1過程中生成的臨時表進行過濾,滿足WHERE子句的列被插入到VT2表中。

注意:

此時因為分組,不能使用聚合運算;也不能使用SELECT中創建的別名;

與ON的區別:

如果有外部列,ON針對過濾的是關聯表,主表(保留表)會返回所有的列;

如果沒有添加外部列,兩者的效果是一樣的;

應用:

對主表的過濾應該放在WHERE;

對於關聯表,先條件查詢後連接則用ON,先連接後條件查詢則用WHERE;

hash join 哈希連接 驅動表和被驅動表都只會訪問0次或1次

應用場景:一個大表一個小表/表上沒有索引/返回結果集比較大

3. GROUP BY

這個子句會把VT2中生成的表按照GROUP BY中的列進行分組。生成VT3表。

注意:

其後處理過程的語句,如SELECT,HAVING,所用到的列必須包含在GROUP BY中,對於沒有出現的,得用聚合函數;

原因:

GROUP BY改變了對表的引用,將其轉換為新的引用方式,能夠對其進行下一級邏輯操作的列會減少;

原作者的理解是:

根據分組欄位,將具有相同分組欄位的記錄歸並成一條記錄,因為每一個分組只能返回一條記錄,除非是被過濾掉了,而不在分組欄位裡面的欄位可能會有多個值,多個值是無法放進一條記錄的,所以必須通過聚合函數將這些具有多值的列轉換成單值;

GROUP BY 重新聚合查詢

4. HAVING

這個子句對VT3表中的不同的組進行過濾,只作用於分組後的數據,滿足HAVING條件的子句被加入到VT4表中。

7.LIMIT

LIMIT子句從上一步得到的VT6虛擬表中選出從指定位置開始的指定行數據。

注意:

offset和rows的正負帶來的影響;

當偏移量很大時效率是很低的,可以這么做:

採用子查詢的方式優化,在子查詢里先從索引獲取到最大id,然後倒序排,再取N行結果集

採用INNER JOIN優化,JOIN子句里也優先從索引獲取ID列表,然後直接關聯查詢獲得最終結果

當前未用到索引,

三次full scan , table1 AS a / table2 AS b / GROUP BY

盡量少做重復的工作

控制同一語句的多次執/減少多次的數據轉換/

杜絕不必要的子查詢和連接表,子查詢在執行計劃一般解釋成外連接,多餘的連接表帶來額外的開銷

關於臨時表和表變數的選擇

臨時表產生使用SELECT INTO和CREATE TABLE + INSERT INTO的選擇,一般情況下,SELECT INTO會比CREATE TABLE + INSERT INTO的方法快很多,但是SELECT INTO會鎖定TEMPDB的系統表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶並發環境下,容易阻塞其他進程,所以建議,在並發系統中,盡量使用CREATE TABLE + INSERT INTO,而大數據量的單個語句使用中,使用SELECT INTO。

子查詢的用法

相關子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入

NOT IN、NOT EXISTS的相關子查詢可以改用LEFT JOIN代替寫法

如果保證子查詢沒有重復 ,IN、EXISTS的相關子查詢可以用INNER JOIN 代替

IN``的相關子查詢用EXISTS代替

不要用 COUNT (*)的子查詢判斷是否存在記錄,最好用 LEFT` `JOIN 或者EXISTS,比如有人寫這樣的語句:

建立索引後,並不是每個查詢都會使用索引,在使用索引的情況下,索引的使用效率也會有很大的差別。只要我們在查詢語句中沒有強制指定索引,

不要對索引欄位進行運算,而要想辦法做變換

不要對索引欄位進行格式轉換

不要對索引欄位使用函數

不要對索引欄位進行多欄位連接

join關聯查詢的計算是很復雜的,特別是數據量比較大的情況下,實際情況還是拆解較快的

Join拆解的核心就是利用In關鍵字

要麼用空間換時間,要麼用時間換空間

多表連接的連接條件對索引的選擇有著重要的意義,所以我們在寫連接條件條件的時候需要特別注意。

A、多表連接的時候,連接條件必須寫全,寧可重復,不要缺漏。

B、連接條件盡量使用聚集索引

C、注意ON、WHERE和HAVING部分條件的區別

ON是最先執行, WHERE次之,HAVING最後,因為ON是先把不符合條件的記錄過濾後才進行統計,它就可以減少中間運算要處理的數據,按理說應該速度是最快的,WHERE也應該比 HAVING快點的,因為它過濾數據後才進行SUM,在兩個表聯接時才用ON的,所以在一個表的時候,就剩下WHERE跟HAVING比較了

考慮聯接優先順序:

(1)INNER JOIN

(2)LEFT JOIN (註:RIGHT JOIN 用 LEFT JOIN 替代)

(3)CROSS JOIN

索引並不適用於所有情況:a.少量數據;b.頻繁進行改動的欄位,不適合做索引;c.很少使用的欄位,不需要加索引

索引會提高數據查詢效率,但是會降低「增、刪、改」的效率。當不使用索引的時候,我們進行數據的增刪改,只需要操作源表即可,但是當我們添加索引後,不僅需要修改源表,也需要再次修改索引,很麻煩。

先執行順序, 是否走索引, 有無類型轉換

18000 字的SQL優化大全

步步深入:MySQL架構總覽->查詢執行流程->SQL解析順序

MySQL索引總結(4)——btree與hash區別

B. 如何進行SQL性能優化

這里分享下mysql優化的幾種方法。

1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。

C. 怎樣進行sql資料庫的優化

1、資料庫空間是個概述,在sqlserver里,使用語句 exec sp_spaceused 'TableName' 這個語句來查。

D. 開發中,SQL語句優化有哪些方法

看你資料庫類型和框架是否支持。

一般開發中遇到慢SQL存在3個問題(索引健全的情況下)。

  1. 數據量多導致總行數慢,因為數據在不歸檔、遷移、轉總賬的情況下會不斷積壓。許可權越高看見的數據量就越大,數據量越大總行數就越高。一般框架是以分頁的SQL為基礎計算總行數的。這樣就會導致掃描行數高物理讀高查詢速度慢。優化方案就是總行數進行狀態歸檔,以歸檔+實時的方式展現出來

  2. 連表超過多,部分數據表是單獨的,但是不同部門的數據又有關聯性,領導要看全生命周期或者流程數據的情況下必須多表相連。這樣由於N個明細表導致笛卡兒積先不說,邏輯復雜連表多會消耗CPU,哪怕你查詢能500毫秒內顯示但是如果多人同時查就讓CPU超100%甚至做成鎖等待等堵塞。這個情況就是要用類似「雲計算」的分布式計算。通過觸發器、存儲過程等規定時間內吧業務表數據計算好並寫到展示表中,直接通過展示表進行關聯,這樣鎖表也於業務表無關,關聯表也能變少達到減少CPU消耗的目的。

  3. iops與cpu佔比高導致資料庫癱瘓。第2點看出如果CPU高資料庫全SQL都會慢,IOPS也一樣。SQL慢會導致事務中的查詢慢,解放事務變慢了其他查詢就會鎖等待狀態變成堵塞。所以遇到大規模的查詢是否先查主鍵然後通過游標一個一個計算再進臨時表。這個是消耗時間和內存換CPU和IOPS的一個例子。反正伺服器資源最高怎樣開發應該是了解的,如何管制資源之間的平衡這個很重要。

舉個例子,部分MYSQL框架喜歡一次性把資料庫都導出來,然後減少子查詢,這個演算法針對有效的基礎數據這樣是可行的。針對業務數據應該沒人會用,但是基礎數據中也可能會存在海量的情況,比如坐標軌跡、省市區、電話號碼歸屬等。如果無腦應用這個框架會導致查詢起來很慢。

E. 請問SQL語句優化的策略都有哪些


創建表的時候。應盡量建立主鍵,根據主鍵查詢數據;

大數據表刪除,用truncate
table代替delete。

合理使用索引,在OLTP應用中一張表的索引不要太多。組合索引的列順序盡量與查詢條件列順序保持一致;對於數據操作頻繁的表,索引需要定期重建,以減少失效的索引和碎片。

查詢盡量用確定的列名,少用*號。
盡量少嵌套子查詢,這種查詢會消耗大量的CPU資源;對於有比較多
or運算的查詢,建議分成多個查詢,用union
all聯結起來;多表查詢
的查詢語句中,選擇最有效率的表名順序(基於規則的優化器中有效)。Oracle解析器對表解析從右到左,所以記錄少的表放在右邊。

盡量多用commit語句提交事務,可以及時釋放資源、解
鎖、釋放日誌空間、減少管理花費;在頻繁的、性能要求比較高的
數據操作中,盡量避免遠程訪問,如資料庫鏈等,訪問頻繁的表可以常駐內存:alter
table...cache;

F. 資料庫引擎優化顧問不支持SQL express

你安裝的是 SQL Express ,這個版本是簡化版,沒有引擎優化顧問的組件,建議去重新下載個完整版

G. 如何使用Microsoft SQL Server Management Studio優化資料庫

簡單的優化一下資料庫。
一、啟動 microsoft sql server management studio(就是sql的管理工具)

二、工具->sql server PRofiler
三、sql server profiler->文件->新建跟蹤 ->運行

時間長一點,點停止 然後保存這個跟蹤

sql server profiler->文件->保存->取個名字。
詳細查看:
如何創建跟蹤 (SQL Server Profiler)
http://technet.microsoft.com/zh-cn/library/ms175047.aspx
四、sql server profiler->工具-資料庫引擎優化顧問
工作負荷 選擇剛才保存的文件。

H. 如何進行SQL性能優化

這里分享下mysql優化的幾種方法。

1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。

I. SQL Server2005資料庫引擎優化顧問不支持SQL Express

你連接資料庫實例的時候連到裝VS時候自帶的sql express版本了,那是個免費的sql server教學版,很多特性不支持的。
檢查一下你的資料庫連接吧~

J. 怎麼使用sql server 2008資料庫引擎優化顧問

確定您希望
資料庫引擎
優化顧問在
分析過程
中考慮添加、刪除或保留的資料庫功能(索引、索引視圖、分區)。有關詳細信息,請參閱
關於工作負荷和使用資料庫引擎優化顧問的注意事項。
創建工作負荷。有關詳細信息,請參閱
啟動資料庫引擎優化顧問,並登錄到
MicrosoftSQL
Server
實例。有關詳細信息,請參閱
啟動資料庫引擎優化顧問。在「常規」
選項卡
上,在
「會話名稱」
中鍵入一個名稱以創建新的優化會話。
選擇一個「工作負荷文件」或「表」
,然後在相鄰的
文本框
中鍵入文件的路徑或表的名稱。
指定表的格式為
database_name.schema_name.table_name
若要搜索工作負荷文件或表,請單擊「瀏覽」按鈕。
資料庫引擎優化顧問假定工作負荷文件是滾動更新文件。有關滾動更新文件的詳細信息,請參閱
限制
跟蹤文件
和表的大小。
使用跟蹤表作為工作負荷時,該表必須存在於資料庫引擎優化顧問正在優化的同一台伺服器上。如果您創建的跟蹤表在其他伺服器上,則必須將其移到資料庫引擎優化顧問准備優化的伺服器上才能用作工作負荷。
選擇要對其運行在步驟
5
中選擇的工作負荷的資料庫和表。若要選擇表,請單擊「所選表」箭頭。
選中「保存優化日誌」
以保存優化日誌的副本。如果不希望保存優化日誌的副本,請清除該
復選框

在分析之後,可以通過打開會話並選擇「進度」選項卡來查看優化日誌。
單擊「優化選項」
選項卡,從列出的選項中進行選擇。有關詳細信息,請參閱
可用的優化選項。
單擊工具欄中的
「開始分析」按鈕。
如果希望停止已經啟動的優化會話,請在「操作」菜單上選擇以下選項之一:選擇「停止分析(並提供建議)」
將停止優化會話,並提示您選擇是否希望資料庫引擎優化顧問根據目前已完成的分析來生成建議。選擇「停止分析」
將停止優化會話而不生成任何建議。

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:528
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:25
linux485 發布:2025-07-05 14:38:28 瀏覽:305
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:756
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:433
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:708
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:243
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:688
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:285
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:835