① 請簡述項目中優化sql語句執行效率的方法,從哪些方面,sql語句性能如何分析
1. SQL優化的原則是:將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的數據吞吐量。
調整不良SQL通常可以從以下幾點切入:
? 檢查不良的SQL,考慮其寫法是否還有可優化內容
? 檢查子查詢 考慮SQL子查詢是否可以用簡單連接的方式進行重新書寫
? 檢查優化索引的使用
? 考慮資料庫的優化器
2. 避免出現SELECT * FROM table 語句,要明確查出的欄位。
3. 在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,定位越准確,則該where條件越應該前移。
4. 查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立復合索引,這樣查詢時只進行索引掃描,不讀取數據塊。
5. 在判斷有無符合條件的記錄時建議不要用SELECT COUNT (*)和select top 1 語句。
6. 使用內層限定原則,在拼寫SQL語句時,將查詢條件分解、分類,並盡量在SQL語句的最里層進行限定,以減少數據的處理量。
7. 應絕對避免在order by子句中使用表達式。
8. 如果需要從關聯表讀數據,關聯的表一般不要超過7個。
9. 小心使用 IN 和 OR,需要注意In集合中的數據量。建議集合中的數據不超過200個。
10. <> 用 < 、 > 代替,>用>=代替,<用<=代替,這樣可以有效的利用索引。
11. 在查詢時盡量減少對多餘數據的讀取包括多餘的列與多餘的行。
12. 對於復合索引要注意,例如在建立復合索引時列的順序是F1,F2,F3,則在where或order by子句中這些欄位出現的順序要與建立索引時的欄位順序一致,且必須包含第一列。只能是F1或F1,F2或F1,F2,F3。否則不會用到該索引。
13. 多表關聯查詢時,寫法必須遵循以下原則,這樣做有利於建立索引,提高查詢效率。格式如下select sum(table1.je) from table1 table1, table2 table2, table3 table3 where (table1的等值條件(=)) and (table1的非等值條件) and (table2與table1的關聯條件) and (table2的等值條件) and (table2的非等值條件) and (table3與table2的關聯條件) and (table3的等值條件) and (table3的非等值條件)。
注:關於多表查詢時from 後面表的出現順序對效率的影響還有待研究。
14. 子查詢問題。對於能用連接方式或者視圖方式實現的功能,不要用子查詢。例如:select name from customer where customer_id in ( select customer_id from order where money>1000)。應該用如下語句代替:select name from customer inner join order on customer.customer_id=order.customer_id where order.money>100。
15. 在WHERE 子句中,避免對列的四則運算,特別是where 條件的左邊,嚴禁使用運算與函數對列進行處理。比如有些地方 substring 可以用like代替。
16. 如果在語句中有not in(in)操作,應考慮用not exists(exists)來重寫,最好的辦法是使用外連接實現。
17. 對一個業務過程的處理,應該使事物的開始與結束之間的時間間隔越短越好,原則上做到資料庫的讀操作在前面完成,資料庫寫操作在後面完成,避免交叉。
18. 請小心不要對過多的列使用列函數和order by,group by等,謹慎使用disti軟體開發t。
19. 用union all 代替 union,資料庫執行union操作,首先先分別執行union兩端的查詢,將其放在臨時表中,然後在對其進行排序,過濾重復的記錄。
當已知的業務邏輯決定query A和query B中不會有重復記錄時,應該用union all代替union,以提高查詢效率。
② 如何在EXCEL中使用SQL進行數據處理與分析
在EXCEL中使用SQL進行數據處理與分析步驟有:
工具原料:excel2013版本
打開「excel」,在「數據」選項卡中,找到「自其他來源」;
③ 怎樣分析sql語句的執行計劃
寫好一段SQL代碼以後,可以通過查看SQL的執行計劃,初步預測該SQL在運行時的性能好壞,尤其是在sql調優時,我們可以通過查看執行計劃, 來分析sql性能問題,本文簡單介紹怎麼在plsql中查看SQL語句的執行計劃。
http://jingyan..com/article/ab69b270bffc2e2ca7189fee.html④ 如何用SQL分析電商用戶行為數據(案例)
本文以「淘寶用戶行為數據集」的分析全過程為例,展示數據分析的全過程
——使用工具:MySQL,Excel,Navicat,PowerBI
——分析類型:描述分析,診斷分析
——分析方法:漏斗分析,用戶路徑分析,RFM用戶價值分析,活躍/存留分析,帕累托分析,假設驗證分析。
(考慮到閱讀體驗文章中只放了SQL截圖,如需PDF版本,再公眾號後台回復「用戶行為分析」領取)
(目錄如下)
1.分析流程和方法
當沒有清晰的數據看板時我們需要先清洗雜亂的數據,基於分析模型做可視化,搭建描述性的數據看板。
然後基於描述性的數據挖掘問題,提出假設做優化,或者基於用戶特徵數據進行預測分析找規律,基於規律設計策略。簡單來說:
——描述性分析就是:「畫地圖」
——診斷性分析就是:「找問題」
——預測性分析就是 :「找規律」
在數據分析中有兩個典型的場景:
一種是有數據,沒有問題:需要先整體分析數據,然後再根據初步的描述分析,挖掘問題做診斷性分析,提出假設,設計策略解決問題。
另一種是已經發現了問題,或者已經有了假設,這種做數據分析更偏向於驗證假設。
2.淘寶用戶行為分析
本次是對「淘寶用戶行為數據集」進行分析,在分析之前我們並不知道有什麼問題,所以需要先進行描述性分析,分析數據挖掘問題。
我們首先來看下這個數據集的元數據:
根據以上數據欄位我們可以拿用戶行為為主軸從縱深方向提出一些問題,然後再從數據中找答案
縱向:
——這個數據集中用戶的日活躍和周活躍時間有什麼規律嗎?
——在當日活躍的用戶次日,三日,四日……還有多少活躍?
深向:
——用戶從瀏覽到購買的整體轉化率怎麼樣?
——用戶從瀏覽到購買的路徑是怎麼樣子的?
——平台主要會給用戶推送什麼商品?
——用戶喜歡什麼類目?喜歡什麼商品?
——怎麼判斷哪些是高價值用戶 ?
下面是叮當整理的常用分析方法:
我們可以給前面的問題匹配一下分析方法,便於後面的分析:
為了便於後面的數據分析,在分析之前我們需要先對做一下清洗
看元數據(欄位解釋,數據來源,數據類型,數據量……)初步發現問題為之後的處理做准備。
確定缺失值范圍,去除不需要欄位,填充缺失內容
根據元數據格式和後續分析需要的格式對數據進行處理
去除重復值,異常值
——去除重復值:並把用戶ID,商品ID,時間戳設置為主鍵
——異常值處理:查詢並刪除2017年11月25日至2017年12月3日之外的數據
查詢並刪除小於2017-11-25的
——驗證數據:
——分析思路:
——SQL提數:
——Excel可視化:
活躍曲線整體為上升狀態,同為周六日,12月2號,3號相比11月25日,26日活躍度更高。
用戶在周六周日相比其他時間更活躍(周六周日為休息日,用戶有更多時間)
一天內用戶活躍的最高峰期為21點(用戶在這個時間段空閑較多)
——分析思路:
——SQL提數:
列出每用戶每天及當天後面又活躍的日期,並創建「活躍時間間隔表」用於後面求次日存留,三日存留……
對「活躍時間間隔表視圖」引用進行分組統計,計算每日存留人數並創建視圖
對存留人數表進行計算,統計活躍用戶留存率
——Excel可視化:
——分析思路:
——SQL提數:
-把各種用戶行為分離出來並創建視圖方便後續查詢用戶行為數據
查詢整體數據漏斗
——Excel可視化:
用戶從瀏覽到購買整體轉化率2.3%,具體主要在哪個環節流失還需要再細分用戶路徑分析
——分析思路:
——SQL提數:
——PowerBI可視化:
用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越底
路徑1:瀏覽→購買:轉化率1.45%
路徑2:瀏覽→加購物車→購買:轉化率0.33
路徑3:瀏覽→收藏→購買:轉化率0.11%
路徑4:瀏覽→收藏→加購物車→購買:轉化率0.03%
——分析思路:
——SQL提數:
——Excel可視化:
——描述性分析:
瀏覽量top100的商品瀏覽量呈階梯分布,越靠前的階梯之間的落差相對越大在這個階梯中的商品越少,越靠後商品瀏覽量階梯之間的落差相對越小,同階梯內的商品越多。
瀏覽量TOP100的商品所屬類目中,4756105,3607361,4357323三個類目瀏覽量遠超其他類目。
——分析思路:
——SQL提數:
查詢計算商品轉化率,升序排列,取前100個
——Excel可視化:
——描述性分析:
從商品看:有17款商品轉化率超過了1。
從類目看:這些商品所屬類目分布均勻,除965809,4801426,2735466,2640118,5063620,4789432,2945933這7個類目之外,其他類目都只有一個商品在轉化率TOP100的商品中。
——分析思路:
用戶價值分析常用的分析方式是RFM模型
本次分析中的R,F,M具體定義(僅用於演示分析方法,無實際業務參考價值):
——SQL取數與分析:
1)建立打分標准:先計算R,F的值,並排序,根據R,F值最大值和最小值得區間設計本次得打分標准
-查詢並計算R,F值創建視圖
-引用RF數值表,分別查詢R,F的最大值和最小值
-結合人工瀏覽的建立打分標准
2)給R,F按價值打分
3)計算價值的平均值
4)用平均值和用戶分類規則表比較得出用戶分類
——Excel可視化
通過描述性分析得到可視化的數據後我們一般會先看一下是否符合業務常識
如果符合常識接下來我們會通過與行業平均數據和本產品的同比環比對比看是否正常,如果不正常就要找原因,設計解決方案,如果正常那就看是否有可以優化的地方。
我們首先來看一下這些描述性分析是否符合業務常識和指標是否正常:
1.活躍曲線整體為上升狀態,同為周六日,12月2號,3號相比11月25日,26日活躍度更高。
2.用戶在周六周日相比其他時間更活躍
3.一天內用戶活躍的最高峰期為21點
4.從2017年11月15日致2017年12月3日,活躍用戶新增38%
5.從2017年11月15日致2017年12月3日,活躍用戶次日留存增長18.67%,當日的活躍用戶留存也在快速增長,第七日留存比次日留存高18.56%。
6.用戶從瀏覽到購買整體轉化率2.3%
7.用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越低。
8.瀏覽量top100的商品瀏覽量呈階梯分布,越靠前的階梯之間的落差相對越大在這個階梯中的商品越少,越靠後商品瀏覽量階梯之間的落差相對越小,同階梯內的商品越多。
9.瀏覽量TOP100的商品所屬類目中,4756105,3607361,4357323三個類目瀏覽量遠超其他類目。
10.從商品看:有17款商品轉化率超過了1。
11.從類目看:這些商品所屬類目分布均勻,除965809,4801426,2735466,2640118,5063620,4789432,2945933這7個類目之外,其他類目都只有一個商品在轉化率TOP100的商品中。
根據以上診斷分析我們梳理出了以下假設,做假設驗證。
假設1:這些商品中有高轉化率的爆款商品
對比瀏覽量TOP5的商品,發現這些商品轉化率在同一類目下並不高,假設不成立
假設2:4756105,3607361,4357323三個類目屬於高頻剛需類目
-創建類目購買頻次表
-計算類目購買頻次平均值
-查詢4756105,3607361,4357323三個類目的購買頻次
4756105,3607361,4357323三個類目的用戶購買頻次明顯高於平均值,假設成立
假設3:有部分用戶是未點擊商詳直接從收藏和購物車購買的。
用戶不是直接從收藏和購物車購買的,只是後續復購未點擊商詳,假設不成立
假設4:淘寶推薦的商品主要是「同一類目下的高轉化商品」
用Excel對瀏覽量TOP100的商品ID和轉化率TOP100的商品ID進行去重,結果無重復值,假設不成立
3.結論:
1)用戶活躍:用戶活躍曲線整體呈上升趨勢,在一周中周六,周日活躍度比平時更高,在一天中用戶活躍曲線從凌晨4點開始往上升,在中午12點和下午5~6點有兩個小低谷(吃飯),到晚上9點時活躍度達到頂峰。
2)用戶留存:從2017年11月15日致2017年12月3日的用戶留存數據來看,淘寶的用戶留存數據較好,活躍用戶次日留存增長18.67%,當日的活躍用戶留存也在快速增長,第七日留存比次日留存高18.56%。
3)用戶轉化:整體轉化2.3%,用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越低。
4)平台推薦與用戶偏好:從數據集中的數據來看,排除用戶興趣偏好標簽,淘寶給用戶用戶推送的商品主要是高頻剛需的類目,促使用戶復購,流量迴流平台。
以上結論受數據量和數據類型的影響,並不一定準確,僅用來練習數據分析方法。
(考慮到閱讀體驗文章中只放了SQL截圖,如需PDF版本,再公眾號後台回復「用戶行為分析」領取)
⑤ 通過分析SQL語句的執行計劃優化SQL
如何干預執行計劃
-
-
使用hints提示
基於代價的優化器是很聰明的,在絕大多數情況下它會選擇正確的優化器,減輕了DBA的負擔。但有時它也聰明反被聰明誤,選擇了很差的執行計劃,使某個語句的執行變得奇慢無比。此時就需要DBA進行人為的干預,告訴優化器使用我們指定的存取路徑或連接類型生成執行計劃,從而使語句高效的運行。例如,如果我們認為對於一個特定的語句,執行全表掃描要比執行索引掃描更有效,則我們就可以指示優化器使用全表掃描。在Oracle中,是通過為語句添加hints(提示)來實現干預優化器優化的目的。
hints是oracle提供的一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計劃。我們可以用hints來實現:
1.
使用的優化器的類型
2.基於代價的優化器的優化目標,是all_rows還是first_rows。
3.
表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。
4.
表之間的連接類型
5.
表之間的連接順序
6.
語句的並行程度
除了」RULE」提示外,一旦使用的別的提示,語句就會自動的改為使用CBO優化器,此時如果你的數據字典中沒有統計數據,就會使用預設的統計數據。所以建議大家如果使用CBO或HINTS提示,則最好對表和索引進行定期的分析。
如何使用hints:
Hints只應用在它們所在sql語句塊(statement
block,由select、update、delete關鍵字標識)上,對其它SQL語句或語句的其它部分沒有影響。如:對於使用union操作的2個sql語句,如果只在一個sql語句上有hints,則該hints不會影響另一個sql語句。
我們可以使用注釋(comment)來為一個語句添加hints,一個語句塊只能有一個注釋,而且注釋只能放在SELECT,
UPDATE,
or
DELETE關鍵字的後面
使用hints的語法:
{DELETE|INSERT|SELECT|UPDATE}
/*+
hint
[text]
[hint[text]]...
*/
or
{DELETE|INSERT|SELECT|UPDATE}
--+
hint
[text]
[hint[text]]...
註解:
1.DELETE、INSERT、SELECT和UPDATE是標識一個語句塊開始的關鍵字,包含提示的注釋只能出現在這些關鍵字的後面,否則提示無效。
2.「+」號表示該注釋是一個hints,該加號必須立即跟在」/*」的後面,中間不能有空格。
3.hint是下面介紹的具體提示之一,如果包含多個提示,則每個提示之間需要用一個或多個空格隔開。
4.text
是其它說明hint的注釋性文本
如果你沒有正確的指定hints,Oracle將忽略該hints,並且不會給出任何錯誤。⑥ 如何在EXCEL中使用SQL進行數據處理與分析
方法一:利用Microsoft Query使用SQL語句
⑦ 尋求高手解開sql語句
SQLServer資料庫管理的常用SQL語句
1. 查看資料庫的版本
select @@version
2. 查看資料庫所在機器操作系統參數
exec master..xp_msver
3. 查看資料庫啟動的參數
sp_configure
4. 查看資料庫啟動時間
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看資料庫伺服器名和實例名
print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME)
5. 查看所有資料庫名稱及大小
sp_helpdb
重命名資料庫用的SQL
sp_renamedb 'old_dbname', 'new_dbname'
6. 查看所有資料庫用戶登錄信息
sp_helplogins
查看所有資料庫用戶所屬的角色信息
sp_helpsrvrolemember
修復遷移伺服器時孤立用戶時,可以用的fix_orphan_user腳本或者LoneUser過程
更改某個數據對象的用戶屬主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
注意: 更改對象名的任一部分都可能破壞腳本和存儲過程。
把一台伺服器上的資料庫用戶登錄信息備份出來可以用add_login_to_aserver腳本
7. 查看鏈接伺服器
sp_helplinkedsrvlogin
查看遠端資料庫用戶登錄信息
sp_helpremotelogin
8.查看某資料庫下某個數據對象的大小
sp_spaceused @objname
還可以用sp_toptables過程看最大的N(默認為50)個表
查看某資料庫下某個數據對象的索引信息
sp_helpindex @objname
還可以用SP_NChelpindex過程查看更詳細的索引情況
SP_NChelpindex @objname
clustered索引是把記錄按物理順序排列的,索引占的空間比較少。
對鍵值DML操作十分頻繁的表我建議用非clustered索引和約束,fillfactor參數都用默認值。
查看某資料庫下某個數據對象的的約束信息
sp_helpconstraint @objname
9.查看資料庫里所有的存儲過程和函數
use @database_name
sp_stored_proceres
查看存儲過程和函數的源代碼
sp_helptext '@procere_name'
查看包含某個字元串@str的數據對象名稱
select distinct object_name(id) from syscomments where text like '%@str%'
創建加密的存儲過程或函數在AS前面加WITH ENCRYPTION參數
解密加密過的存儲過程和函數可以用sp_decrypt過程
10.查看資料庫里用戶和進程的信息
sp_who
查看SQL Server資料庫里的活動用戶和進程的信息
sp_who 'active'
查看SQL Server資料庫里的鎖的情況
sp_lock
進程號1--50是SQL Server系統內部用的,進程號大於50的才是用戶的連接進程.
spid是進程編號,dbid是資料庫編號,objid是數據對象編號
查看進程正在執行的SQL語句
dbcc inputbuffer ()
推薦大家用經過改進後的sp_who3過程可以直接看到進程運行的SQL語句
sp_who3
檢查死鎖用sp_who_lock過程
sp_who_lock
11.收縮資料庫日誌文件的方法
收縮簡單恢復模式資料庫日誌,收縮後@database_name_log的大小單位為M
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 語句的方法:
set statistics time {on | off}
set statistics io {on | off}
圖形方式顯示查詢執行計劃
在查詢分析器->查詢->顯示估計的評估計劃(D)-Ctrl-L 或者點擊工具欄里的圖形
文本方式顯示查詢執行計劃
set showplan_all {on | off}
set showplan_text { on | off }
set statistics profile { on | off }
13.出現不一致錯誤時,NT事件查看器里出3624號錯誤,修復資料庫的方法
先注釋掉應用程序里引用的出現不一致性錯誤的表,然後在備份或其它機器上先恢復然後做修復操作
alter database [@error_database_name] set single_user
修復出現不一致錯誤的表
dbcc checktable('@error_table_name',repair_allow_data_loss)
或者可惜選擇修復出現不一致錯誤的小型資料庫名
dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB 有3個參數:
repair_allow_data_loss 包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,
以及刪除已損壞的文本對象,這些修復可能會導致一些數據丟失。
修復操作可以在用戶事務下完成以允許用戶回滾所做的更改。
如果回滾修復,則資料庫仍會含有錯誤,應該從備份進行恢復。
如果由於所提供修復等級的緣故遺漏某個錯誤的修復,則將遺漏任何取決於該修復的修復。
修復完成後,請備份資料庫。
repair_fast 進行小的、不耗時的修復操作,如修復非聚集索引中的附加鍵。
這些修復可以很快完成,並且不會有丟失數據的危險。
repair_rebuild 執行由 repair_fast 完成的所有修復,包括需要較長時間的修復(如重建索引)。
執行這些修復時不會有丟失數據的危險。⑧ sql數據分析是啥意思
sql數據分析是結構化查詢語言。
結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系資料庫系統。
結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式。
所以具有完全不同底層結構的不同資料庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的介面。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。
SQL具有數據定義、數據操縱、數據查詢和數據控制的功能。
1、SQL數據定義功能:能夠定義資料庫的三級模式結構,即外模式、全局模式和內模式結構。在SQL中,外模式又叫做視圖(View),全局模式簡稱模式(Schema),內模式由系統根據資料庫模式自動實現,一般無需用戶過問。
2、SQL數據操縱功能:包括對基本表和視圖的數據插入、刪除和修改,特別是具有很強的數據查詢功能。
3、SQL的數據控制功能:主要是對用戶的訪問許可權加以控制,以保證系統的安全性。
⑨ sql數據分析需要學什麼
作為數據分析師,你首先需要從正在查詢的資料庫中讀取數據。我們一般會採用這種方法:
了解SELECT語句的工作方式。這其中包括研究邏輯查詢處理的工作方式。邏輯查詢處理描述了資料庫引擎執行SELECT語句的子句的順序。了解它會引導你編寫更好,更准確的查詢。
研究聯接的工作方式
內部聯接是最有效的。左,右和完全外部聯接的效率較低,但有時必須使用它們。內部聯接可以導致行被過濾掉,外部聯接不能導致過濾。研究加入,因此你知道何時使用每種類型。只有最簡單的資料庫查詢才不涉及聯接。
了解如何使用GROUP BY子句進行聚合
了解窗口函數/有序分析函數。這些是在SQL中進行分析的縮影。最初很難將你的頭纏繞在它們周圍,但是這是值得的。一旦了解了它們,便會一直使用它們。
了解資料庫規范化。如果你了解規范化,你將了解為什麼架構師以這種方式構造資料庫的理論。這有助於編寫查詢並確定要聯接的表。
了解實體關系圖(ERD)的工作方式。大多數ERD是使用魚尾紋符號構建的。確保知道基數和可選性約束是如何工作的,這將幫助你解密連接表時要使用的連接類型。
一旦掌握了這些知識,就應該擴展到學習SQL的DML和DDL子類別。DML代表數據操作語言,SELECT語句是該語言的一部分。DDL代表數據定義語言,這是資料庫架構師用來創建表的語言。
本文禁止轉載或摘編
本文為我原創
大數據
數據分析
數據分析師
1
收藏
分享
推薦文章
35歲轉行數據分析師可以嗎?
學習 · 56閱讀
Excel之PowerQuery 提取單元格指定文字
學習 · 175閱讀
[簡述]答題驗證系統部署說明
學習 · 865閱讀