PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SET
2019-09-08 23:33:38
供稿:網友
SET
名稱
SET ― 為會話設置運行時參數
語法
SET variable { TO | = } { value | 'value' | DEFAULT }
SET CONSTRAINTS {ALL | constraintlist} mode
SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
輸入
variable
可設置的全局變量.
value
參數的新值.DEFAULT 可以用于聲明把參數恢復為缺省值.允許使用字串數組,但是更復雜的結構需要用單引號或者雙引號引起來.
可能的變量和許可的值是.
CLIENT_ENCODING | NAMES
設置多字節客戶端編碼。參數是:
value
把客戶端多字節編碼設為 value。聲明的編碼方式必須為后端支持?!?
這個特性只有在對制作 Postgres 的配置階段聲明了 MULTIBYTE 支持后才生效。
DATESTYLE
設置日期/時間表示風格。影響輸出格式,并且在某些時候會影響輸入的解釋?!?
ISO
使用 ISO 8601-風格的日期和時間
SQL
使用 Oracle/Ingres-風格的日期和時間
Postgres
使用傳統 Postgres 格式
European
使用 dd/mm/yyyy 作為數字日期表達式.
NonEuropean
使用 mm/dd/yyyy 作為數字日期表達式.
German
使用 dd.mm.yyyy 作為數字日期表達式.
US
與 'NonEuropean'一樣
DEFAULT
恢復缺省值 (ISO)
日期格式初始化可以用下面方法初始化:
設置 PGDATESTYLE 環境變量.如果一個基于 libpq 的客戶端的環境里設置了 PGDATESTYLE,libpq 將在聯接啟動時自動把 DATESTYLE 設置成為 PGDATESTYLE 的值?!?
用 -o -e 參數運行 postmaster 可以把日期設置成 European 習慣.要注意的是這個只是對一些日期風格的組合有影響;例如 ISO 風格不被這個參數影響.
改變 src/backend/utils/init/globals.c里的變量.
在 globals.c 里可以更改的變量是:
bool EuroDates = false | true
int DateStyle = USE_ISO_DATES | USE_POSTGRES_DATES | USE_SQL_DATES | USE_GERMAN_DATES
SEED
為隨機數生成器設置內部種子.
value
種子的值被隨機范圍函數使用.典型的值是介于0 和 1之間的浮點數,這個數隨后乘以 RAND_MAX.如果使用了超出范圍的數值,生成的積隱含地溢出.
種子還可以通過調用 setseed SQL 函數設置:
SELECT setseed(value);
這個特性只有在對制作 Postgres 的配置階段聲明了 MULTIBYTE 支持后才生效。
SERVER_ENCODING
設置多字節服務器端編碼方式為:
value
這個值標識服務器編碼.
這個特性只有在對制作 Postgres 的配置階段聲明了 MULTIBYTE 支持后才生效?!?
CONSTRAINTS
SET CONSTRAINTS 影響當前事務約束計算的表現.SET CONSTRAINTS,在 SQL3 里面規范,有如下允許的參數:
constraintlist
逗號分隔的可推遲的約束名列表.
mode
約束模式.允許值是 DEFERRED 和 IMMEDIATE.
在 IMMEDIATE 模式,外鍵約束在每個查詢結束時檢查.
在 DEFERRED 模式,標記為 DEFERRABLE 的外鍵約束只是在事務提交時或者約束的模式被顯式地設為 IMMEDIATE 時才檢查.實際上,這些只對外鍵約束起作用,因此它不應用于 UNIQUE 或者其他約束.
TIME ZONE, TIMEZONE
時區的可能值與你的操作系統有關.例如 Linux 的/usr/lib/zoneinfo 里面包含時區的數據庫.
下面是時區的一些有效值.
PST8PDT
將時區設為 California?。又荩?
Portugal
將時區設為 Portugal?。ㄆ咸蜒溃?
'Europe/Rome'
將時區設為 Italy?。ㄒ獯罄?
DEFAULT
將時區設為你的本地時區(TZ 環境變量的值).
如果聲明了一個無效時區,時區就會變成 GMT(在大多數系統上).
第二種語法在上面顯示,它允許用戶用一個類似于 SQL92 SET TIME ZONE 的語法設置時區.LOCAL 關鍵字只是用于 SQL92 兼容的 DEFAULT 可選的關鍵字.
如果一個基于 libpq 的客戶端的環境里設置了 PGTZ,libpq 將在聯接啟動時自動把 TIMEZONE 設置成為 PGTZ 的值?!?
TRANSACTION ISOLATION LEVEL
給當前事務設置隔離級別。
READ COMMITTED
當前事務查詢將只讀取在查詢之前提交的數據。READ COMMITTED 是缺省值。
注意:SQL92 標準要求 SERIALIZABLE 為缺省的隔離級別。
SERIALIZABLE
當前的事務查詢只能讀取在該事務里第一個 DML 語句(SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO)執行前的數據?!?
還有幾個可以 SET 命令聲明的用內部的或優化的參數:
PG_OPTIONS
設置各種后端參數.
RANDOM_PAGE_COST
設置優化器對非連續磁盤頁面讀取的開銷的預計值。這是以連續頁面讀取的開銷的倍數計算的。
float8
設置隨機頁面訪問的開銷為聲明的浮點值。
CPU_TUPLE_COST
設置優化器處理查詢里每條記錄的開銷的預計值。這是以連續頁面讀取的開銷的分數進行計算的?!?
float8
把每條記錄的 CPU 處理的開銷設置聲明的浮點值。
CPU_INDEX_TUPLE_COST
設置優化器進行索引掃描時處理每條索引記錄的開銷的預計值。這是以連續頁面讀取的開銷的分數進行計算的?!?
float8
把每條索引記錄的 CPU 處理的開銷設置聲明的浮點值?!?
CPU_OPERATOR_COST
設置優化器處理 WHERE 子句里每個操作符的開銷的預計值。這是以連續頁面讀取的開銷的分數進行計算的。
float8
把每個操作符的 CPU 處理的開銷設置聲明的浮點值。
EFFECTIVE_CACHE_SIZE
設置優化器對磁盤緩沖有效尺寸的假設(也就是說,將被 Postgres 數據文件使用的內核的磁盤緩沖的部分)。這是以磁盤頁面計量的,通常每塊 8Kb?!?
float8
把每個操作符的 CPU 處理的開銷設置聲明的浮點值?!?
ENABLE_SEQSCAN
允許或者禁止規劃器對順序掃描規劃類型的使用。(完全禁止順序掃描是不可能的,但是把這個變量置為 OFF 將導致規劃器在存在其他可用方法的情況下不采用順序掃描。)
ON
允許使用順序掃描(缺省設置)?!?
OFF
禁止使用順序掃描。
ENABLE_INDEXSCAN
允許或者禁止規劃器對索引掃描規劃類型的使用。
ON
允許使用索引掃描(缺省設置)。
OFF
禁止使用索引掃描?!?
ENABLE_TIDSCAN
允許或者禁止規劃器對 TID 掃描規劃類型的使用。
ON
允許使用 TID 掃描(缺省設置)?!?
OFF
禁止使用 TID 掃描。
ENABLE_SORT
允許或者禁止規劃器對顯式排序步驟的使用。(完全禁止顯式排序步驟是不可能的,但是把這個變量置為 OFF 將導致規劃器在存在其他可用方法的情況下不采用顯式排序步驟。)
ON
允許使用排序(缺省設置)?!?
OFF
禁止使用排序。
ENABLE_NESTLOOP
允許或者禁止規劃器對嵌套循環聯合規劃的使用。(完全禁止嵌套循環聯合是不可能的,但是把這個變量置為 OFF 將導致規劃器在存在其他可用方法的情況下不采用嵌套循環規劃。)
ON
允許使用嵌套循環聯合(缺省設置)?!?
OFF
禁止使用嵌套循環聯合?!?
ENABLE_MERGEJOIN
打開或者關閉規劃器對融合(merge join)聯合規劃的使用?!?
ON
允許使用融合(merge join)聯合(缺省設置)?!?
OFF
禁止使用融合(merge join)聯合?!?
ENABLE_HASHJOIN
打開或者關閉規劃器對哈希(散列)規劃的使用?!?
ON
允許使用哈希(散列)聯合(缺省設置)?!?
OFF
禁止使用哈希(散列)聯合?!?
GEQO
為使用基因優化器算法設置閾值.
ON
允許基因優化器算法優化帶有11個或11個以上表的語句.(這也是缺省設置)
ON=#
帶一個整數參數,允許優化器優化帶有 # 或更多的表的查詢.
OFF
禁用基因優化器.
請參考程序員手冊中關于 GEQO 的章節獲取關于查詢優化的更多信息。
如果一個基于 libpq 的客戶端的環境里設置了 PGGEQO 環境變量,libpq 將在聯接啟動時自動把 GEQO 設置成為 PGGEQO 的值?!?
KSQO
Key Set Query Optimizer?。ㄦI集查詢優化)導致查詢規劃器把 WHERE 子句帶有許多 OR 了的 AND 子句的查詢(象 "WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...")轉換成一個UNION 查詢。這個方法可以比缺省的實現更快,但是它不一定得出相同的結果,因為 UNION 隱含的加了一條 SELECT DISTINCT 子句以消除相同的行。KSQO 常用于和 MicroSoft Access 這樣的東西并用,它容易生成這種類型的查詢?!?
ON
打開優化?!?
OFF
關閉優化(缺省設置)。
DEFAULT
等效于聲明 SET KSQO='OFF'?!?
KSQO 算法對帶有許多 OR 了的 AND 子句的查詢是非常必要的,不過在 Postgres 7.0 和以后的版本里,標準的規劃器可以很好的操作這些查詢?!?
MAX_EXPR_DEPTH
設置分析器可接受的最大表達式嵌套深度.缺省值對任何常見查詢都足夠高了,但是你可以根據需要提高它.(不過如果你升得太高,你就會冒因為堆棧溢出而導致后端崩潰的危險.)
integer
最大深度.
輸出
SET VARIABLE
成功的返回信息.
WARN: Bad value for variable (value)
如果命令設置變量失?。祷卮诵畔ⅲ?
描述
SET 將在一個會話過程中為變量修改配置參數.
當前值可以使用 SHOW 獲得,而且可以使用 RESET 命令將各個值設回缺省.參數和值都是大小寫無關的.注意參數值總是用字符串來表達,所以用單引號括起來.
SET TIME ZONE 改變會話的缺省時區偏移量.一個 SQL-會話總是以缺省的時區偏移作為初始值. SET TIME ZONE 語句用于改變當前的 SQL 會話的缺省時區偏移量.
注意
SET variable 語句是 Postgres 語言的擴展.
請參考 SHOW 和 RESET 命令顯示或重置當前值.
用法
設置時區風格為 ISO(參數不需要引號):
SET DATESTYLE TO ISO;
對4個或更多表的查詢,使 GEQO 生效(請注意這里用單引號操作參數值里面的等號):
SET GEQO = 'ON=4';
設置 GEQO 為缺省值:
SET GEQO = DEFAULT;
把時區設置為 Berkeley, California,使用雙引好保存時區聲明里大寫字符的屬性:
SET TIME ZONE "PST8PDT";
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 07:41:21-08
設置時區為 Italy(注意這里要求的單或者雙引號來操作特殊的字符):
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
today
------------------------
1998-03-31 17:41:31+02
兼容性
SQL92
在 SQL92 里沒有 SET variable 語句(除了 SET TRANSACTION ISOLATION LEVEL)。SQL92 用于 SET TIME ZONE 的語法有一點點不同,只允許為時區聲明一個整數值:
SET TIME ZONE { interval_value_expression | LOCAL }