电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

SQLSERVER 臨時(shí)表和表變量的區(qū)別匯總

瀏覽:184日期:2023-03-06 14:25:45
目錄
  • 一:背景
    • 1. 講故事
  • 二:到底有什么區(qū)別
    • 1. 前置思考
    • 2. 如何驗(yàn)證都存儲(chǔ)在 tempdb 中 ?
    • 3. 不同點(diǎn)在哪里
  • 三:總結(jié)

    一:背景

    1. 講故事

    今天和大家聊一套面試中經(jīng)常被問到的高頻題,對(duì),就是 臨時(shí)表表變量 這倆玩意,如果有朋友在面試中回答的不好,可以嘗試看下這篇能不能幫你成功邁過。

    二:到底有什么區(qū)別

    1. 前置思考

    不管是 臨時(shí)表 還是 表變量 都帶了 這個(gè)詞,既然提到了 ,按推理自然會(huì)落到某一個(gè) 數(shù)據(jù)庫 中,如果真在一個(gè) 數(shù)據(jù)庫 中,那自然就有它的存儲(chǔ)文件 .mdf 和 .ldf,那是不是如我推理的那樣呢? 查閱 MSDN 的官方文檔可以發(fā)現(xiàn),臨時(shí)表表變量 確實(shí)都會(huì)使用 tempdb 這個(gè)臨時(shí)存儲(chǔ)數(shù)據(jù)庫,而且 tempdb 也有自己的 mdf,ndf,ldf 文件,截圖如下:

    有了這個(gè)大思想之后,接下來就可以進(jìn)行驗(yàn)證了。

    2. 如何驗(yàn)證都存儲(chǔ)在 tempdb 中 ?

    要想驗(yàn)證其實(shí)很簡單,sqlserver 提供了多種方式觀察。

    • 查詢的過程中觀察 tempdb 下是否存在 xxx 表。
    • 使用動(dòng)態(tài)管理視圖 sys.dm_db_session_space_usage 查詢當(dāng)前sql占用tempdb下的數(shù)據(jù)頁個(gè)數(shù)。

    為了讓測(cè)試效果明顯,我分別插入 10w 條記錄觀察 數(shù)據(jù)頁 占用情況。

    1.臨時(shí)表插入 10w 條記錄

    CREATE TABLE #temp(    id INT,	content CHAR(4000) DEFAULT "aaaaaaaaaa");GOINSERT INTO #temp(id)SELECT TOP 100000       ROW_NUMBER() OVER (ORDER BY o1.object_id) AS idFROM sys.objects AS o1,sys.objects AS o2;GOSELECT * FROM sys.dm_db_session_space_usageWHERE session_id=@@SPID;

    從圖中的 user_objects_alloc_page_count=50456 看,當(dāng)前的 insert 操作占用了 50456 個(gè)數(shù)據(jù)頁。

    接下來展開 tempdb 數(shù)據(jù)庫以及觀察到的 mdf 文件大小,都驗(yàn)證了存儲(chǔ)到 tempdb 這個(gè)結(jié)論。

    2.表變量插入 10w 條記錄

    因?yàn)楸碜兞康奶厥庑裕@里我故意暫停 1min 讓查詢遲遲得不到結(jié)束,在這期間方便展開 tempdb,重啟 sqlserver 恢復(fù)初始狀態(tài)后,執(zhí)行如下 sql:

    DECLARE @temp TABLE(    id INT,	content CHAR(4000) DEFAULT "aaaaaaaaaa");INSERT INTO @temp(id)SELECT TOP 100000       ROW_NUMBER() OVER (ORDER BY o1.object_id) AS idFROM sys.objects AS o1,sys.objects AS o2;SELECT * FROM sys.dm_db_session_space_usageWHERE session_id=@@SPID;  WAITFOR DELAY "00:01:00"

    從圖中可以看到 表變量 也會(huì)占用 5w+ 的數(shù)據(jù)頁并且數(shù)據(jù)文件會(huì)膨脹。

    3. 不同點(diǎn)在哪里

    對(duì)底層存儲(chǔ)有了了解之后,接下來按照重要度從高到低來了解一下區(qū)別吧。

    1.臨時(shí)表有統(tǒng)計(jì)信息,而表變量沒有

    所謂的 統(tǒng)計(jì)信息,就是對(duì)表數(shù)據(jù)繪制一個(gè) 直方圖 來掌握數(shù)據(jù)的分布情況,sqlserver 在擇取較優(yōu)的執(zhí)行計(jì)劃時(shí)會(huì)嚴(yán)重依賴于這個(gè) 直方圖,由于展開不了 Statistics 列,這里就從執(zhí)行計(jì)劃上觀察,如下圖所示:

    • 臨時(shí)表下的執(zhí)行計(jì)劃

    選中 SELECT * FROM #temp WHERE id > 10 AND id<20; 之后點(diǎn)擊 SSMS 的評(píng)估執(zhí)行計(jì)劃按鈕來觀察下評(píng)估執(zhí)行計(jì)劃,可以清晰的看到 sqlserver 知道表中有多少條記錄,截圖如下:

    • 表變量下的執(zhí)行計(jì)劃

    由于表變量的批處理性,我們用 SET STATISTICS XML ON 把 xml 查詢出來,然后點(diǎn)擊觀察可視化視圖,參考sql 如下:

    DECLARE @temp TABLE(    id INT,	content CHAR(4000) DEFAULT "aaaaaaaaaa");INSERT INTO @temp(id)SELECT TOP 100000       ROW_NUMBER() OVER (ORDER BY o1.object_id) AS idFROM sys.objects AS o1,sys.objects AS o2;SET STATISTICS XML ONSELECT * FROM @temp WHERE id > 10 AND id<20;SET STATISTICS XML OFF

    從圖中可以清晰的看到,雖然表變量有 10w 條記錄,但由于沒有統(tǒng)計(jì)信息,sqlserver 也就無法知道這張表的數(shù)據(jù)分布,所以就按照默認(rèn)值 1 條來計(jì)算。

    從這里大家也能看得出來,如果 表記錄 的真實(shí)條數(shù) 和 默認(rèn)的 1 嚴(yán)重偏移的話,會(huì)給生成執(zhí)行計(jì)劃 造成重大失誤,這個(gè)大家一定要當(dāng)心了。

    2.其它使用上的區(qū)別

    除了上一個(gè)本質(zhì)上的不同,接下來就是一些使用上的不同了,比如:

    • 臨時(shí)表是 session 級(jí)的,表變量是 批處理 級(jí)

    所謂的批處理,就是以 go 為界定,兩者就是作用域上的不同。

    • 臨時(shí)表可以后續(xù)修改,表變量不能后續(xù)修改。

    這里的修改涉及到 字段,索引,整體上來說臨時(shí)表在使用上和普通表趨同,表變量不能進(jìn)行后續(xù)修改。

    三:總結(jié)

    總的來說,表變量 沒有統(tǒng)計(jì)信息,也不可以后續(xù)做 DDL 操作,這種情況下 表變量臨時(shí)表 更輕量級(jí),不會(huì)有如下副作用:

    • DDL 修改導(dǎo)致執(zhí)行計(jì)劃過期重建
    • sqlserver 對(duì) 統(tǒng)計(jì)信息 的維護(hù)壓力

    其實(shí)在這種作用域下高頻的創(chuàng)建和刪除表的操作中,表變量會(huì)讓系統(tǒng)壓力減輕很多。

    但陽事總會(huì)有陰事來均衡它,一旦 表變量 的記錄條數(shù)嚴(yán)重偏移默認(rèn)的 1條,會(huì)污染sqlserver的執(zhí)行計(jì)劃擇取,可能會(huì)讓你的 sql 遭受滅頂之災(zāi),所以一定要控制 表變量 的記錄條數(shù),最好在百條內(nèi) 。

    最后的建議是:如果你是個(gè)小白可以無腦使用 臨時(shí)表 ,90%的情況下都可以做到通殺,如果你是個(gè)高手可以考慮一下 表變量

    到此這篇關(guān)于SQLSERVER 臨時(shí)表和表變量到底有什么區(qū)別的文章就介紹到這了,更多相關(guān)SQLSERVER 臨時(shí)表和表變量區(qū)別內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: MsSQL
    主站蜘蛛池模板: 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 真空上料机(一种真空输送机)-百科 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 纸张环压仪-纸张平滑度仪-杭州纸邦自动化技术有限公司 | 深圳办公室装修-写字楼装修设计-深圳标榜装饰公司 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | uv机-uv灯-uvled光固化机-生产厂家-蓝盾机电 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | BHK汞灯-百科|上海熙浩实业有限公司 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 船用锚链|专业锚链生产厂家|安徽亚太锚链制造有限公司 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 一体式钢筋扫描仪-楼板测厚仪-裂缝检测仪-泰仕特(北京) | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 |