當前位置:首頁 » 編程語言 » sql語句的速度
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql語句的速度

發布時間: 2022-12-10 03:42:14

『壹』 sql語句執行效率低、速度很慢

算不上優化,按照自己的理解說
1能不用*就不要用*,把你要查詢的欄位寫出來
2 e.RegionName不能在rownum中給檢索出來么?感覺在上面檢索會塊一點點
3 為什麼不直接查詢你最後要的結果還要中間再查詢個totable
4 totable的字查詢里month是個無用欄位

最後請大神點評以下

『貳』 怎麼提升這條SQL語句的速度

1.選擇最有效率的表名順序。ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查詢, 那就需要選擇交叉表(intersection table)作為基礎表, 交叉表是指那個被其他表所引用的表。
2.WHERE子句中的連接順序。ORACLE採用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。
3.SELECT子句中盡量避免使用 『* 』。
4.使用DECODE函數來減少處理時間。
5.查詢結果能不排序就不排序。盡量不用Order by,distinct,union,MINUS,INTERSECT。
6.用表連接代替子查詢in。
7.用索引提高查詢效率。但是索引不能隨便用,還要搞清楚每種索引適用的情況,比如B*索引、復合索引、函數索引、bitmap索引等。雖然使用索引能得到查詢效率的提高,但是也必須注意到它的代價. 索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時, 索引本身也會被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出幾 次的磁碟I/O,因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢。
8.不能再索引列上適用not、<>、is null、not is null、做四則運算,否則索引會被抑制,不起作用,變成全表掃描。
9.用>=替代>。比如SELECT * FROM S WHERE ID>=4效率SELECT * FROM S WHERE ID>3高。兩者的區別在於, 前者DBMS將直接跳到第一個ID等於4的記錄,而後者將首先定位到ID=3的記錄並且向前掃描到第一個DEPT大於3的記錄。
10.如果表的數據量很大,可以為該表建分區。經常使用的子查詢可以建成視圖。

『叄』 mysql資料庫: 為什麼sql語句在查詢分析中的執行速度遠遠快於在應用程序的(而且有時候後者慢的很多)

查詢分析的執行速度快於應用程序,主要原因在於應用程序查詢的時候,需要調用對應的資料庫介面驅動程序,如odbc,jdbc等,使得應用程序能夠與資料庫本身能夠交互,這一塊一般無法進行優化,可以優化的地方一般是在建立資料庫的時候,資料庫的邏輯結構和物理結構的優劣直接影響一個系統的性能如何。

『肆』 如何解決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語句查詢速度慢

可以分時操作呀,你把一部分數據融合之後做成視圖或者把你的SQL語句寫成存儲過程。在條件裡面盡量少使用「<>」不等於,或者not in,其實這也是告訴你不僅僅從數據結構的方面考慮問題哦

『陸』 sql語句查詢速度是1分鍾慢嗎

這樣的時間程序是有問題了,你這條sql執行需要一分鍾,前台就得等一分鍾,沒有用戶會願意等,現在查詢時間都是毫秒級別的,如果查詢時間實在減不下來,可以做緩存,或者索引

『柒』 如何提高SQL查詢速度

1
你老師說的對,建立索引是可以提高查詢速度的。你插入了百萬條數據,可以測試。如果在C欄位上建立索引,那以該欄位為查詢條件,在建立後查詢和刪除索引後查詢比較一下就知道了。
2
關於視圖。是提高不了查詢速度的,因為視圖對應一個SQL語句,它只是存起來而已,最後需要進行視圖消解才能進行查詢,它和直接執行相應的語句是一樣的,理論上還要慢一點。
3
關於存儲過程,弄好了是可以提高查詢效率的,因為存儲過程會把一段查詢,也就是SQL語句進行賢編譯,然後將編譯後的代碼存在於伺服器上,在用戶查詢時節省了SQL的編譯時間,所以加快了查詢速度。

『捌』 sql語句和存儲過程執行速度的問題

一千萬條數據,數據是一樣的,執行相同的insert語句

也就是 SQL 語句,只分析一次, 然後執行 一千萬次。

理論上 存儲過程的會快一點, 因為 存儲過程 在 sql 調用的時候,只調用 1次, 然後伺服器端 執行 一千萬次 insert 操作。 然後返回一次結果給客戶端。

sql 語句的話, 要在 sql 客戶端 發起 一千萬次調用, 服務端執行 一千萬次 INSERT操作, 然後 返回 一千萬次 執行結果給 客戶端。

『玖』 SQL 語句執行感覺很慢,怎麼回事

到這個數量級的全部更新,肯定會很慢。
第一。你的記錄不一定在同一個partition,
第二。不明白為什麼那麼多人建議你建索引,你建的索引越多,你的更新速度越慢,因為你更新記錄的同時,還有更新索引。
第三。你必須知道更新速度慢的瓶頸在哪裡。是讀寫太多,還是內存不夠,還是CUP不夠快,然後對症下葯。

下面介紹兩個簡單的辦法,也許有效:
第一:
把這個100W行的表縱向劈成兩個,用外鍵關系連接,一個裝小的,經常改變的數據比如ID,外鍵,狀態值,時間等,另一個裝大的,不經常改變的數據,比如很長的字元串,xml,text 等。
這樣更新時操作小的這個表,可以大大節約內存和CPU 開銷,降低磁碟操作。
壞處就是查詢時會慢些。
第二:
把這100W行橫向切成很多個表,比如每個月的記錄裝在一個表裡,這樣每個表的記錄數可能只有幾萬,查詢,更新都會快很多。
壞處是查詢,更新都不如原來好寫。

『拾』 如何提高SQL查詢速度

索引對資料庫檢索優化時很重要的一個概念聚集索引在SQL中是唯一的也就是說聚集索引時一個很寶貴的資源但是SQL SERVER在自動分配索引的時候默認總是將ID主鍵分配為聚集索引其實是很浪費的通常情況下你可以通過語句創建聚集索引到你使用率最高的條件欄位上面去,當然你必須先分配聚集索引然後再去分配主鍵,否則主鍵創建時就會自動佔用聚集索引然後非聚集索引不能設置過濫,設置過濫會導致目錄增多最後反而導致查詢緩慢優化不是純粹理論上的東西,理論教會你怎麼去使用嘗試才能獲取經驗