關於臨時表和表變數的差別1

来源:http://www.cnblogs.com/Gin-23333/archive/2016/01/03/5096638.html
-Advertisement-
Play Games

臨時表,表變數,這2個兄弟在平時使用的時候並不會陌生。很多時候我們都借用這2兄弟來進行一下中間結果集的緩存之類的功能。那我就簡單說下這2兄弟在查詢時候的一些小區別1、首先我建立了一個表,存放100W的數據--數據簡單,但是每一行都飽滿~CREATE TABLE Tmp (ID INT PRIMARY...


臨時表,表變數,這2個兄弟在平時使用的時候並不會陌生。很多時候我們都借用這2兄弟來進行一下中間結果集的緩存之類的功能。那我就簡單說下這2兄弟在查詢時候的一些小區別

1、首先我建立了一個表,存放100W的數據

--數據簡單,但是每一行都飽滿~
CREATE TABLE Tmp (ID INT PRIMARY KEY,Col1 CHAR(8000))


INSERT INTO dbo.Tmp
        ( ID, Col1 )
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ROW,'a'
FROM sys.objects a,sys.objects b,sys.objects c

 

2、然後創建臨時表和表變數分別查詢,不多,就查1000條

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
DECLARE @Tb AS TABLE(ID INT)

IF OBJECT_ID('tempdb..#Tmp') IS NOT NULL
    DROP TABLE #Tmp

;WITH CTE AS 
(
    SELECT 1 AS row
    UNION ALL
    SELECT row + 1
        FROM CTE
    WHERE row < 100
)
SELECT TOP 1000 CHECKSUM(NEWID())%1000000 AS row
    INTO #Tmp
    FROM CTE , CTE v

INSERT INTO @Tb
        ( ID )
SELECT TOP 1000 CHECKSUM(NEWID())%1000000
    FROM #Tmp

DECLARE @DT DATETIME=GETDATE()
SELECT *
    FROM dbo.Tmp a
        WHERE EXISTS(SELECT * FROM @Tb WHERE ID = a.ID)
SELECT DATEDIFF(ms,@DT,GETDATE())
SELECT *
    FROM dbo.Tmp a
        WHERE EXISTS(SELECT * FROM #Tmp WHERE row = a.ID)
SELECT DATEDIFF(ms,@DT,GETDATE())

 

 

然後結果是使用臨時表執行時間大概是使用表變數的短了一半!!

我就看了一下執行計劃發現執行計劃裡面顯示查詢開銷表變數占用的比例更少啊!!!

明明執行計劃是這樣紙的,為什麼我看到的執行時間和評估的計劃不一致呢!!這就是我和明明之間的差距_(:з」∠)_

然後我又看了一下IO輸出,這才恍然大悟,表變數的讀取引起了900多次的物理讀!而臨時表的寫法物理讀取只有1次,所以執行時間上面就不一樣了!

--表變數方式'Tmp'。掃描計數 0,邏輯讀取 4000 次,物理讀取 968 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 '#A5842A1D'。掃描計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。


--臨時表方式'Tmp'。掃描計數 0,邏輯讀取 6402 次,物理讀取 1 次,預讀 8040 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
表 '#Tmp________________________________________________________________________________________________________________000000000018'。掃描計數 1,邏輯讀取 2 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。

 

 

PS:有時候如果使用表變數,中間緩存的詩句比較多(可能超過幾百條的話,有可能影響後續的查詢效率,這個時候可以試下使用臨時表來替換,說不定效率馬上上去了~)

       說得不好的地方,還請各位拍磚指導啊!

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.前言 編譯linux內核失敗的原因很多時候就是驅動選錯,適合自己本機的驅動沒編譯進去。面對特殊平臺(或者有些潔癖者,我就是^_^),要編譯精簡內核,只要本機驅動,其他都不需要。面對內核裡面這麼多驅動,不懂硬體的我們,看到都頭大。本人第一次安裝gent...
  • 1. 配置SSH遠程登錄 root@kali:~ vi /etc/ssh/sshd_config \ PermitRootLogin without password PermitRootLogin yes root@kali:~ service ssh restart 2. 設置開...
  • 首先,確保lamp環境已安裝好。準備好項目源代碼,資料庫備份文件等。由於沒有安裝好VNC,因此只能用ssh部署了。 將項目源代碼壓縮,Linux預設是支持SFTP的,用SFTP將源代碼壓縮包上傳到 /var/www/html 目錄下。關於FTP軟體,我覺得可以使用Notepad++的NPPFt...
  • OpenGL視窗 能用於OpenGL的視窗庫有很多,常見的有glut、freeglut、SDL、GLFW等。glut基本已經被廢棄,其他幾個再不同場合都有不同的應用。 GLFW為opengl superbible 6th & 7th中推薦的第三方開源視窗庫。GLFW的特點大概總結如下: 跨平臺,能在...
  • 1.編譯含有splice()函數的程式時出現,'SPLICE_F_MOVE' undeclared,'SPLICE_F_NONBLOCK' ‘SPLICE_F_MORE' 也是一樣undeclared!2.使用man splice查看,發現要定義巨集_GNU_SOURCE1 #define _GNU_...
  • 環境:Centos 6.5介紹:PhantomJS 是一個基於 WebKit 的伺服器端 JavaScript API。它全面支持web而不需瀏覽器支持,其快速,原生支持各種Web標準: DOM 處理, CSS 選擇器, JSON, Canvas, 和 SVG。 PhantomJS 可以用於 頁面自...
  • 網路編程中的關鍵問題總結總結下網路編程中關鍵的細節問題,包含連接建立、連接斷開、消息到達、發送消息等等;連接建立包括服務端接受 (accept) 新連接和客戶端成功發起 (connect) 連接。 accept接受連接的問題在本文最後會聊到,這裡談談connect的關鍵點; 使用非阻塞連接建...
  • storm kafka的使用 1.storm kafka介紹 storm kafka是storm自帶的從kafka上獲取消息的kafka客戶端程式。 提供kafka和Trident的spout實現從kafka消費數據。 2.storm kafka的使用實例 maven的依賴配置文件,要註意st...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...