從字面上錯誤的理解是說你的numeric數(shù)據(jù)類型溢出,要求絕對值小于10^13次方。你不妨試試double precision類型。。
岳陽樓網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,岳陽樓網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為岳陽樓1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的岳陽樓做網(wǎng)站的公司定做!
這段代碼主體是case when 判斷語句,是根據(jù)i.time_at_job值的不同而返回不同的數(shù)值。
前面3個when是按特定的字串來返回特定的數(shù)值(如6_m返回0; 6_months_to_1_year返回1; 1_year_to_2_years返回2);
從第四個when開始(有~ '^[0-9]+$'的條件),是先按照正則表達式匹配到i.time_at_job為數(shù)值字符串,再按照將i.time_at_job轉(zhuǎn)換為數(shù)值之后的范圍來返回不同的值: 大于等于5且小于12,或者大于等于60返回5;大于等于12時返回除以12的四舍五入值整數(shù)(round函數(shù));如果小于5,則返回轉(zhuǎn)換后的整數(shù)值。
~ '^[0-9]+$'這個符號應(yīng)該作為兩個部分: ~為正則表達式的匹配運算符,它是區(qū)分大小寫的,它是一個2元運算符,如果~前的字符串匹配后面的正則表達式,則返回true,否則返回false;后面的字符串為一個正則表達式字符串,代表要匹配的字符串必須全部為數(shù)字,并且至少有一個數(shù)字。用在該SQL中的作用就是確保i.time_at_job的值為一個數(shù)字字符串。
1.在服務(wù)器端選中一臺客戶機右擊,然后點擊“客戶端屬性”,彈出客戶端屬性對話框
2.在客戶端對話框中,先將下端還原操作系統(tǒng)的“勾”去掉,然后點擊“高級”出現(xiàn)客戶端高級設(shè)置對話框,在系統(tǒng)盤設(shè)置中將緩存存放位置選為服務(wù)端,其他地方不要做任何更改。
3.重啟該客戶機,開始安裝軟件,安裝過程中,會發(fā)現(xiàn)該機器緩存大小這一欄里緩存數(shù)值不斷增加,直至安裝完軟件。(重新啟動,再次運行該軟件,以便確定該軟件是否運行正常)
4.關(guān)閉客戶機,等服務(wù)器上該客戶機狀態(tài)顯示為未運行后,在服務(wù)端點擊“鏡像管理”
5.在鏡像菜單中選中該客戶機使用的鏡像,單擊“快照管理”按鈕。
6.選中該客戶機使用的快照節(jié)點,然后點擊“生成快照”
7.在cache文件選項中選中制作快照的客戶機,會自動填充下面的緩存路徑,在快照信息子項中輸入快照名名稱和快照描述信息,點擊“確定”按鈕后,快照則做好了。
8選中所有客戶機右擊打開客戶端屬性對話框,在“啟動菜單設(shè)置”中,將新做成的快照節(jié)點推送到用于啟動的鏡像這一欄中移動到最頂端,點擊確定。
PostGreSQL采用“快照”方式來實現(xiàn)MVCC。具體地說,這意味著每一個事務(wù)中的查詢僅能看到:
1.該事務(wù)啟動之前已經(jīng)提交的事務(wù)所作出的數(shù)據(jù)更改。
2.當前事務(wù)中該查詢之前的查詢所作出的更改。
PostGreSQL在每個事務(wù)啟動時為該事務(wù)獲取一個當前的數(shù)據(jù)庫快照,快照中數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct SnapshotData
{
SnapshotSatisfiesFunc satisfies; /*行測試函數(shù)指針*/
TransactionId xmin; /* id小于xmin的所有事務(wù)更改在當前快照中可見 */
TransactionId xmax; /* id大于xmax的所有事務(wù)更改在當前快照中可見 */
uint32 xcnt; /* 正在運行的事務(wù)的計數(shù) */
TransactionId *xip; /* 所有正在運行的事務(wù)的id列表 */
/* note: all ids in xip[] satisfy xmin = xip[i] xmax */
int32 subxcnt; /* # of xact ids in subxip[], -1 if overflow */
TransactionId *subxip; /* array of subxact IDs in progress */
CommandId curcid; /* in my xact, CID curcid are visible */
uint32 active_count; /* refcount on ActiveSnapshot stack */
uint32 regd_count; /* refcount on RegisteredSnapshotList */
bool copied; /* false if it’s a static snapshot */
} SnapshotData;
Transaction啟動時形成快照就是要記錄該Transaction可見的TransactionID,排除不可見的ID。PostGreSQL中每一個版本的數(shù)據(jù)有兩個ID,其中一個是CreationID即插入該數(shù)據(jù)的TransactionID,一個是ExpiredID,即刪除或更新該數(shù)據(jù)的TransactionID。對一個Transaction可見的數(shù)據(jù)的ID要滿足以下條件:
1.CreationID當前TransactionID
2.ExpiredID當前TransactionID或ExpiredID不存在
Transaction啟動形成快照的過程:
遍歷當前所有活動的Transaction,記錄在一個活動Transaction的ID數(shù)組中;根據(jù)Transaction的先后順序,選擇當前Transaction可見的最小TransactionID,記錄在xmin,選擇可見的最大TransactionID,記錄在xmax中。
PostGreSQL8.5中進行最終的版本選擇是在從外存中獲取一個頁面的數(shù)據(jù)之后,由一個檢驗函數(shù)(HeapTupleSatisfiesMVCC等一系列函數(shù))檢驗所有該頁面數(shù)據(jù)的數(shù)據(jù)對當前Transaction的可見性,如果不可見,則將數(shù)據(jù)除去,最后返回所有可見數(shù)據(jù)。
postgreSQL默認不允許外部連接,需要進行配置才行,postgreSQL版本是8.4.4。進入%postgreSQL_path%\8\data目錄,打開pg_hba.conf文件,找到下面這段:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# IPv4 local connections:
host all all
127.0.0.1/32 md5
# IPv6 local connections:
#host all
all ::1/128 md5
在# IPv4 下一系列的host增加一行:
host
all all 192.168.80.1/24 md5
這行的意思是允許所有 192.168.80.***
這樣ip訪問本機postgreSQL服務(wù)。這里要說明一下,原有的
host all
all 127.0.0.1/32
md5
這一行不要刪除,我第一次配置時就因為直接修改這行,然后導致postgreSQL服務(wù)無法啟動。而postgreSQL啟動失敗后,有很多postgres的進程無法自動關(guān)閉,使用任務(wù)管理器是無法手動把它們?nèi)筷P(guān)閉的,因為postgreSQL會自動開啟新的進程,經(jīng)常你關(guān)了一個,它又打開了很多個。最后我是借用cports工具的“終止打開選中窗口的進程”功能,才把postgreSQL全部給關(guān)閉的。
postgreSQL服務(wù)無法啟動,也有說解決方法如下:
修改本地鏈接屬性:
本地鏈接-屬性-Internet協(xié)議(TCP/IP)-屬性-常規(guī)
-高級-WINS-啟動
LMHOSTS查詢
已選上則點去前面的鉤(如果沒有則勾上)。確定,確定,關(guān)閉。
然后你就會發(fā)現(xiàn)postgres服務(wù)可以啟動了。
原因是Dr.com的工作方式修改了Winsock
LSP,致使postgres服務(wù)無法正常啟動。
postgres服務(wù)啟動后一直會開在那里,期間可以正常使用Dr.com(彈出對話框不要選擇重啟),但是啟動重啟之后PostgreSQL又不能使用了。
遇到這種情況請重復(fù)以上步驟,勾上或者去掉“啟動
LMHOSTS查詢”前的鉤,改變狀態(tài)就行。
然后就又可以了。
我遇到的問題不屬于這種情況,經(jīng)測試無效。
同時修改postgresql.conf文件,
listen_addresses =
'*'
我本機中默認就是如上配置,也就是我在安裝的時候就設(shè)置了允許所有地址。
配置說明:
# TYPE DATABASE USER
CIDR-ADDRESS
METHOD
說明每一行有五個字段,
分別是:連接類型、可使用的數(shù)據(jù)庫名、使用者、DIDR地址、和驗證方法等五項。
下面,我只介紹一些針對每個字段常用的選項。
字段一:TYPE。
可以選擇:local或host。
前者只能允許本地的用戶登陸Postgres數(shù)據(jù)庫;后者可以接受遠程客戶登陸。所以,
我們應(yīng)該使用“host”。
字段二:DATWABSE。
連接用戶可以使用的數(shù)據(jù)庫名字??梢允筆ostgres的一個具體的
數(shù)據(jù)庫名,也可以使用“all”來允許用戶訪問所有數(shù)據(jù)庫。
字段三:USER??梢灾付硞€具體的用戶來連接Postgres數(shù)據(jù)庫(還要結(jié)合后面的地址字段),
也可以使用“all”來允許所有用戶連接數(shù)據(jù)庫。
字段四:DIDR-ADDRESS。
是IP地址與掩碼的另一種表示方法。
Postgres是通過這個字段來了解,允許那些IP或IP網(wǎng)段連接此服務(wù)器。
它的格式是:
IP地址/掩碼。
這個掩碼和子網(wǎng)掩碼是一個道理,只不過是用一個小于等于32的正數(shù)來表示,
表示的正是子網(wǎng)掩碼中高幾位為1,
比如,255.255.255.0
就是“24”,說明高24位是1。
192.168.0.1/32 相當于
IP為192.168.0.1,子網(wǎng)掩碼為255.255.255.255的網(wǎng)段,
很顯然,這只表明192.168.0.1IP自己。
字段五:METHOD。
這是驗證方法??蛇x的有:
reject:拒絕這個IP的用戶訪問;
md5:密碼以md5作為hash編碼;
password:密碼作為明文傳輸(好恐怖!);
krb5:密碼以krb5作為hash編碼。
下面舉一個例子,來說明如何進行設(shè)置:
#
TYPE DATABASE USER CIDR-ADDRESS
METHOD
#允許IP為192.168.0.1的所有用戶登陸到Postgres服務(wù)器的所有數(shù)據(jù)庫,采用md5驗證。
host all all
192.168.0.1/32
md5
#允許用戶testuser在192.168.0.XX的網(wǎng)段任意機器登陸Postgres服務(wù)器,
#只能使用數(shù)據(jù)庫testdb,采用md5驗證。
host
testdb testuser 192.168.0.1/24 md5
2.
改監(jiān)聽地址
默認下,POSTGRESQL只接受本地服務(wù),要接受遠程服務(wù),需改postgresql.conf 文件listen_address =
*
3. 如果是在Linux上的PostgreSQL
要打開 “unix的tcpip套接子”。
編輯
$POSTGRES/data/postgresql.conf
文件,
將tcpip_socket=off改成tcpip_socket=on即可。
配置說明部分摘自文章:
PostgresSQL提供了許多數(shù)據(jù)庫配置參數(shù),本章將介紹每個參數(shù)的作用和如何配置每一個參數(shù)。
10.1 如何設(shè)置數(shù)據(jù)庫參數(shù)
所有的參數(shù)的名稱都是不區(qū)分大小寫的。每個參數(shù)的取值是布爾型、整型、浮點型和字符串型這四種類型中的一個,分別用boolean
、integer、 floating point和string表示。布爾型的值可以寫成ON、OFF、 TRUE、 FALSE、 YES、 NO、 1和 0,而且不區(qū)分大小
寫。
有些參數(shù)用來配置內(nèi)存大小和時間值。內(nèi)存大小的單位可以是KB、MB和GB。時間的單位可以是毫秒、秒、分鐘、小時和天。用ms表示
毫秒,用s表示秒,用 min表示分鐘,用h表示小時,用d表示天。表示內(nèi)存大小和時間值的參數(shù)參數(shù)都有一個默認的單位,如果用戶
在設(shè)置參數(shù)的值時沒有指定單位,則以參數(shù)默認的 單位為準。例如,參數(shù)shared_buffers表示數(shù)據(jù)緩沖區(qū)的大小,它的默認單位是
數(shù)據(jù)塊的個數(shù),如果把它的值設(shè)成8,因為每個數(shù)據(jù)塊的大小是 8KB,則數(shù)據(jù)緩沖區(qū)的大小是8*8=64KB,如果將它的值設(shè)成128MB,
則數(shù)據(jù)緩沖區(qū)的大小是128MB。參數(shù)vacuum_cost_delay 的默認單位是毫秒,如果把它的值設(shè)成10,則它的值是10毫秒,如果把它的
值設(shè)成100s,則它的值是100秒。
所有的參數(shù)都放在文件 postgresql.conf中,下面是一個文件實例:
#這是注釋
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
每一行只能指定一個參數(shù),空格和空白行都會被忽略。“ #”表示注釋,注釋信息不用單獨占一行,可以出現(xiàn)在配置文件的任何地方
。如果參數(shù)的值不是簡單的標識符和數(shù)字,應(yīng)該用單引號引起來。如果參數(shù)的值中有單引號,應(yīng)該寫兩個單引號,或者在單引號前面
加一個反斜杠。
一個配置文件也可以包含其它配置文件,使用include指令能夠達到這個目的,例如,假設(shè)postgresql.conf文件中有下面一行:
include ‘my.confg’
文件my.config中的配置信息也會被數(shù)據(jù)庫讀入。include指令指定的配置文件也可以用include指令再包含其它配置文件。如果
include指令中指定的文件名不是絕對路徑,數(shù)據(jù)庫會在postgresql.conf文件所在的目錄下查找這個文件。
用戶也可以在數(shù)據(jù)庫啟動以后修改postgresql.conf配置文件,使用命令pg_ctl reload來通知數(shù)據(jù)庫重新讀取配置文件。注意,有些
參數(shù)在數(shù)據(jù)庫啟動以后,不能被修改,只有重新啟動數(shù)據(jù)庫以后,新的參數(shù)值才能生效。另外一些參數(shù)可 以在數(shù)據(jù)庫運行過程中被
修改而且新的值可以立即生效。所以數(shù)據(jù)庫在運行過程中重新讀取參數(shù)配置文件以后,不是所有的參數(shù)都會被賦給新的值。
用戶可以在自己建立的會話中執(zhí)行命令SET修改某些配置參數(shù)的值(注意不是全部參數(shù)),例如:
SET ENABLE_SEQSCAN TO OFF;
另外,有些參數(shù)只有數(shù)據(jù)庫超級用戶才能使用SET命令修改它們。用戶可以在psql中執(zhí)行命令show來查看所有的數(shù)據(jù)庫參數(shù)的當前值
。例如:
(1)show all; --查看所有數(shù)據(jù)庫參數(shù)的值
(2)show search_path; --查看參數(shù)search_path的值
10.2 連接與認證
10.2.1 連接設(shè)置
listen_addresses (string)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它指定數(shù)據(jù)庫用來監(jiān)聽客戶端連接的TCP/IP地址。默認是值是* ,表示數(shù)據(jù)庫在啟動以
后將在運行數(shù)據(jù)的機器上的所有的IP地址上監(jiān)聽用戶請求(如果機器只有一個網(wǎng)卡,只有一個IP地址,有多個網(wǎng)卡的機器有多個 IP
地址)??梢詫懗蓹C器的名字,也可以寫成IP地址,不同的值用逗號分開,例如,’server01’, ’140.87.171.49, 140.87.171.21
’。如果被設(shè)成localhost,表示數(shù)據(jù)庫只能接受本地的客戶端連接請求,不能接受遠程的客戶端連接請求。
port (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它指定數(shù)據(jù)庫監(jiān)聽戶端連接的TCP端口。默認值是5432。
max_connections (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它決定數(shù)據(jù)庫可以同時建立的最大的客戶端連接的數(shù)目。默認值是100。
superuser_reserved_connections (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它表示預(yù)留給超級用戶的數(shù)據(jù)庫連接數(shù)目。它的值必須小于max_connections。 普通用
戶可以在數(shù)據(jù)庫中建立的最大的并發(fā)連接的數(shù)目是max_connections- superuser_reserved_connections, 默認值是3。
unix_socket_group (string)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。設(shè)置Unix-domain socket所在的操作系統(tǒng)用戶組。默認值是空串,用啟動數(shù)據(jù)庫的操作
系統(tǒng)用戶所在的組作為Unix-domain socket的用戶組。
unix_socket_permissions (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它設(shè)置Unix-domain socket的訪問權(quán)限,格式與操作系統(tǒng)的文件訪問權(quán)限是一樣的。默
認值是0770,表示任何操作系統(tǒng)用戶都能訪問Unix-domain socket。可以設(shè)為0770(所有Unix-domain socket文件的所有者所在的組
包含的用戶都能訪問)和0700(只有Unix-domain socket文件的所有者才能訪問)。對于Unix-domain socket,只有寫權(quán)限才有意義,
讀和執(zhí)行權(quán)限是沒有意義的。
tcp_keepalives_idle (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是0,意思是使用操作系統(tǒng)的默認值。它設(shè)置TCP套接字的TCP_KEEPIDLE屬性。這個參數(shù)對于
通過Unix-domain socket建立的數(shù)據(jù)庫連接沒有任何影響。
tcp_keepalives_interval (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是0,意思是使用操作系統(tǒng)的默認值。它設(shè)置TCP套接字的TCP_KEEPINTVL屬性。這個參數(shù)對
于通過Unix-domain socket建立的數(shù)據(jù)庫連接沒有任何影響。
tcp_keepalives_count (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是0,意思是使用操作系統(tǒng)的默認值。它設(shè)置TCP套接字的TCP_KEEPCNT屬性。這個參數(shù)對于
通過Unix-domain socket建立的數(shù)據(jù)庫連接沒有任何影響。
10.2.2. 安全與認證
authentication_timeout (integer)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置,它指定一個時間長度,在這個時間長度內(nèi),必須完成客戶端認證操作,否則客戶端
連接請求將被拒絕。它可以阻止某些客戶端進行認證時長時間占用數(shù)據(jù)庫連接。單位是秒,默認值是60。
ssl (boolean)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。決定數(shù)據(jù)庫是否接受SSL連接。默認值是off。
ssl_ciphers (string)
指定可以使用的SSL加密算法。查看操作系統(tǒng)關(guān)于openssl的用戶手冊可以得到完整的加密算法列表(執(zhí)行命令openssl ciphers –v
也可以得到)。
10.3 資源消耗
10.3.1 內(nèi)存
shared_buffers (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它表示數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊的個數(shù),每個數(shù)據(jù)塊的大小是8KB。數(shù)據(jù)緩沖區(qū)位于數(shù)據(jù)
庫的共享內(nèi)存中,它越大越好,不能小于128KB。默認值是1024。
temp_buffers (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是8MB。它決定存放臨時表的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊的個數(shù),每個數(shù)據(jù)塊的大小是8KB。臨時
表緩沖區(qū)存放在每個數(shù)據(jù)庫進程的私有內(nèi)存中,而不是存放在數(shù)據(jù)庫的共享內(nèi)存中。默認值是1024。
max_prepared_transactions (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它決定能夠同時處于prepared狀態(tài)的事務(wù)的最大數(shù)目(參考PREPARE TRANSACTION命令
)。如果它的值被設(shè)為0。則將數(shù)據(jù)庫將關(guān)閉prepared事務(wù)的特性。它的值通常應(yīng)該和max_connections的值 一樣大。默認值是5。
work_mem (integer)
這個參數(shù)可以在任何時候被設(shè)置。它決定數(shù)據(jù)庫的排序操作和哈希表使用的內(nèi)存緩沖區(qū)的大小。如何work_mem指定的內(nèi)存被耗盡,數(shù)
據(jù)庫將使用磁盤文件進 行完成操作,速度會慢很多。ORDER BY、DISTINCT和merge連接會使用排序操作。哈希表在Hash連接、hash聚
集函數(shù)和用哈希表來處理IN謂詞中的子查詢中被使用。單位是 KB,默認值是1024。
maintenance_work_mem (integer)
這個參數(shù)可以在任何時候被設(shè)置。它決定數(shù)據(jù)庫的維護操作使用的內(nèi)存空間的大小。數(shù)據(jù)庫的維護操作包括VACUUM、CREATE INDEX和
ALTER TABLE ADD FOREIGN KEY等操作。 maintenance_work_mem的值如果比較大,通??梢钥s短VACUUM數(shù)據(jù)庫和從dump文件中恢復(fù)數(shù)
據(jù)庫需要的時間。 maintenance_work_mem存放在每個數(shù)據(jù)庫進程的私有內(nèi)存中,而不是存放在數(shù)據(jù)庫的共享內(nèi)存中。單位是KB,默
認值是16384。
max_stack_depth (integer)
這個參數(shù)可以在任何時候被設(shè)置,但只有數(shù)據(jù)庫超級用戶才能修改它。它決定一個數(shù)據(jù)庫進程在運行時的STACK所占的空間的最大值
。數(shù)據(jù)庫進程在運行時,會 自動檢查自己的STACK大小是否超過max_stack_depth,如果超過,會自動終止當前事務(wù)。這個值應(yīng)該比
操作系統(tǒng)設(shè)置的進程STACK的大小 的上限小1MB。使用操作系統(tǒng)命令“ulimit –s“可以得到操作系統(tǒng)設(shè)置的進程STACK的最大值。單
位是KB,默認值是100。
10.3.2 Free Space Map
數(shù)據(jù)庫的所有可用空間信息都存放在一個叫free space map (FSM)的結(jié)構(gòu)中,它記載數(shù)據(jù)文件中每個數(shù)據(jù)塊的可用空間的大小。FSM
中沒有記錄的數(shù)據(jù)塊,即使有可用空間,也不會系統(tǒng)使用。系統(tǒng)如果需要新的物理存 儲空間,會首先在FSM中查找,如果FSM中沒有
一個數(shù)據(jù)頁有足夠的可用空間,系統(tǒng)就會自動擴展數(shù)據(jù)文件。所以,F(xiàn)SM如果太小,會導致系統(tǒng)頻繁地擴展數(shù) 據(jù)文件,浪費物理存儲
空間。命令VACUUM VERBOSE在執(zhí)行結(jié)束以后,會提示當前的FSM設(shè)置是否滿足需要,如果FSM的參數(shù)值太小,它會提示增大參數(shù)。
FSM存放在數(shù)據(jù)庫的共享內(nèi)存中,由于物理內(nèi)存的限制,F(xiàn)SM不可能跟蹤數(shù)據(jù)庫的所有的數(shù)據(jù)文件的所有數(shù)據(jù)塊的可用空間信息,只能
跟蹤一部分數(shù)據(jù)塊的可用空間信息。
max_fsm_relations (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。默認值是1000。它決定FSM跟蹤的表和索引的個數(shù)的上限。每個表和索引在FSM中占7個
字節(jié)的存儲空間。
max_fsm_pages (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它決定FSM中跟蹤的數(shù)據(jù)塊的個數(shù)的上限。initdb在創(chuàng)建數(shù)據(jù)庫集群時會根據(jù)物理內(nèi)存
的大小決定它的值。每 個數(shù)據(jù)塊在fsm中占6個字節(jié)的存儲空間。它的大小不能小于16 * max_fsm_relations。默認值是20000。
10.3.3 內(nèi)核資源
max_files_per_process (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。他設(shè)定每個數(shù)據(jù)庫進程能夠打開的文件的數(shù)目。默認值是1000。
shared_preload_libraries (string)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。它設(shè)置數(shù)據(jù)庫在啟動時要加載的操作系統(tǒng)共享庫文件。如果有多個庫文件,名字用逗號
分開。如果數(shù)據(jù)庫在啟動時未找到shared_preload_libraries指定的某個庫文件,數(shù)據(jù)庫將無法啟動。默認值為空串。
10.3.4 垃圾收集
執(zhí)行VACUUM 和ANALYZE命令時,因為它們會消耗大量的CPU與IO資源,而且執(zhí)行一次要花很長時間,這樣會干擾系統(tǒng)執(zhí)行應(yīng)用程序發(fā)
出的SQL命令。為了解決這個 問題,VACUUM 和ANALYZE命令執(zhí)行一段時間后,系統(tǒng)會暫時終止它們的運行,過一段時間后再繼續(xù)執(zhí)行
這兩個命令。這個特性在默認的情況下是關(guān)閉的。將參數(shù) vacuum_cost_delay設(shè)為一個非零的正整數(shù)就可以打開這個特性。
用戶通常只需要設(shè)置參數(shù)vacuum_cost_delay和vacuum_cost_limit,其它的參數(shù)使用默認值即可。VACUUM 和ANALYZE命令在執(zhí)行過程
中,系統(tǒng)會計算它們執(zhí)行消耗的資源,資源的數(shù)量用一個正整數(shù)表示,如果資源的數(shù)量超過 vacuum_cost_limit,則執(zhí)行命令的進程
會進入睡眠狀態(tài),睡眠的時間長度是是vacuum_cost_delay。 vacuum_cost_limit的值越大,VACUUM 和ANALYZE命令在執(zhí)行的過程中
,睡眠的次數(shù)就越少,反之,vacuum_cost_limit的值越小,VACUUM 和ANALYZE命令在執(zhí)行的過程中,睡眠的次數(shù)就越多。
vacuum_cost_delay (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是0。它決定執(zhí)行VACUUM 和ANALYZE命令的進程的睡眠時間。單位是微秒。它的值最好是10
的整數(shù),如果不是10的整數(shù),系統(tǒng)會自動將它設(shè)為比該值大的并且最接近該值的是10 的倍數(shù)的整數(shù)。如果值是0,VACUUM 和ANALYZE
命令在執(zhí)行過程中不會主動進入睡眠狀態(tài),會一直執(zhí)行下去直到結(jié)束。
vacuum_cost_page_hit (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是1。
vacuum_cost_page_miss (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是10。
vacuum_cost_page_dirty (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是20。
vacuum_cost_limit (integer)
這個參數(shù)可以在任何時候被設(shè)置。默認值是200。
10.3.5 后臺寫數(shù)據(jù)庫進程
后臺寫數(shù)據(jù)庫進程負責將數(shù)據(jù)緩沖區(qū)中的被修改的數(shù)據(jù)塊(又叫臟數(shù)據(jù)塊)寫回到數(shù)據(jù)庫物理文件中。
bgwriter_delay (integer)
這個參數(shù)只能在文件postgresql.conf中設(shè)置。它決定后臺寫數(shù)據(jù)庫進程的睡眠時間。后臺寫數(shù)據(jù)庫進程每次完成寫數(shù)據(jù)到物理文件
中的任務(wù)以后, 就會睡眠bgwriter_delay指定的時間。 bgwriter_delay的值應(yīng)該是10的倍數(shù),如果用戶設(shè)定的值不是10的倍數(shù),數(shù)
據(jù)庫會自動將參數(shù)的值設(shè)為比用戶指定的值大的最接近用戶指定的值 的同時是10的倍數(shù)的值。單位是毫秒,默認值是200。
bgwriter_lru_maxpages (integer)
這個參數(shù)只能在文件postgresql.conf中設(shè)置。默認值是100。后臺寫數(shù)據(jù)庫進程每次寫臟數(shù)據(jù)塊時,寫到外部文件中的臟數(shù)據(jù)塊的個
數(shù)不能超過 bgwriter_lru_maxpages指定的值。例如,如果它的值是500,則后臺寫數(shù)據(jù)庫進程每次寫到物理文件的數(shù)據(jù)頁的個數(shù)不
能超過500,若 超過,進程將進入睡眠狀態(tài),等下次醒來再執(zhí)行寫物理文件的任務(wù)。如果它的值被設(shè)為0, 后臺寫數(shù)據(jù)庫進程將不會
寫任何物理文件(但還會執(zhí)行檢查點操作)。
bgwriter_lru_multiplier (floating point)
這個參數(shù)只能在文件postgresql.conf中設(shè)置。默認值是2.0。它決定后臺寫數(shù)據(jù)庫進程每次寫物理文件時,寫到外部文件中的臟數(shù)據(jù)
塊的個數(shù) (不能超過bgwriter_lru_maxpages指定的值)。一般使用默認值即可,不需要修改這個參數(shù)。這個參數(shù)的值越大,后臺寫
數(shù)據(jù)庫進程每次寫 的臟數(shù)據(jù)塊的個數(shù)就越多。
10.4 事務(wù)日志
full_page_writes (boolean)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置。默認值是on。打開這個參數(shù),可以提高數(shù)據(jù)庫的可靠性,減少數(shù)據(jù)丟失的概率,但
是會產(chǎn)生過多的事務(wù)日志,降低數(shù)據(jù)庫的性能。
wal_buffers (integer)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。默認值是8。它指定事務(wù)日志緩沖區(qū)中包含的數(shù)據(jù)塊的個數(shù),每個數(shù)據(jù)塊的大小是8KB,
所以默認的事務(wù)日志緩沖區(qū)的大小是8*8=64KB。事務(wù)日志緩沖區(qū)位于數(shù)據(jù)庫的共享內(nèi)存中。
wal_writer_delay (integer)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置。它決定寫事務(wù)日志進程的睡眠時間。WAL進程每次在完成寫事務(wù)日志的任務(wù)后,就會
睡眠 wal_writer_delay指定的時間,然后醒來,繼續(xù)將新產(chǎn)生的事務(wù)日志從緩沖區(qū)寫到WAL文件中。單位是毫秒(millisecond),
默認 值是200。
commit_delay (integer)
這個參數(shù)可以在任何時候被設(shè)置。它設(shè)定事務(wù)在發(fā)出提交命令以后的睡眠時間,只有在睡眠了commit_delay指定的時間以后,事務(wù)產(chǎn)
生的事務(wù)日志才會 被寫到事務(wù)日志文件中,事務(wù)才能真正地提交。增大這個參數(shù)會增加用戶的等待時間,但是可以讓多個事務(wù)被同
時提交,提高系統(tǒng)的性能。如果數(shù)據(jù)庫中的負載比較 高,而且大部分事務(wù)都是更新類型的事務(wù),可以考慮增大這個參數(shù)的值。下面
的參數(shù)commit_siblings會影響commit_delay是否生效。 默認值是0,單位是微秒(microsecond)。
commit_siblings (integer)
這個參數(shù)可以在任何時候被設(shè)置。這個參數(shù)的值決定參數(shù)commit_delay是否生效。假設(shè)commit_siblings的值是5,如果一個事務(wù)發(fā)出
一個提交請求,此時,如果數(shù)據(jù)庫中正在執(zhí)行的事務(wù)的個數(shù)大于或等于5,那么該事務(wù)將睡眠commit_delay指定的時間。如果數(shù)據(jù)庫
中正在執(zhí)行的事務(wù) 的個數(shù)小于5,這個事務(wù)將直接提交。默認值是5。
10.5 檢查點
checkpoint_segments (integer)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置。默認值是3。它影響系統(tǒng)何時啟動一個檢查點操作。如果上次檢查點操作結(jié)束以后,
系統(tǒng)產(chǎn)生的事 務(wù)日志文件的個數(shù)超過checkpoint_segments的值,系統(tǒng)就會自動啟動一個檢查點操作。增大這個參數(shù)會增加數(shù)據(jù)庫崩
潰以后恢復(fù)操作需要的時 間。
checkpoint_timeout (integer)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置。單位是秒,默認值是300。它影響系統(tǒng)何時啟動一個檢查點操作。如果現(xiàn)在的時間減
去上次檢查 點操作結(jié)束的時間超過了checkpoint_timeout的值,系統(tǒng)就會自動啟動一個檢查點操作。增大這個參數(shù)會增加數(shù)據(jù)庫崩
潰以后恢復(fù)操作需要的時 間。
checkpoint_completion_target (floating point)
這個參數(shù)控制檢查點操作的執(zhí)行時間。合法的取值在0到1之間,默認值是0.5。不要輕易地改變這個參數(shù)的值,使用默認值即可。 這
個參數(shù)只能在postgresql.conf文件中被設(shè)置。
10.6 歸檔模式
archive_mode (boolean)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。默認值是off。它決定數(shù)據(jù)庫是否打開歸檔模式。
archive_dir (string)
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。默認值是空串。它設(shè)定存放歸檔事務(wù)日志文件的目錄。
archive_timeout (integer)
這個參數(shù)只能在postgresql.conf文件中被設(shè)置。默認值是0。單位是秒。如果archive_timeout的值不是0,而且當前時間減去數(shù) 據(jù)
庫上次進行事務(wù)日志文件切換的時間大于archive_timeout的值,數(shù)據(jù)庫將進行一次事務(wù)日志文件切換。一般情況下,數(shù)據(jù)庫只有在
一個事務(wù)日志 文件寫滿以后,才會切換到下一個事務(wù)日志文件,設(shè)定這個參數(shù)可以讓數(shù)據(jù)庫在一個事務(wù)日志文件尚未寫滿的情況下
切換到下一個事務(wù)日志文件。
10.7 優(yōu)化器參數(shù)
10.7.1 存取方法參數(shù)
下列參數(shù)控制查詢優(yōu)化器是否使用特定的存取方法。除非對優(yōu)化器特別了解,一般情況下,使用它們默認值即可。
enable_bitmapscan (boolean)
打開或者關(guān)閉bitmap-scan 。默認值是 on。
enable_hashagg (boolean)
打開或者關(guān)閉hashed aggregation。默認值是 on。
enable_hashjoin (boolean)
打開或者關(guān)閉hash-join。默認值是 on。
enable_indexscan (boolean)
打開或者關(guān)閉index-scan。默認值是 on。
enable_mergejoin (boolean)
打開或者關(guān)閉merge-join。默認值是 on。
enable_nestloop (boolean)
打開或者關(guān)閉nested-loop join。默認值是 on。不可能完全不使用nested-loop join,關(guān)閉這個參數(shù)會讓系統(tǒng)在有其它存取方法可
用的情況下,不使用nested-loop join。
enable_seqscan (boolean)
打開或者關(guān)閉sequential scan。默認值是 on。不可能完全不使用sequential scan,關(guān)閉這個參數(shù)會讓系統(tǒng)在有其它存取方法可用
的情況下,不使用sequential scan。
postgresql支持數(shù)組類型,可以是基本類型,也可以是用戶自定義的類型。日常中使用數(shù)組類型的機會不多,但還是可以了解一下。不像C或JAVA高級語言的數(shù)組下標從0開始,postgresql數(shù)組下標從1開始,既可以指定長度,也可以不指定長度。且postgresql既支持一維數(shù)組,也支持多維數(shù)組,但是平時二維數(shù)組也就夠用了。
示例1.使用ARRAY構(gòu)建數(shù)組類型
---1*4的一維數(shù)組test=#selectarray[1,2,3,4];
array? -----------{1,2,3,4}
(1 row)--2*2的二維數(shù)組test=#selectarray[[1,2],[3,4]];
array? ? ---------------{{1,2},{3,4}}
(1 row)--1*2的二維數(shù)組,基本類型為box矩形類型,且和上面相比box類型元素之間是以分號分隔的,其他所有類型的數(shù)據(jù)都是以逗號分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];
? ? ? ? array? ? ? ? ? ? -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}
(1row)
示例2.創(chuàng)建一張表,字段包含數(shù)組類型
其中int[]表示數(shù)組長度無限制,int[4]表示數(shù)組長度為4.
test=#createtabletbl_array(aint[],bvarchar(32)[][],cint);CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1);INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2);INSERT01test=#select*from tbl_array ;
a? ? |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)
test=#selecta[1],b[2]fromtbl_arraywherec=1;
a | b ---+---1|
(1 row)
test=#selecta[1],b[2][1]fromtbl_arraywherec=1;
a | b ---+---1|4(1 row)
test=#selecta[1],b[2][4]fromtbl_arraywherec=1;
a | b ---+---1|
(1row)
test=#updatetbl_arrayseta[1]=200wherea[1]=1;UPDATE1test=#selecta[1],b[2][4]from tbl_array ;
a? | b -----+---100|200|
(2rows)
也可以使用[下標:上標]方式來查詢數(shù)組連續(xù)的某些元素。
test=#selecta[2:3]from tbl_array ;
a? -------{2}
{2,3}
(2 rows)
test=#selecta[1:3]from tbl_array ;
a? ? -----------{100,2}
{200,2,3}
(2rows)
數(shù)組操作符與函數(shù)
操作符
操作符描述示例結(jié)果
=相等?SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];?t
不等于?select ARRAY[1,2,3] ARRAY[1,2,4];?t
小于?select ARRAY[1,2,3] ARRAY[1,2,4];?t
大于?select ARRAY[1,4,3] ARRAY[1,2,4];?t
=小于或等于?select ARRAY[1,2,3] = ARRAY[1,2,3];?t
=大于或等于?select ARRAY[1,4,3] = ARRAY[1,4,3];?t
@包含?select ARRAY[1,4,3] @ ARRAY[3,1];?t
@包含于?select ARRAY[2,7] @ ARRAY[1,7,4,2,6];?t
重疊(是否有相同元素)?select ARRAY[1,4,3] ARRAY[2,1];?t
||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[4,5,6];?{1,2,3,4,5,6}
||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];?{{1,2,3},{4,5,6},{7,8,9}}
||元素與數(shù)組連接?select 3 || ARRAY[4,5,6];?{3,4,5,6}
||數(shù)組與元素連接?select ARRAY[4,5,6] || 7;?{4,5,6,7}
函數(shù)
函數(shù)返回類型描述示例結(jié)果
array_append(anyarray,anyelement)anyarray?在數(shù)組末尾追加元素?
SELECT array_append(ARRAY[1,2], 3);
{1,2,3}
array_cat(anyarray,anyarray)anyarray?連接兩個數(shù)組?SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);?{1,2,3,4,5}
array_ndims(anyarray)int?返回數(shù)組維數(shù)?SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);?2
array_dims(anyarray)text?返回數(shù)組維數(shù)的文本表示?SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);?[1:2][1:3]
array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和維度初始化一個數(shù)組,其中anyelement是值,第一個int[]是數(shù)組的長度,第二個int[]是數(shù)組下界,下界默認是1?SELECT array_fill(7, ARRAY[3], ARRAY[2]);?[2:4]={7,7,7}
array_length(anyarray,int)int?返回數(shù)組指定維度的長度?SELECT array_length(array[1,2,3], 1);?3
array_lower(anyarray,int)int?返回數(shù)組指定維度的下界?SELECT array_lower('[0:2]={1,2,3}'::int[], 1);?0
array_position(anyarray,anyelement[,int])int?返回數(shù)組元素anyelement從數(shù)組的[,int]位置(默認為1)開始第一次出現(xiàn)在數(shù)組中的位置,數(shù)組必須是一維的?SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');?2
array_positions(anyarray,anyelement)int[]?返回元素在數(shù)組中的所有位置?SELECT array_positions(ARRAY['A','A','B','A'], 'A');?{1,2,4}
array_prepend(anyelement,anyarray)anyarray?在數(shù)組開頭添加新的元素?SELECT array_prepend(1, ARRAY[2,3]);?{1,2,3}
array_remove(anyarray,anyelement)anyarray?從數(shù)組中刪除所有的指定元素,必須是一維數(shù)組?SELECT array_remove(ARRAY[1,2,3,2], 2);?{1,3}
array_replace(anyarray,anyelement,anyelement)anyarray?替換指定數(shù)組元素為新的元素?SELECT array_replace(ARRAY[1,2,5,4], 5, 3);?{1,2,3,4}
array_to_string(anyarray,text[,text])text?將數(shù)組元素使用分隔符連接為文本,NULL可以使用指定元素替換?SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');?1,2,3,*,5
array_upper(anyarray,int)int?數(shù)組指定維度的上屆?SELECT array_upper(ARRAY[1,8,3,7], 1);?4
cardinality(anyarray)int?返回數(shù)組所有維度的長度總和,如果是空數(shù)組則返回0?SELECT cardinality(ARRAY[[1,2],[3,4]]);?4
string_to_array(text,text[,text])text[]?將文本使用分隔符分隔后轉(zhuǎn)換為數(shù)組,如果指定第三個參數(shù),則第三個參數(shù)在數(shù)組中被轉(zhuǎn)換為NULL?SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');?{xx,NULL,zz}
unnest(anyarray)setof anyelement?將數(shù)組元素轉(zhuǎn)換為行?SELECT unnest(ARRAY[1,2]);?
1
2
unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...]?將多維數(shù)組轉(zhuǎn)換為行集合,其中第一個數(shù)組顯示為第一列,第二個數(shù)組顯示為第二列,以此類推。但是這個函數(shù)只在from子句中使用?SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);?
unnest | unnest
--------+----
1 | foo
2 | bar
| baz