修改字段类型_PostgreSQL 关于字段类型的修改 谣言与止谣
?
PostgreSQL 在9.2 之前是要面臨一個(gè)指責(zé),就是在更改字段類(lèi)型的時(shí)候帶來(lái)的不堪,假象你有100萬(wàn)行的數(shù)據(jù),其中一個(gè)字段是varchar(20) ,你想將其更改為 varhcar(30), 這可能就要造成一個(gè)災(zāi)難,熟悉postgresql 原理的人們,馬上就想到,可能要生成一個(gè)“新表”了。導(dǎo)致Postgres重寫(xiě)表的每一行,這可能是一個(gè)非常昂貴的操作(就磁盤(pán)I/O和掛鐘時(shí)間而言),MYSQL 早期的版本也沒(méi)有好到哪里去,可是這對(duì)難兄難弟,都會(huì)成長(zhǎng)。
PostgreSQL 在9.2 之后修改字段的大小,例如 varchar(20) ---> varchar(30) 返回修改僅僅是一瞬間的事情。
所以現(xiàn)在如果還有人說(shuō),PG修改字段的大小太差勁,那我到是覺(jué)得活在上世紀(jì)的 someone 可以清理一下內(nèi)存了,終歸新的東西是要不斷學(xué)習(xí)的,你去看看現(xiàn)在的MYSQL 8 如果你的知識(shí)還保留在 MYSQL 5.5 ,那你一定也需要更新了。
那問(wèn)題1 如果你還在使用PG 9.2 之前的版本,并繼續(xù)受到這個(gè)問(wèn)題的纏繞,怎么辦
1 升級(jí)數(shù)據(jù)庫(kù)版本 (當(dāng)然這個(gè)說(shuō)法估計(jì)支持的聲音不少,但實(shí)際上做的人不多,因?yàn)闋砍兜馁Y源和人太多,沒(méi)有人愿意在沒(méi)有占有這個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的開(kāi)發(fā)或者第三方開(kāi)發(fā)商的支持下去做這個(gè)事情)
2 建議將字段更換為text字段,(或者經(jīng)常需要變動(dòng)的文字的字段),
ALTER TABLE test ALTER COLUMN puzzle TYPE text;ALTER TABLE test ADD CONSTRAINT checksum_lengthCHECK (LENGTH(puzzle) <= 32);我們先看看這個(gè)方法合適嗎,這個(gè)方法當(dāng)然合適,字段的擴(kuò)充可以換個(gè)思路,我們可以給的無(wú)限,然后后面通過(guò)約束限制一下,這樣DBA 和開(kāi)發(fā)其實(shí)都開(kāi)心當(dāng)然也有人說(shuō),你加完約束,系統(tǒng)的性能會(huì)受到影響,來(lái)來(lái)來(lái)我們做一個(gè)測(cè)試,插入1百萬(wàn)的數(shù)據(jù),僅僅需要6秒多.
當(dāng)然這并不是本期主要的話題,本期的主要話題是
這里要澄清的是,不是所有的PG 的 Alter Column type 操作都要進(jìn)行重建表的操作(這里先不牽扯索引的事情)
這就是今天要進(jìn)行測(cè)試的表,PG的版本 PG 12.2
測(cè)試如下
1 name 的類(lèi)型從 char 變?yōu)?varchar 在變成 text
2 將上面的變化在變回來(lái)
將整形從小變大 從大變小,將日期類(lèi)型進(jìn)行變化
這些都是需要重寫(xiě)的
說(shuō)完這些可能還有些人有疑問(wèn)
1 添加一個(gè)字段呢,添加一個(gè)帶默認(rèn)值的字段呢
2 刪除一個(gè)字段呢
3 更改一個(gè)字段的名字呢
結(jié)果是這些都不需要重寫(xiě),另外在PG11 已經(jīng)解決了關(guān)于 默認(rèn)值的問(wèn)題,這個(gè)問(wèn)題,其實(shí)在有的商業(yè)數(shù)據(jù)庫(kù)到很新的版本還是一個(gè)問(wèn)題。
最后是關(guān)于索引的問(wèn)題,這里PG 建立索引盡量要使用
CREATE INDEX CONCURRENTLY idx_add_c on type_change (add_c);
根據(jù)PG 的原理來(lái)說(shuō),我們?cè)诮⑺饕绻皇褂?concurrently 參數(shù)則建立索引時(shí)表要 獲取一個(gè) access exclusive 的鎖,而如果我們使用了 concurrently 則我們會(huì)獲得一個(gè) share update exclusive 的鎖。所以使用了concurrently 則會(huì)允許在索引建立的同時(shí)繼續(xù)讀取數(shù)據(jù)和寫(xiě)入數(shù)據(jù),當(dāng)然也有一些副作用,今天就不說(shuō)了,這個(gè) concurrently 其實(shí)也可以找一期說(shuō)一下,也是有點(diǎn)意思。
總結(jié)
以上是生活随笔為你收集整理的修改字段类型_PostgreSQL 关于字段类型的修改 谣言与止谣的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 代写python代码一般多少钱_代写CO
- 下一篇: mysql分页插件springboot_