淺談一下sql 查詢語句的一些問題和優化

来源:http://www.cnblogs.com/zuitaoran/archive/2016/01/09/5115570.html
-Advertisement-
Play Games

昨天在做一個sql代碼查詢的問題,發現了一些可優化的東西,藉此記錄一下。1,善用with as之前在寫sql 分頁查詢的時候,就只是用嵌套查詢,然後一個普通的關聯幾個表查詢,例如:SELECT * FROM( SELECT TOP 100 lr.SKU,lr.ItemPrice,lr.La...


昨天在做一個sql代碼查詢的問題,發現了一些可優化的東西,藉此記錄一下。

1,善用with as 

之前在寫sql 分頁查詢的時候,就只是用嵌套查詢,然後一個普通的關聯幾個表查詢,例如:

SELECT * FROM(
SELECT TOP 100 lr.SKU,lr.ItemPrice,lr.LazadaID,ROW_NUMBER() OVER (ORDER BY lr.PrimaryID) AS Row_ID
FROM OpenData..LazadaRefund(NOLOCK) AS lr
INNER JOIN OpenData..eBay(NOLOCK) AS e ON e.eBayID = lr.LazadaID
INNER JOIN  其他表

LEFT JOIN 其他表

WHERE 條件
) AS temp
WHERE temp.Row_ID >0 AND temp.Row_ID <= 100

後來發現,隨著增加的表越多,這種嵌套的子查詢已經越來越慢,特別是關聯了一兩千萬條數據的時候,無論是否加了索引,都查詢很慢,後來就嘗試使用了 with as ,暫且叫他遞歸查詢吧。。。。

修改瞭如下:

WITH T AS (
SELECT TOP 100 * FROM(
SELECT lr.PrimaryID,ROW_NUMBER() OVER ( ORDER BY lr.PrimaryID) AS Row_ID
FROM OpenData..LazadaRefund(NOLOCK) AS lr
INNER JOIN OpenData..eBay(NOLOCK) e ON e.eBayID = lr.LazadaID
--根據所選的查詢條件來關聯某些表
) AS temp
WHERE temp.Row_ID >0 AND temp.Row_ID <= 100
)
SELECT lr.SKU,lr.ItemPrice,lr.LazadaID,la.SellerSKU
FROM T AS t
INNER JOIN OpenData..LazadaRefund(NOLOCK) AS lr ON lr.PrimaryID = t.PrimaryID
LEFT JOIN OpenData..LazadaListing(NOLOCK) AS la ON la.LazadaID = lr.LazadaID
--前面的select需要顯示什麼就關聯什麼表
--INNER JOIN ...
--LEFT JOIN ...

 

發現,隨著數據越來越複雜,下麵的查詢遠比第一條數據快得多,記得有一次查詢用了一分多鐘才查出來,後來直接就變成20秒不到

2,用一下臨時表

如果有些語句你放在子查詢覺得慢,不妨試試弄一個臨時表,然後再關聯一下這個臨時表就好了

3,用union all 好過 union, 具體我沒怎麼測試過,不過確實是這樣的。。。。

4,

這東西我也是第一次用,對優化你的sql代碼是有幫助的,我相信dba很多時候都用到吧

 

ps: 因為我雖然我畢業的大學不算差,可是實際編程的時間不長,所以很多東西都是接觸不深,謹此來記錄一下我的編程路上覺得需要記的東西,不一定對大家有用,但是希望能作為對自己的勉勵吧,願生活一切安好。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux安裝mysql。
  • 一、簡介 使用linux系統的過程中,有時發現系統根目錄(/)的空間不足,導致系統運行很慢,針對該現象,本文詳細介紹根目錄(/)的空間擴展方法。 二、操作步驟 1)查看根目錄大小 df 2)查找系統有無可用空間,發現系統存在未使用硬碟/dev/sdb fdisk -l 3)依次執行如下指令,對該磁碟...
  • 在我自己的伺服器上面搭建了郵件伺服器,為的是接下來寫shell腳本進行報警監控。當伺服器發生意外,可以及時發送郵件伺服器到郵箱。看了兩個教程,按照兩個教程來搭建的,感謝原作。Linux 下搭建Postfix郵件伺服器詳解:1、首先關閉sendmail服務service sendmail stop2、...
  • Linux安裝jdk。
  • 概述 LVM的產生是因為傳統的分區一旦分區好後就無法線上擴充空間,也存在一些工具能實現線上擴充空間但是還是會面臨數據損壞的風險;傳統的分區當分區空間不足時,一般的解決辦法是再創建一個更大的分區將原分區卸載然後將數據拷貝到新分區,但是在企業的生產系統往往不允許停機或者允許停機的時間很短,LVM就能.....
  • Ubuntu 15.10 (似乎從14.04開始) 的小坑,使用自帶遠程桌面連接出錯,弄得我很不爽,偶爾從 上看到一視頻,解決了。聊以記之。 順便說一下,這個自帶的桌面共用的名字是:vino 原本使用 vnc4server 也挺好,無奈 `lubuntu ubuntu unity` 就是灰屏,...
  • Linux 系統 網路配置配置Linux系統網路的方法有幾種,這裡介紹本人常用的兩種。第一種:使用命令ifconfig配置,具體用法:Ipconfig ethx x.x.x.x netmask x.x.x.x效果如下圖:通常,此種配置法只是用來測試用,因為重啟機器後,該配置的內容將會失效。第二種方....
  • 最近準備做一個公司物品申領系統,資料庫的表已經設計好,目前正在搭建開發和運行環境。計劃使用ASP.Net + SQL Server完成此次的設計。以下為會員註冊的存儲過程,預計把註冊頁面中的兩個Text框中的數值作為參數傳入資料庫中,最後返回1或0表示成功/失敗: 1 ALTER procedure...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...