sequence 是 pg 自帶的高效的自增id工具(也叫序列)。sequence 使用了輕量級(jí)鎖的方式來做到高效自增id的,所以會(huì)比 UPDATE 行鎖快。sequence 的返回?cái)?shù)據(jù)類型默認(rèn)是64位的整數(shù),pg 10 可以自定 smallint, integer 或者是 bigint。
成都創(chuàng)新互聯(lián)公司專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營(yíng)銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
sequence 是可以保證自增數(shù)據(jù)不重復(fù)的,也就是說每次自增后都會(huì)持久化保存,那么為了繼續(xù)提高性能,可以加上 CACHE 參數(shù)(默認(rèn)為1),每個(gè)進(jìn)程(連接)可以緩存一個(gè)子序列在當(dāng)前進(jìn)程內(nèi)存里面,當(dāng)子序列用完了才會(huì)去原序列取新的子序列。
這個(gè)用個(gè)例子簡(jiǎn)單說一下,創(chuàng)建 sequence temp_seq3 時(shí)用了 CACHE 10,A session 可以獲取到的值是 1...10,B session 可以獲取到的值是 11...20,那么獲取順序可能是 (A, A, B, A),返回值是 (1, 2, 11, 3),這個(gè)不是嚴(yán)格自增的序列,但可以保證回次返回都是唯一的,用了 CYCLE 參數(shù)的除外。
根據(jù)文檔和源碼( link 第80行),緩存在內(nèi)存里面的最大值(cached)是每個(gè)進(jìn)程都不一樣的,所以如果要求嚴(yán)格自增的服務(wù)不能用 CACHE。
這里寫三種用 pg 做自增id的方式
測(cè)試命令,在 MacOS 上用 docker 開一個(gè) pg 在里面運(yùn)行一下 pgbench 腳本,其中 sql.sql 的內(nèi)容替換成對(duì)應(yīng)的壓測(cè)腳本。
TPS: 986
TPS: 7332
TPS: 7451
看看微信的分布式id生成器,原理都差不多,"實(shí)際應(yīng)用中每次提升的步長(zhǎng)為10000" = "CACHE 10000"。 link
以上優(yōu)化已經(jīng)是用在友好速搭電商系統(tǒng)的訂單號(hào)和優(yōu)惠券號(hào)生成服務(wù)中,為商家提供更快更可靠的服務(wù)。
從join的基本語(yǔ)法如下:
由此可以知道join的類型有以下幾種類型:
假設(shè)有以下兩張表
Table A:
Table B:
要說連接,首先要知道一個(gè)概念——笛卡爾積。
在PostgreSQL中笛卡爾積就是 cross join ,這是上面join類型中沒有提到的。
結(jié)果如下:
簡(jiǎn)單來說,笛卡爾積就是把兩張表所有的行拼起來。3行的表與3行的表連接,連接表就是9行。
內(nèi)連接的 inner 是可以省略不寫的。內(nèi)連接會(huì)把滿足連接條件的t_a和t_b的行連接起來,作為連接表的一行。
結(jié)果如下:
只有滿足條件:id相等的列才會(huì)出現(xiàn)在連接表里。
首先會(huì)執(zhí)行內(nèi)連接,然后把左表的行都放進(jìn)連接表,對(duì)于沒有滿足條件的右表的行,用空值代替
結(jié)果如下:
首先會(huì)執(zhí)行內(nèi)連接,然后把右表的行都放進(jìn)連接表,對(duì)于沒有滿足條件的左表的行,用空值代替
結(jié)果如下:
首先會(huì)執(zhí)行內(nèi)連接,然后把左表和右表的行都放進(jìn)連接表,對(duì)于沒有滿足條件的右表的行,用空值代替;對(duì)于沒有滿足條件的左表的行,用空值代替。
結(jié)果如下:
on 后面只要跟上返回布爾值的條件表達(dá)式即可,沒有強(qiáng)制要求一定要使用表中的列,類似于where條件。
using函數(shù)需要傳入左表和右表都存在的列名。以上面的例子來說,
using(id)
等價(jià)于
on t_a.id = t_b.id
可以傳入多個(gè)列名,就相當(dāng)于用and連接多個(gè)條件。需要注意的點(diǎn)是:
結(jié)果如下:
將natural join放在連接條件里而不是連接類型里面,主要是因?yàn)閚atural join是隱含的使用了using,并且參數(shù)是兩張表中所有同名的列。
結(jié)果如下:
UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一個(gè) 128 比特的數(shù)字,可以用于唯一標(biāo)識(shí)每個(gè)網(wǎng)絡(luò)對(duì)象或資源。由于它的生成機(jī)制,一個(gè) UUID 可以保證幾乎不會(huì)與其他 UUID 重復(fù),因此常常用于生成數(shù)據(jù)庫(kù)中的主鍵值。
1.pgcrypto 模塊提供的 uuid
PostgreSQL 提供了一個(gè)用于加/解密的擴(kuò)展模塊 pgcrypto,其中的 gen_random_uuid() 函數(shù)可以用于返回一個(gè) version 4 的隨機(jī) UUID。
2.uuid-ossp 模塊提供的 uuid
uuid-ossp模塊提供函數(shù)使用幾種標(biāo)準(zhǔn)算法之一產(chǎn)生通用唯一標(biāo)識(shí)符(UUID)。還提供產(chǎn)生某些特殊 UUID 常量的函數(shù)。
1.將當(dāng)前目錄轉(zhuǎn)移到 PostgreSQL 源代碼目錄下的 contrib;如:
2.執(zhí)行如下命令來安裝擴(kuò)展模塊
如果要安裝 uuid-ossp 模塊,需要在執(zhí)行安裝擴(kuò)展模塊之前,執(zhí)行 configure 并添加 --with-uuid=xxx,xxx取值為:
然后再執(zhí)行安裝擴(kuò)展模塊的命令。
3.檢查是否安裝,在 PostgreSQL 的安裝目錄下的 /share/extension 目錄下,查看是否有模塊相關(guān)的文件。如:
注: gen_random_uuid() 從 PostgreSQL 13 開始成為了一個(gè)內(nèi)置函數(shù)
如果您所使用的PostgreSQL版本在13以上,則不需要執(zhí)行如下語(yǔ)句:
生成uuid:
如果想要生成沒有中劃線(-)的 UUID 字符串,可以使用 REPLACE 函數(shù):
查看包含的函數(shù):
執(zhí)行如下命令生成 uuid:
序列數(shù)可以增加postgresql數(shù)據(jù)表的檢索速度,同時(shí)降低數(shù)據(jù)查詢時(shí)的資源消耗。那么如何在postgresql中創(chuàng)建序列數(shù)并且應(yīng)用呢?下面我給大家分享一下。
工具/材料
pgAdmin4
創(chuàng)建序列數(shù)
首先打開pgAdmin4,展開postgresql數(shù)據(jù)庫(kù),找到模式下面的public選項(xiàng),如下圖所示
接下來在public下面右鍵單擊序列,然后點(diǎn)擊Create下面的sequence選項(xiàng),如下圖所示
在彈出的創(chuàng)建Sequence界面中首先給序列數(shù)起一個(gè)名字,如下圖所示,注意都用英文
然后切換到Definition頁(yè)卡,定義一下序列的增加量,如下圖所示,其中maximum根據(jù)自己的需要進(jìn)行設(shè)置
最后回到數(shù)據(jù)庫(kù)主界面,你會(huì)看到序列下面多出了一個(gè)項(xiàng),這就是我們創(chuàng)建的序列數(shù)了,如下圖所示
在數(shù)據(jù)表中應(yīng)用序列數(shù)
首先選中一個(gè)數(shù)據(jù)表,點(diǎn)擊右側(cè)的編輯按鈕,如下圖所示
在彈出的編輯界面中切換到Columns頁(yè)卡,點(diǎn)擊ID簽名的編輯按鈕,如下圖所示
最后在字段的編輯界面中切換到Variables選項(xiàng)卡,然后在Value列中通過nextval函數(shù)帶入剛才定義的序列數(shù)即可,如下圖所示
文章名稱:關(guān)于postgresql中的信息
瀏覽路徑:http://jinyejixie.com/article34/dsdjjse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、微信小程序、虛擬主機(jī)、網(wǎng)站改版、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)