如何降低SQL語句復雜度

SQL語句復雜度的優化就是在結果正確的前提下,將復雜、難以維護的SQL語句拆分成獨立、易懂的SQL片段,當然也要充份利用索引,減少表描的I/O次數,盡量避免表搜索的發生。下面介紹降低SQL語句復雜度的幾個建議

1、動態查詢語句

一些應用為了實現客戶端的靈活性,會根據用戶的選擇,動態拼出TSQL語句,發給SQL運行。

例如,在用戶界面上列出各種條件,讓用戶根據自己的喜好,輸入條件,進行組合查詢。這樣在功能上來講比較強大,但是在復雜度控制上就有可能會出問題。如果用戶選擇的條件太多,或者根據條件返回的記錄太多,就有可能會造成問題。而有些能夠過濾大量數據,或者在索引上的條件如果沒有被選上,就有可能造成在大表上的table

scan。最好在程序里有動態語句復雜度的控制機制,限制選擇的條件限制返回記錄的數量。

2、視圖和存儲過程的深度

視圖和存儲過程能夠抽象出一些業務邏輯,簡化設計,是很推薦的做法。但是如果在引用視圖和存儲過程時不加注意,視圖套視圖,存儲過程嵌存儲過程,最后嵌套上四五層,那復雜度累積起來,可能會超出你想象。對SQL的優化,也是很嚴重的考驗。所以在引用他們的時候,也要考慮累積的復雜度

3、表格聯接的數量

為了支持復雜的業務邏輯,一個應用往往會有成百上千的表格,一些查詢往往會聯接十幾張甚至幾十張表。應用設計的時候對這樣的查詢要很慎重。如果表格很大,十幾張表做聯接,肯定不會有好的性能。如果應用是支持數據分析系統,那可能還好。如果應用是一個OLTP系統,這樣的設計失敗的風險可能會很大。有時候可能需要降低數據庫范式級別,多保存一些冗余數據列,以減少表格聯接的數量

4、用多個簡單語句替代一個復雜語句

如果一個復雜的語句有很多張表要聯接,要做很多計算,很多時候,要根據表和表的邏輯關系,知道某一張表和另一張表如果先做聯接,可能會過濾掉更多數據。得到的小的結果集再做其他聯接,會更快。

類似的,有些計算可以先做,也可以后做,我們在了解了表格的邏輯之后會知道是先做好還是后做好。可惜SQL作為一個計算機程序,在這方面沒有人那么聰明。當語句太復雜的時候,他有可能看不出來了。

為了提高性能,對這種特別復雜的語句,可以把一句話拆成兩句,甚至三句分步做完,中間結果集,可以以臨時表的形式存放。這樣做對程序員來講做了很多事,但是對SQL來講,大大簡化了復雜度。很多時候對性能也會有幫助

歡迎關注我的公眾號(同步更新文章)DoNet技術分享平臺

閱讀原文

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272656.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272656.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

提高程序員工作效率的11個技巧

“吃苦耐勞”真的是優良品質嗎,與你怎么做相比,老板們應該更關心你做了什么、達到的效果。所以,效率,還是效率,希望這些實用小技巧對大家有所幫助。1、兩分鐘法則如果一件事可以在兩分鐘內完成,比如回復郵件…

tq3358 linux 串口驅動編程,TQ335x——spidev驅動的生成

kernel:CD盤的kernel3.2包環境:vmware10,ubuntu14.04修改的部分:arch/arm/mach-omap2/board-am335xevm.c文件中static struct spi_board_info am335x_spi1_slave_info[] {{.modalias "smb380",.platform_data &A…

Linux下顯示ip所屬位置

在linux下,要是網絡出現延遲,通常我們需要分析自己到對端的服務器的網絡環境 1 例:ping www.baidu.com 2 traceroute www.baidu.com 通過分析來確定大概是什么問題,可當我們去跟蹤某個ip的時候不知道來源,假如每一個…

C#程序集相關的概念

程序集包含:類型元數據(描述在代碼中定義的每一類型和成員,二進制形式)。程集元數據(程序集清單、版本號、名稱等)、IL代碼(這些都被裝在exe或dll中)、資源文件。每個程序集都有自己…

linux+刪除亂碼的文件,linux 下刪除亂碼文件-乾頤堂

在linux下刪除文件,遇到特殊字符是一件非常頭疼的事情。1. 如果文件名帶 ‘-’ 或者‘--’這樣的字符刪除辦法為:rm -- 文件名如文件名為:-pythontab.tgz如果用普通方法去刪除:1rm -pythontab.tgz結果錯誤:rm: invalid…

程序員如何保護自己的頸椎

我們程序員天天對著電腦,眼睛,頸椎等等,都會落下不少的職業病。來說說怎么治療自己的頸椎病。1、頸椎病是怎么產生的形成頸椎病的核心原因是:不良生活習慣我們身體的絕大部分疾病都是來自不良的生活習慣,生活習慣不改&…

如何改變XCode的默認設置

改變bundle ID 進入 /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application 目錄然后進入各個子目錄(Navigation-based ApplicationOpenGL ES ApplicationSplit View-based ApplicationTab Bar ApplicationUtility ApplicationView-b…

linux關機時循環輸出腳本,Linux關機時執行指定腳本功能實現

1.關機時執行某個腳本的具體思路(1)在文件夾/etc/init.d/下創建關機時需要執行的腳本file_name;(2)分別在文件夾/etc/rc0.d/和/etc/rc6.d/下創建該該腳本文件的鏈接文件K07file_name:sudo ln -s /etc/init.d/file_name /etc/rc0.d/K07file_namesudo ln -…

URI和URL及URN的區別

對于URL,大家都比較熟悉,其他兩個詞就比較陌生了。URI、URL和URN是識別、定位和命名互聯網上的資源的標準途徑。1989年Tim Berners-Lee發明了互聯網(World Wide Web)。WWW被認為是全球互連的實際的和抽象的資源的集合–它按需求提供信息實體–…

Linux基礎-目錄與路徑

今天我們一起來認識下linux中的目錄與路徑及操作其的一些常用命令。 說起路徑就有絕對與相對之分,雖然簡單,我們還是再啰嗦一下: 絕對路徑,從系統的根目錄/開始的目錄都是相對路徑,比如/usr/bin、/usr/local 相對路徑…

螺旋圖形Linux,Canvas 螺旋線幾何圖形繪制

JavaScript語言:JaveScriptBabelCoffeeScript確定window.requestAnimFrame (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnim…

28家知名IT公司名稱的由來

28家IT公司名稱由來,你知道嗎?EMC、VMware、IBM、Oracle、NetApp、Citrix、Cisco、Google、Amazon、Alibaba、UCloud、Tencent、Baidu等著名的存儲、備份或云計算行業的IT公司,相信你我都是耳熟能詳,但這些公司的名稱是如何而來的…

編程應該用 Mac ,還是 PC ?

愛編程,不愛修電腦;愛學習,更愛運動;愛科技,也愛娛樂;愛工作,不愛加班。愛幽默、愛生活、愛浪漫、愛打拼,我是程序員,我為自己代言,關注程序員,分…

linux創建虛擬聲卡,Pear BIOS 安裝和配置指引

Pear BIOS 安裝指引Pear BIOS是一套硬件模擬系統,操作系統可以在這套模擬硬件上運行。Pear BIOS可以讓用戶同時安裝多套操作系統,使用時可以選擇任何一套操作系統啟動。在傳統電腦系統上,操作系統可以識別并必須識別硬件;而在這套…

左右值

C/C語言中可以放在賦值符號左邊的變量,即具有對應的可以由用戶訪問的存儲單元,并且能夠由用戶去改變其值的量。左值表示存儲在計算機內存的對象,而不是常量或計算的結果。或者說左值是代表一個內存地址值,并且通過這個內存地址&am…

關于 ASP.NET 內存緩存你需要知道的 10 點

緩存機制的主要目的是提高應用程序的性能。作為 ASP.NET 開發人員,你可能會意識到 ASP.NET Web 窗體以及 ASP.NET MVC 可以使用 Cache 對象緩存應用程序的數據。這通常被稱為服務器端數據緩存,并且常作為框架的內置功能。雖然 ASP.NET Core 中并沒有這樣…

linux git刪除的文件怎么還原,從Git倉庫中恢復已刪除的分支、文件或丟失的commit...

從Git倉庫中恢復已刪除的分支、文件或丟失的commit在使用Git的過程中,有時可能會有一些誤操作比如:執行checkout -f 或 reset -hard 或 branch -d刪除一個分支結果造成本地(遠程)的分支或某些commit丟失可以通過reflog來進行恢復,前提是丟失的…

兩張趣圖助你理解狀態碼的含義~

HTTP狀態碼(HTTP Status Code)是用以表示網頁服務器HTTP響應狀態的3位數字代碼。我們可以通過查看HTTP狀態碼來判斷服務器狀態,常見的有404 、502等;但是其他不是很常見的狀態碼都代表什么狀態呢?下面有兩張有趣的圖片…

java 自定義注解以及獲得注解的值

1.自定義注解 import java.lang.annotation.*;Documented Target(ElementType.FIELD) Inherited Retention(RetentionPolicy.RUNTIME ) public interface MyAnno {/*** 是否能為null* return*/boolean isCanNull() default true;/*** 是否能為空字符串* return*/boolean isCanE…

linux列出管道,lsof列出的管道列表示什么意思?_linux_開發99編程知識庫

文件不僅以流形式打開。 其中一些是在 lsof 手冊中列出的:FD is the File Descriptor number of the file or:cwd current working directory;Lnn library references (AIX);err FD information error (see NAME column);jld jail directory (FreeBSD);ltx shared l…