『壹』 sql執行很快,但很占資源
那是你把所有有的操作幾乎都放在內存中操作,這樣時就是那個效果
例如統一個查詢,可以用子查詢,也可以用連接,連接比較佔用資源,但執行的速度比較快,而子查詢不怎麼占資源,但速度相對比較慢
『貳』 sql怎麼提高快
寫高級查詢語句,例如三個表,主外鍵查。
『叄』 如何才能讓SQL執行的快
一般非復雜查詢執行起來不會慢,只要數據量不是很大。復雜查詢的話,就看sql語句怎麼寫了,復雜的sql語句本身是需要優化的。
『肆』 sql語句怎麼提升快初學者 感覺好難
關鍵還是多練,練多了就記住了。
常用的 select,delete,insert,where 這幾個關鍵字的大體語法會就行,其他的,記不住了,網路一下,查多了,自己也就記住了。
『伍』 如何加快sql資料庫查詢速度
第1條語句:建議把子查詢(SELECT gsid, max(dateandtime)as dt from info group by gsid ) i2 on i1.gsid = i2.gsid and i1.dateandtime = i2.dt)創建成一個視圖VIEW,看看能不能加快查詢,你可以試試,我這里沒有你的數據無法測試,經驗之談,希望對你有幫助
其他的優化方法你可以考慮根據你的表情況從索引和jsp頁面緩存的角度改善這個問題,具體的可以HI我,我們詳談。
『陸』 如何解決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 查詢的優化,添加更合適的索引可以避免性能問題:執行計劃使用索引並不意味著就能執行快。
『柒』 一個SQL有時執行速度很快有時很慢,請問處理思路
我最近也發現了這個問題,後來請教人了解了是這樣的: 因為PL/SQL這門語言是專門用於在各種環境下對Oracle資料庫進行訪問。由於該語言集成於資料庫伺服器中,所以PL/SQL代碼可以對數據進行快速高效的處理。 而c#語言是微軟的產品,它在連接ORACLE的時候先存到「連接池」中,所以第一次會慢點,但是當你的Web程序沒有重起的時候,以後的速度就不會慢了。 希望你早日解決問題!!!