SQL語句和函數用法快速查詢,7種資料庫系統細微差異對比。
B. 怎樣寫sql語句能加快sql查詢速度
盡量使用數字型欄位,一部分開發人員和資料庫管理人員喜歡把包含數值信息的欄位設計為字元型,
這會降低查詢和連接的性能,並會增加存儲開銷。
這是因為引擎在處理查詢和連接回逐個比較字元串中每一個字元,而對於數字型而言只需要比較一次就夠了。
C. 如何解決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 查詢的優化,添加更合適的索引可以避免性能問題:執行計劃使用索引並不意味著就能執行快。
D. 如何加快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我,我們詳談。
E. SQL資料庫使用速查手冊的內容簡介
《SQL資料庫使用速查手冊》書中以簡明易懂的方式解釋SQL語句和函數在FoxPro、Access、SQLServer、Oracle、Sybase、DB2和MySQL7種資料庫管理系統中的不同用法,並提供大量的實例供讀者參考。
《SQL資料庫使用速查手冊》可供使用SQL的程序員、資料庫構建設計人員查詢使用,還可以為學習資料庫編程的人員和想取得各種資料庫考試認證的人員提供學習幫助。
F. 如何提高SQL查詢速度
索引對資料庫檢索優化時很重要的一個概念聚集索引在SQL中是唯一的也就是說聚集索引時一個很寶貴的資源但是SQL SERVER在自動分配索引的時候默認總是將ID主鍵分配為聚集索引其實是很浪費的通常情況下你可以通過語句創建聚集索引到你使用率最高的條件欄位上面去,當然你必須先分配聚集索引然後再去分配主鍵,否則主鍵創建時就會自動佔用聚集索引然後非聚集索引不能設置過濫,設置過濫會導致目錄增多最後反而導致查詢緩慢優化不是純粹理論上的東西,理論教會你怎麼去使用嘗試才能獲取經驗
G. 加快SQL查詢速度
首先是給每個表建索引,這個對查詢很重要哦。另外就是可以試著創建一下簡單的視圖,然後在視圖的基礎上再進行檢索。
H. SQL資料庫使用速查手冊的介紹
《SQL資料庫使用速查手冊》是一本幫助程序設計人員快速查詢各種類型資料庫SQL語句和函數用法的實用手冊。
I. SQL資料庫使用速查手冊的目錄
第1章資料庫系統與SQL基礎知識
1.1資料庫系統基本概念
1.1.1資料庫系統的基本特點
1.1.2資料庫定義與資料庫系統構成
1.1.3資料庫系統的發展
1.2數據模型
1.2.1數據模型的基本概念
1.2.2概念數據模型
1.2.3結構數據模型
1.3關系數據模型
1.3.1關系數據模型的基本結構與特點
1.3.2關系數據模型的完整性約束
1.3.3關系數據語言
1.4SQL基礎知識
1.4.1SQL概述
1.4.2SQL資料庫的基本結構
1.4.3SQL應用的主要內容
第2章SQL應用
2.1資料庫與數據表的定義
2.1.1資料庫的定義
2.1.2數據表的定義
2.1.3表結構的修改
2.1.4索引的定義
2.2數據查詢
2.2.1查詢語句的基本結構
2.2.2SELECT子句
2.2.3FROM子句
2.2.4WHERE子句
2.2.5ORDERBY子句
2.2.6聚集函數應用
2.2.7GROUPBY子句
2.2.8HAVING子句
2.2.9連接查詢
2.2.10嵌套查詢
2.2.11集合查詢
2.3數據更新
2.3.1INSERT語句
2.3.2UPDATE語句
2.3.3DELETE語句
2.4視圖的定義
2.4.1創建視圖CREATEVIEW
2.4.2刪除視圖DROPVIEW
2.4.3視圖應用舉例
2.5數據控制
2.5.1創建用戶
2.5.2角色的創建與刪除
2.5.3許可權授予GRANT
2.5.4許可權傳遞WITHGRANTOPTION
2.5.5許可權回收REVOKE
2.6存儲過程
2.6.1存儲過程的創建
2.6.2存儲過程的調用
2.6.3常用的系統存儲過程
2.7觸發器
2.7.1觸發器的創建
2.7.2觸發器的刪除
2.8其他語句
2.8.1創建模式
2.8.2創建同義詞
第3章運算符
3.1算術運算符
+加
-減
*乘
/除
%取余
3.2關系運算符
=等於
!=不等於
>大於
<小於
=大於等於
=小於等於
<>不等於
3.3位運算符
&按位與運算符
│按位或運算符
^按位異或運算符
~按位取反運算符
3.4邏輯運算符
ALL與所有比較
ANY(SOME)與任意一個比較
EXISTS存在與否
AND邏輯與
OR邏輯或
BETWEEN范圍之間存在與否
NOT否定
IN是否在其中
LIKE模式匹配
REGEXP(RLIKE)模式匹配(MySQL)
3.5集合運算符
UNION求集合的和
EXCEPT求集合的差
MINUS求集合的差
INTERSECT求集合的交集
3.6其他運算符
||字元串結合
CASE替換
ISNULL是否為空
+取正
-取負
第4章函數
4.1統計函數
AVG函數
COUNT函數
MAX函數
MIN函數
SUM函數
4.2字元串函數
ASCII函數
AT函數
CHAR/CHR函數
CHARINDEX函數
CONCAT函數
INITCAP函數
INSERT函數
INSTR函數
LEFT函數
LEN/LENGTH/CHARACTER_LENGTH/CHAR_LENGTH函數
LOCATE函數
LOWER函數
LPAD/RPAD函數
LTRIM/RTRIM函數
NCHAR/NCHR函數
OCTET_LENGTH函數
POSITION函數
POSSTR函數
REPEAT/REPLICATE函數
REPLACE函數
REVERSE函數
RIGHT函數
SPACE函數
STR函數
STUFF函數
SUBSTR/SUBSTRING函數
TRANSLATE函數
TRIM函數
UNICODE函數
UPPER函數
4.3日期函數
ADD_MONTHS函數
CURRENT_DATE函數
CURRENT_TIME函數
CURRENT_TIMESTAMP函數
DATE_ADD/ADDDATE函數
ATE_FORMAT函數
DATE_SUB函數
DATEADD函數
DATEDIFF函數
DATENAME函數
DATEPART函數
DAY函數
DAYNAME函數
DAYOFMONTH函數
DAYOFWEEK函數
DAYOFYEAR函數
EXTRACT函數
GETDATE函數
HOUR函數
LAST_DAY函數
MINUTE函數
MONTH函數
MONTHNAME函數
MONTHS_BETWEEN函數
NEXT_DAY函數
NOW函數
QUARTER函數
SECOND函數
SYSDATE函數
TIME_FORMAT函數
WEEK函數
WEEKDAY函數
YEAR函數
4.4轉換函數
CAST函數
COALESCE函數
CONVERT函數
DECODE函數
ISNULL函數
NULLIF函數
NVL函數
TO_CHAR函數
TO_DATE函數
TO_NUMBER函數
4.5數學函數
ABS函數
ACOS函數
ASIN函數
ATAN函數
ATAN2函數
BITAND函數
CEIL/CEILING函數
COS函數
COT函數
DEGREES函數
EXP函數
FLOOR函數
GREATEST函數
LEAST函數
LN函數
LOG函數
LOG10函數
MOD函數
PI函數
POW/POWER函數
RADIANS函數
RAND/RANDOM函數
ROUND函數
SIGN函數
SIN函數
SQRT函數
SQUARE函數
TAN函數
TRUNC函數
第5章SQL應用程序編程介面
5.1ODBC7
5.2JDBC4
5.3ESQL/C(EmbeddedSQLforC)
5.4ADO
5.5OO4O&OCI
5.6PRO*C
5.7SQLJ
5.8XML
第6章資料庫的導入/導出
6.1Oracle資料庫的導入/導出
6.2DB2資料庫的導入/導出
6.3Sybase資料庫的導入/導出
6.4SQLServer資料庫的導入/導出
6.5MySQL資料庫的導入/導出
……
J. sql查詢速度
呵呵,這個問題很有趣不是嗎?
上面的同志們只是給出一些建議,以我的經驗來看(oracle),
如果數據量較大,索引的重復量盡量避免,最好的方式是建立非業務id(最好使用自增或是序列),把這個id建立索引。
你的最大的問題就是,建立了索引後,索引列必須出現在where中,否則索引就白白建立了,比如你的id是從1一直到383000,那麼你的語句可以寫成
select * from hr_worktime where id>-1
還有就是,where條件中避免出現!=,or,between,等東西,否則索引實效。
如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!
vaela