国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

這篇具有很好參考價值的文章主要介紹了淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

(一)前言

(二)正文

1.?物化視圖(索引視圖)與查詢重寫的基本概念

2. 創(chuàng)建測試環(huán)境

(1)建表

(2)寫數(shù)據(jù)

3.?索引視圖創(chuàng)建

(1)創(chuàng)建語法

(2)為索引視圖創(chuàng)建索引

?4. 查詢重寫

5.?為什么查詢會被重寫

?6.?索引視圖什么時候更新

7.?改變基于視圖的查詢


(一)前言

之前做ORACLE DBA的時候,在參與業(yè)務(wù)涉及中常會遇到物化視圖這個概念,同樣在SQL SERVER中也有類似于ORACLE的物化視圖的功能,只是名稱變成了索引視圖。本文我們將采用SQL SERVER來談一談索引視圖(物化視圖)以及基于此的查詢重寫。

(二)正文

1.?物化視圖(索引視圖)與查詢重寫的基本概念

與普通視圖比,物化視圖就是直接將數(shù)據(jù)存儲起來了。而物化視圖的作用之一就是可以實(shí)現(xiàn)查詢重寫。SQL Server中的索引視圖就具有查詢重寫的功能,所謂的查詢重寫,就是如果符合條件的數(shù)據(jù)在索引視圖上,并且查詢列都包含在在索引視圖上,此時可以直接通過查詢索引視圖來替代基于原始表的查詢。

2. 創(chuàng)建測試環(huán)境

(1)建表

創(chuàng)建兩張表,一張表頭TESTZYY,一張明細(xì)TESTLMN,僅僅作為DEMO使用

--創(chuàng)建兩張表,一張表頭TESTZYY,一張明細(xì)TESTLMN,僅僅作為DEMO使用
CREATE TABLE TESTZYY
(
    HeadId      INT PRIMARY KEY  ,
    HeadInfo    VARCHAR(50)      ,
    DataStatus  TINYINT          ,
    CreateDate  Datetime
)
GO;

CREATE TABLE TESTLMN
(
    HeadId      INT           ,
    DetailId    INT identity(1,1) PRIMARY KEY ,
    DetailInfo  VARCHAR(50)
)
GO;

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

(2)寫數(shù)據(jù)

給上一步中創(chuàng)建的兩個表各插入20萬條數(shù)據(jù)。

--寫入數(shù)據(jù)
DECLARE @i int = 0
WHILE @i<200000
BEGIN
    INSERT INTO TESTZYY values (@i,NEWID(),RAND()*10,GETDATE()-RAND()*100)
    INSERT INTO TESTLMN(HeadId,DetailInfo) VALUES (@i,NEWID())
    SET @i=@i+1
END
GO

?淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

3.?索引視圖創(chuàng)建

那么如何創(chuàng)建索引視圖呢?語法上跟創(chuàng)建普通視圖差別不大,但是不允許出現(xiàn)select *,表名上要加上Scheme,如下會做簡單說明。

(1)創(chuàng)建語法

CREATE VIEW V_IndexViewTest WITH SCHEMABINDING
AS
    SELECT H.HeadId,H.CreateDate,H.DataStatus,D.DetailId,D.DetailInfo
    FROM dbo.TESTZYY H INNER JOIN 
                dbo.TESTLMN D ON H.HeadId = D.HeadId
    WHERE H.DataStatus = 0
GO;

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

TIPS:

創(chuàng)建時候一定要用INNER JOIN,否則在后續(xù)創(chuàng)建聚集索引時候會有報錯!?

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?

(2)為索引視圖創(chuàng)建索引

索引視圖要求創(chuàng)建的第一個列為唯一聚集索引,所以如下,創(chuàng)建一個唯一的聚集索引。

create unique clustered index idx_headid
on V_IndexViewTest(detailid);

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

對于其他索引,可以跟在表上創(chuàng)建索引一樣

create index idx_createdate on V_IndexViewTest(Createdate);

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?4. 查詢重寫

上面說了,查詢重寫就是將基于原始表的查詢語句,直接在索引視圖上查詢實(shí)現(xiàn),那么就來看一下查詢重寫是什么樣子的?

下面來觀察這么一個查詢,SQL很明顯地是基于原始表做的查詢,跟普通查詢并無二致,但是觀察執(zhí)行計(jì)劃就會發(fā)現(xiàn):這個執(zhí)行計(jì)劃走了一個索引查找,首先很清楚,TESTZYY上的CreateDate是沒有索引的,這里走的索引就是V_IndexViewTest上的CreatDate列上的索引,也就是在索引視圖上創(chuàng)建的第二個索引。

select H.headid,H.createdate,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0
and H.createdate > '2022-10-01 00:00:00.000'
and H.createdate < '2022-10-02 00:00:00.000'

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?如果,查詢語句這么寫,如下,在查詢條件中增加了一個索引視圖中沒有的列,此時查詢就不會被重寫,直接走的是基于原始表的查詢,跟普通查詢并無二致。
其實(shí)原理不難理解,因?yàn)橐晥D中并不包含HeadInfo這個列,如果在查詢列上加上這個字段,視圖中是沒有這個字段的,那只能基于原始表做查詢了。

select H.headid,H.createdate,H.headinfo,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0
and H.createdate > '2022-10-01 00:00:00.000'
and H.createdate < '2022-10-02 00:00:00.000'

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

5.?為什么查詢會被重寫

上面我們看到了,對于合適的查詢,查詢是會被重寫的,也就是查詢直接基于索引視圖來實(shí)現(xiàn),那么為什么會直接基于視圖來實(shí)現(xiàn)呢?


還是處于性能上的考慮,因?yàn)樗饕晥D在創(chuàng)建唯一的聚集索引之后,視圖就“固化了”原始表的結(jié)果集,此時的視圖與普通視圖最大的區(qū)別就是,視圖中直接存儲了數(shù)據(jù)本身,而非一個查詢,此時的視圖中的數(shù)據(jù)集,相當(dāng)于基于原表的一個“子集”,因?yàn)槭亲蛹?,這個結(jié)果集必然小于原始表,那么同樣的查詢字段和查詢條件,不但可以減少表與表之間的鏈接操作,且結(jié)果集更小,從這個視圖上查詢,因此同等條件下可以更快地返回結(jié)果,所以查詢重寫也就不難理解了。

結(jié)合上述結(jié)論,此時只要查詢字段和查詢條件一樣,基于原始表的查詢和直接查詢索引視圖是一樣的,如下截圖?:

select H.headid,H.createdate,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0 and H.createdate > '2022-10-01 00:00:00.000' 
and H.createdate < '2022-10-02 00:00:00.000';

select headid,createdate,detailid,detailinfo
from dbo.V_IndexViewTest
where datastatus = 0 and createdate > '2022-10-01 00:00:00.000'
and createdate < '2022-10-02 00:00:00.000';

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫?淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?6.?索引視圖什么時候更新

上面說了查詢重寫,如果條件允許,基于原始表的查詢會直接從索引視圖上來實(shí)現(xiàn)??赡苡腥藭环判模吘箶?shù)據(jù)都是基于物理表做增刪改的,而索引視圖中的數(shù)據(jù)又是物理存在的,那就就會有一個擔(dān)心,基于視圖的查詢會不會不準(zhǔn)確?畢竟是我好好的一個查詢,你默認(rèn)給我定位到索引視圖上,查詢結(jié)果會跟原始表查詢一致嗎?

那么就要求證一下,索引視圖中的數(shù)據(jù)是如何更新的。我們做這么一個測試,在基表,也就是TESTLMN中查詢一條數(shù)據(jù),看看到底在執(zhí)行計(jì)劃中發(fā)生了什么 可以明顯地看到,不僅僅是往TESTLMN中寫入了一條數(shù)據(jù),同時,基于索引視圖的查詢也往索引視圖中寫入了一條數(shù)據(jù),因此可以放心地使用索引視圖而不必?fù)?dān)心索引視圖中的數(shù)據(jù)和基表的數(shù)據(jù)不一致的問題。

但是要注意的就是,此時的寫,是寫入基表的同事,也寫入了索引視圖,對寫入的影響是肯定有一些的,如果對寫入效率要求非常高,就要謹(jǐn)慎一點(diǎn)了。其實(shí)索引視圖也是一種冗余寫來實(shí)現(xiàn)查詢效率的提高的。

insert into dbo.TESTLMN(HeadId,DetailInfo) values (666,newid());

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

7.?改變基于視圖的查詢

上面說了,某些基于視圖的查詢,是直接定位到視圖,從視圖中查詢結(jié)果返回的,如下圖

?淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

?淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

但是如果真的不想從視圖中查詢,我就是想對比一下原始表和基于視圖查詢的(效率上的)區(qū)別,該怎么辦?這個也好辦,可以通過查詢提示,將查詢來基于原始表實(shí)現(xiàn),也就是展開這個索引視圖了OPTION (EXPAND VIEWS)這個查詢提示就是將視圖展開,從原始表進(jìn)行查詢,默認(rèn)情況下是不展開的。如截圖,可以強(qiáng)制展開索引視圖,從原始表查詢?:

select headid,createdate,detailid,detailinfo
from dbo.V_IndexViewTest
where datastatus = 0 and createdate > '2022-10-01 00:00:00.000'
and createdate < '2022-10-02 00:00:00.000' option(expand views);

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

那么效率對比呢?如下截圖,粗看起來,這個效率差別還是挺大的,可見,SQL Server默認(rèn)選擇下,載效率上還是有一定的考慮的

淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫

這里從索引視圖查詢,一是減少了表之間的join,而是索引視圖的結(jié)果集更小,從中篩選符合條件的數(shù)據(jù)效率就會更好一些。所以,默認(rèn)情況下是會從視圖查詢來對SQL進(jìn)行查詢重寫的。索引視圖的查詢提示:with(no expand) 強(qiáng)制不展開,OPTION (EXPAND VIEWS)強(qiáng)制展開。

總結(jié):

  本文粗淺地分析了SQL Server 中的索引視圖以及索引視圖帶來的查詢重寫功能,通過索引視圖固化基表的結(jié)果集,
  可以在一定程度上提高查詢效率,尤其是在超級大的多表join的時候,直接將原始結(jié)果存為一個索引視圖,
  通過對索引視圖查詢來減少表之間的join和IO來提高效率,不失為一種優(yōu)化選擇。
  需要注意的是,SQL Server的索引視圖限制非常多,具體可以參考鏈接叢書或者M(jìn)SND,并不是所有的情況都可以使用索引視圖來實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-448035.html

到了這里,關(guān)于淺談SQL Server索引視圖(物化視圖)以及索引視圖與查詢重寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 面向區(qū)塊鏈的高效物化視圖維護(hù)和可信查詢

    面向區(qū)塊鏈的高效物化視圖維護(hù)和可信查詢

    人工智能技術(shù)與咨詢? 摘 要:區(qū)塊鏈具有去中心化、不可篡改和可追溯等特性,可應(yīng)用于金融、物流等諸多行業(yè).由于所有交易數(shù)據(jù)按照交易時間順序存儲在各個區(qū)塊,相同類型的交易數(shù)據(jù)通常會散布在諸多區(qū)塊之中,降低了面向歷史區(qū)塊的追溯查詢的處理效率.索引構(gòu)建和物化視圖

    2023年04月09日
    瀏覽(24)
  • 【SQL Server】數(shù)據(jù)庫開發(fā)指南(六)索引和視圖的使用技巧、方法與綜合應(yīng)用

    【SQL Server】數(shù)據(jù)庫開發(fā)指南(六)索引和視圖的使用技巧、方法與綜合應(yīng)用

    本系列博文還在更新中,收錄在專欄:#MS-SQL Server 專欄中。 本系列文章列表如下: 【SQL Server】 Linux 運(yùn)維下對 SQL Server 進(jìn)行安裝、升級、回滾、卸載操作 【SQL Server】數(shù)據(jù)庫開發(fā)指南(一)數(shù)據(jù)庫設(shè)計(jì)的核心概念和基本步驟 【SQL Server】數(shù)據(jù)庫開發(fā)指南(二)MSSQL數(shù)據(jù)庫開發(fā)對

    2024年02月06日
    瀏覽(126)
  • 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    1、apache-hive-3.1.2簡介及部署(三種部署方式-內(nèi)嵌模式、本地模式和遠(yuǎn)程模式)及驗(yàn)證詳解 2、hive相關(guān)概念詳解–架構(gòu)、讀寫文件機(jī)制、數(shù)據(jù)存儲 3、hive的使用示例詳解-建表、數(shù)據(jù)類型詳解、內(nèi)部外部表、分區(qū)表、分桶表 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL

    2024年02月09日
    瀏覽(26)
  • Azure SQL DB/MI以及SQL SERVER中sys.databases視圖介紹

    Azure SQL DB/MI以及SQL SERVER中sys.databases視圖介紹

    目錄 (一)前言 (二)sys.databases簡介 1. sys.databases?概覽 2.?sys.databases 字段說明 3. 權(quán)限 (三)實(shí)戰(zhàn)范例 1.?查詢 sys.databases 視圖 2.?檢查 SQL 數(shù)據(jù)庫中的復(fù)制狀態(tài) 3.?檢查 SQL 數(shù)據(jù)庫中的時態(tài)保留策略狀態(tài) ? ? ? ?作為數(shù)據(jù)庫相關(guān)工作人員,對于當(dāng)前數(shù)據(jù)庫服務(wù)器上所存在的

    2024年02月06日
    瀏覽(19)
  • SQL Server 數(shù)據(jù)表模糊查詢(like 用法)以及查詢函數(shù)

    在SQL Server Management Studio (SSMS) 中,進(jìn)行模糊查詢主要是通過使用 like 操作符來實(shí)現(xiàn)的。 like 操作符用于在 where 語句中搜索列中具有指定模式的數(shù)據(jù)。 我們在簡單例子中來了解: % 通配符:表示任意數(shù)量的字符。 這個例子會選擇 column_name 列中包含\\\"pattern\\\"這個詞的所有記錄,就

    2024年01月22日
    瀏覽(53)
  • hive-視圖與物化視圖

    1、一句話解釋 一張?zhí)摫恚淮鏀?shù)據(jù),對外暴露真實(shí)表的一部分?jǐn)?shù)據(jù),增強(qiáng)數(shù)據(jù)保密性,查詢的時候,底層會轉(zhuǎn)換成對真實(shí)表的查詢,走M(jìn)apReduce。 2、參考資料 hive的視圖_hive 視圖_kcy000的博客-CSDN博客 二、物化視圖 1、一句話解釋 將視圖持久化,不走M(jìn)apReduce,提高查詢效率 2、

    2024年02月12日
    瀏覽(22)
  • 4.2.1 SQL語句、索引、視圖、存儲過程

    怎么執(zhí)行一條select語句 1.連接器 接收連接-》管理連接-》校驗(yàn)用戶信息 2.查詢緩存 kv存儲,命中直接返回,否則繼續(xù)執(zhí)行 8.0已經(jīng)刪除 3.分析器 詞法句法分析生成語法樹 4.優(yōu)化器 指定執(zhí)行計(jì)劃,選擇查詢成本最小的計(jì)劃 5.執(zhí)行器 根據(jù)執(zhí)行計(jì)劃,從存儲引擎獲取數(shù)據(jù),并返回客

    2024年02月06日
    瀏覽(28)
  • 深入解析MySQL視圖、索引、數(shù)據(jù)導(dǎo)入導(dǎo)出:優(yōu)化查詢和提高效率

    深入解析MySQL視圖、索引、數(shù)據(jù)導(dǎo)入導(dǎo)出:優(yōu)化查詢和提高效率

    目錄 1. 視圖(View): 什么是視圖? 為什么要使用視圖? 視圖的優(yōu)缺點(diǎn) 1) 定制用戶數(shù)據(jù),聚焦特定的數(shù)據(jù) 2) 簡化數(shù)據(jù)操作 3) 提高數(shù)據(jù)的安全性 4) 共享所需數(shù)據(jù) 5) 更改數(shù)據(jù)格式 6) 重用 SQL 語句 示例操作 沒使用前 使用后 2. 索引(Index): 什么是索引? 為什么要使用索引?

    2024年02月13日
    瀏覽(39)
  • ClickHouse-物化視圖

    官方文檔 什么是物化視圖 ClickHouse 中物化視圖(Materialized View)是一種預(yù)先計(jì)算并緩存結(jié)果的視圖,它存儲在磁盤上并自動更新,典型的空間換時間思路。物化視圖是一種優(yōu)化技術(shù),它可以加速查詢操作,降低系統(tǒng)負(fù)載,并提高查詢性能。 創(chuàng)建語法: 物化視圖工作流程 當(dāng)你

    2024年02月11日
    瀏覽(20)
  • MongoDB中的物化視圖

    視圖,為查詢提供了便利。定義視圖時, 可以包含復(fù)雜的集合查詢邏輯或隱藏敏感信息。構(gòu)建查詢語句時,無需重復(fù)構(gòu)建和維護(hù)聚合管道查詢中的多個過程。Mongodb查詢優(yōu)化器也可以調(diào)整查詢管道中的順序,與視圖查詢中定義的查詢條件一起進(jìn)行優(yōu)化。 視圖實(shí)時返回聚合查詢

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包