六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

TDengine 3.0 的 Update 功能和 2.0 有何區(qū)別?

隨著云原生時(shí)序數(shù)據(jù)庫(kù)(Time Series Database,TSDB) TDengine 3.0 的發(fā)布,很多用戶其實(shí)會(huì)好奇:“和 2.0 比起來(lái),3.0 有哪些直觀的優(yōu)化呢?”

本文將以 Update 這一功能的變化為例,具體介紹一下 3.0 的細(xì)致優(yōu)化。

和 2.0 比起來(lái),3.0 版本的 Update 不再需要參數(shù)配置,“部分列更新”成為數(shù)據(jù)庫(kù)本身的特性,并且還解決了 2.0 的 Update 機(jī)制的一些不足。 

一、2.0 時(shí)代的 Update:

對(duì)于 TDengine 的 Update 功能,老用戶應(yīng)該都比較清楚:

在 2.0 版本中,TDengine 通過對(duì) database 級(jí)別參數(shù)值 “update” 的配置,來(lái)完成對(duì)相同時(shí)間戳行的數(shù)據(jù)更新。

  1. update 為 0 ,不更新;
  2. update 為 1 ,整行更新,未指定值的列會(huì)被更新為 NULL;
  3. update 為 2,部分列更新,未指定值或者寫入 NULL 的列會(huì)保留原有值。

一開始,TDengine 只支持 update 為 1 (即整行更新)。但在很多場(chǎng)景下,用戶往往不會(huì)在同一時(shí)間更新一張表中的所有列,因此我們后續(xù)又支持了 update 為 2(即部分列更新)。

顯然,部分列更新更為靈活,因?yàn)樗瓤梢宰龅秸懈拢挚梢宰龅骄植扛?。但是通過它的邏輯,我們或許會(huì)有這樣的疑問:如果我想把一個(gè)值更新為 NULL 值,應(yīng)該怎么辦呢?這個(gè)疑問是有道理的。不過 2.0 版本并不支持這樣的更新。

在 2.0 的版本中,數(shù)據(jù)可以被分為兩大類 NORMAL 和 NULL 。 NORMAL 類代表 TDengine 所有數(shù)據(jù)類型中的非空值字面量,而 NULL 則代表所有數(shù)據(jù)類型的空值字面量。

當(dāng) Update 行為發(fā)生時(shí),它的邏輯是 :如果在某一行 insert 語(yǔ)句中沒有顯式寫入某一列值的話,會(huì)認(rèn)為該列輸入了 NULL 值。

所以下面這兩種寫法的語(yǔ)義其實(shí)是一樣的。

TDengine Database
  1. insert into t1 (ts,num1,num2) values (“xxxx”,1,2) ;
  2. insert into t1 values (“xxxxx”,1,2,NULL) ;

所以在 update 為 1 時(shí),上述兩個(gè) SQL 都會(huì)用 NULL 值會(huì)覆蓋掉 num3 原有的值。

而在 update 為 2 時(shí),上述兩個(gè) SQL 又都會(huì)保留 num3 原有的值。

因此,上述設(shè)定會(huì)導(dǎo)致 2.0 版本無(wú)法把一個(gè)值更新為 NULL 值。

、3.0 時(shí)代的 Update:

為了避免這一問題,從 3.0 版本開始,TDengine 引入了 None 值(未賦值)語(yǔ)義——當(dāng)用戶進(jìn)行 insert 輸入時(shí),如果未對(duì)某一列進(jìn)行顯式輸入(如上面的 SQL 語(yǔ)句 1),taosc 不再將其置為 NULL,而是將該列標(biāo)識(shí)為 None(對(duì)外查詢?nèi)燥@示為 Null)。

因此,仍然以上述兩個(gè) SQL 為例,在 3.0 版本的 Update 場(chǎng)景中,它們已經(jīng)有了不同:

  1. Insert into t1 (ts,num1,num2) values (“xxxxx”,1,2); (對(duì)于 num3 列, 標(biāo)記為 NONE)
  2. insert into t1 values (“xxxxx”,1,2,NULL);(對(duì)于 num3 列, 標(biāo)記為 NULL)

而 3.0 的 Update 規(guī)則為:如果寫入的是 NORMAL/NULL ,那么就取版本號(hào)比較大的行,如果我寫入的是 NONE,那么就取版本號(hào)比較小的行,所以:

  • SQL 語(yǔ)句 1 會(huì)把 t1 表的 num1 和 num2 列都更新成最值,num3 保持原樣(因?yàn)?num3 要和 NONE 取版本比較小的行);
  • SQL 語(yǔ)句 2 會(huì)把 t1 表的 num1 和 num2 列都更新成最值,num3 更新成 null(因?yàn)?num3 要和 NULL 取版本比較大的行)。

由上可見,由于 NONE 的引入,3.0 已經(jīng)可以在無(wú)需任何配置的情況下,以部分列更新模式來(lái)進(jìn)行數(shù)據(jù)更新了。


可以用這幾條簡(jiǎn)單的 SQL 來(lái)體驗(yàn) TDengine 的這個(gè)新特性:

CREATE TABLE `t1` (`ts` TIMESTAMP, `num1` INT, `num2` INT, `num3` INT);
insert into t1 values ("2020-01-01 01:00:00",1,1,1);
insert into t1 (ts,num1,num2) values ("2020-01-01 01:00:00",2,2);
insert into t1 values ("2020-01-01 01:00:00",3,3,null);

三、更新邏輯

其實(shí),TDengine 不論是在 2.0 還是 3.0 時(shí)代,更新的邏輯都是類似的:3.0 是不論在硬盤還是內(nèi)存的數(shù)據(jù)都只是標(biāo)記更新(寫入時(shí)間戳相同的數(shù)據(jù)會(huì)生成子數(shù)據(jù)塊),而 2.0 內(nèi)存中的數(shù)據(jù)是物理更新,硬盤上是標(biāo)記更新。在查詢的時(shí)候,他們都是先把原本的數(shù)據(jù)塊和子數(shù)據(jù)塊從硬盤上讀取到內(nèi)存中,再通過被高版本覆蓋或被低版本覆蓋的方式完成某列數(shù)據(jù)的更新或保留,然后再把它們與原先存在于內(nèi)存中的數(shù)據(jù)合并處理,最后把結(jié)果返回給客戶端。

不過,與 2.0 比起來(lái),3.0 使用了 multi-version (多版本模式),這是由于 2.0 的更新、刪除功能不是一開始就有的,而是后期逐步增加的實(shí)現(xiàn),有點(diǎn)像打補(bǔ)丁,不夠優(yōu)雅。所以 3.0 相當(dāng)于把這些割裂的功能,從存儲(chǔ)引擎底部做了一次優(yōu)化融合,也大幅提升了用戶體驗(yàn),以這個(gè) Update 功能為例,用戶不再需要任何配置,只需要知道 TDengine 的更新方式就可以了。

而關(guān)于 3.0 的存儲(chǔ)引擎的底層優(yōu)化具體詳情,可以通過這篇文章進(jìn)一步了解。

四、結(jié)語(yǔ)

3.0 上有很多類似這樣的優(yōu)化和重構(gòu)。之后我們會(huì)持續(xù)以文章視頻等形式,帶領(lǐng)大家深入探索這款云原生的時(shí)序數(shù)據(jù)庫(kù),一起為企業(yè)帶來(lái)價(jià)值,為開發(fā)者帶來(lái)成功。