當前位置:首頁 » 編程語言 » sql查詢慢的排查及優化
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql查詢慢的排查及優化

發布時間: 2022-07-23 05:30:10

⑴ 一條查詢極為緩慢的sql語句,如何去優化呢

1、將查詢條件欄位簡歷index;
2、將盡可能篩選掉最大數據量的條件放到where條件最後面,因為sql執行時,where條件是由右往左執行。
3、盡可能少用like、in等函數

⑵ 查詢特別慢 如何優化SQL

思路:

  1. 首先,要確定使用的是什麼數據,

  2. 若是MSSQL,那麼需要看一下查詢計劃,然後逐一解決慢的問題;

  3. 若是Access,那麼就要看錶的索引創建是否合適,另外Access還有一個弊病,就是資料庫大於10MB後,速度和性能將極大的下降

⑶ sql優化 查詢太慢,需要提高查詢速度

你的這個查詢要優化的地方不是not in, 而是整個查詢的結構: 使用了太多的子查詢,而且都是查找的相同的表(GISDUCT表查詢4次),這肯定不是好的查詢方法,應該把你要達到的目的再思考,轉化成合適的查詢語句。
個人認為,你算OCCUPYCOUNT和TOTALCOUNT的子查詢應該可以在一個查詢中搞定的,因為都是查詢GISDUCT表,只是統計取值的條件有所不同罷了,而按條件統計可以用類似「case when 條件 then count(xxx) else 0 end」的結構來實現。有問題可再討論。

⑷ 請教SQL表查詢慢的原因

查詢慢是和表結構,語句,系統等相關的 建索引等方法都可以改善表結構, 另外如果返回數據量很大,當然會慢,所以你盡量查詢相對有用的數據 再就是查詢語句了 比如用in查詢沒有jion查詢快,還有 between 改成 > <會快 再還有,用子查詢也會慢很多, 如果是一些很復雜的查詢,可以改用存儲過程會好點,有時用臨時表會慢但,從海量數據中查詢取數進行子查詢又不如用臨時錶快,不同的問題用不同的解決方法,看你要哪種了,單看你的問題無法直接判斷。 不過,優化查詢句是關鍵的了。

⑸ sql 查詢很慢 求優化


SelectCount(1)FromBS_FT(nolock)WHEREStatusin(0,13)

⑹ 如何解決SQL Server查詢速度緩慢的問題

SQL Server查詢速度慢的原因有很多,常見的有以下幾種: 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷) 2、I/O吞吐量小,形成了瓶頸效應。 3、沒有創建計算列導致查詢不優化。 4、內存不足 5、網路速度慢 6、查詢出的數據量過大(可以採用多次查詢,其他的方法降低數據量) 7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設計的缺陷) 8、sp_lock,sp_who,活動的用戶查看,原因是讀寫競爭資源。 9、返回了不必要的行和列 10、查詢語句不好,沒有優化

⑺ sql server資料庫查詢慢怎麼優化

在安裝有SQLServer資料庫的計算機上,我們在使用資料庫的過程中,有時候會在任務管理器里發現sqlservr.exe這個進程的內存和CPU佔用率較高。

接下來我們來看一下,如何解決上面這個問題,需要設置SQLServer資料庫的內存配置。登錄資料庫,這里使用的是SQLServer2008,右鍵點擊最上方的伺服器名,在彈出的菜單中,點擊【屬性】

打開伺服器屬性窗口。默認顯示的是第一項【常規】內容,點擊第二項【內存】進行內存配置。

點擊【內存】後,打開伺服器內存選項配置界面。這里的【使用AWE分配內存】可以對內存進行擴展支持,我們要做的是更改下方的最大伺服器內存。這個數值根據自己伺服器內存大小來做適當設置。

5
個人建議設置本機內存的一半或稍微高一點,如機器內存為2G,那麼我們這里填寫1000。需要注意的是內存設置調小以後,在資料庫執行較復雜SQL語句的時候,可能會比較慢,出現這種情況,我們再適當上調最大內存配置大小。

⑻ 如果一個sql語句查詢超慢怎麼排查問題

看執行計劃,看看哪句耗時最多,再優化這句。在腳本窗口點擊這個按鈕可以看到執行計劃

至於執行計劃怎麼看需要你自己找教程學學了,一兩句說不清楚

⑼ 如何解決SQL查詢速度太慢

1. 執行計劃中明明有使用到索引,為什麼執行還是這么慢?

2. 執行計劃中顯示掃描行數為 644,為什麼 slow log 中顯示 100 多萬行?
a. 我們先看執行計劃,選擇的索引 「INDX_BIOM_ELOCK_TASK3(TASK_ID)」。結合 sql 來看,因為有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能會更差,優化器選擇這個索引避免了排序。
那為什麼不選 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很簡單,TASK_DATE 欄位區分度太低了,走這個索引需要掃描的行數很大,而且還要進行額外的排序,優化器綜合判斷代價更大,所以就不選這個索引了。不過如果我們強制選擇這個索引(用 force index 語法),會看到 SQL 執行速度更快少於 10s,那是因為優化器基於代價的原則並不等價於執行速度的快慢;
b. 再看執行計劃中的 type:index,"index" 代表 「全索引掃描」,其實和全表掃描差不多,只是掃描的時候是按照索引次序進行而不是行,主要優點就是避免了排序,但是開銷仍然非常大。
Extra:Using where 也意味著掃描完索引後還需要回表進行篩選。一般來說,得保證 type 至少達到 range 級別,最好能達到 ref。
在第 2 點中提到的「慢日誌記錄Rows_examined: 1161559,看起來是全表掃描」,這里更正為「全索引掃描」,掃描行數確實等於表的行數;
c. 關於執行計劃中:「rows:644」,其實這個只是估算值,並不準確,我們分析慢 SQL 時判斷准確的掃描行數應該以 slow log 中的 Rows_examined 為准。
4. 優化建議:添加組合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)

優化過程:
TASK_DATE 欄位存在索引,但是選擇度很低,優化器不會走這個索引,建議後續可以刪除這個索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+

在這個 sql 中 REL_DEVID 欄位從命名上看選擇度較高,通過下面 sql 來檢驗確實如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+

由於有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 組合選擇度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+

在測試環境添加 REL_DEVID,TASK_ID 組合索引,測試 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引後執行計劃:
這里還要注意一點「隱式轉換」:REL_DEVID 欄位數據類型為 varchar,需要在 sql 中加引號:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'

執行時間從 10s+ 降到 毫秒級別:
1 row in set (0.00 sec)
結論
一個典型的 order by 查詢的優化,添加更合適的索引可以避免性能問題:執行計劃使用索引並不意味著就能執行快。