[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > 其它 > 正文
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-CREATE OPERATOR
編譯:何偉平 laser@zhengmai.com.cn (2001-04-21 21:49:38)

CREATE OPERATOR
名稱
CREATE OPERATOR  定義一個新的用戶操作符 

語法
CREATE OPERATOR name ( PROCEDURE = func_name
     [, LEFTARG = type1 ] [, RIGHTARG = type2 ]
     [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
     [, RESTRICT = res_proc ] [, JOIN = join_proc ]
     [, HASHES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] )
輸入
name 
定義的操作符名.可用的字符見下文。 
func_name 
用實現該操作符的函數。 
type1 
如果存在的話,操作符左手邊的參數類型.如果是右目操作符,這個參數可以省略。 
  
type2 
如果存在的話,操作符右手邊的參數類型.如果是左目操作符,這個參數可以省略。 
  
com_op 
對應的換向(commutative)操作符。 
neg_op 
對應的負操作符。 
res_proc 
此操作符約束選擇性評估函數。 
join_proc 
此操作符的聯合選擇性評估函數。 
HASHES 
表明此操作符支持哈希(散列)聯合算法。 
left_sort_op 
如果此操作符支持融合聯合(join),此操作符的左邊數據的排序操作符。 
right_sort_op 
如果此操作符支持融合聯合(join),此操作符的右邊數據的排序操作符。 
輸出
CREATE 
成功創建操作符的返回信息. 

描述
CREATE OPERATOR 定義一個新的操作符, name .定義該操作符的用戶成為其所有者. 
操作符 name 是一個最多 NAMEDATALEN-1 長的(缺省委 31 個)下列字符組成的字串. 

+ - * / < > = ~ ! @ # % ^ & | ` ? $ : 

你選擇名字的時候有幾個限制: 

"$" 和 ":" 不能定義為單字符操作符,盡管它們可以是一個多字符操作符的名稱的一部分. 
"--" 和 "/*" 不能在操作符名字的任何地方出現,因為它們會被認為是一個注釋的開始. 

一個多字符的操作符名字不能以 "+" 或 "-" 結尾,除非該名字還包含至少下面字符之一: 

~ ! @ # % ^ & | ` ? $ : 

例如,@- 是一個允許的操作符名,但 *- 不是.這個限制允許 Postgres 分析 SQL-有問題的查詢而不要求在符號之間有空白.

請注意:當使用非 SQL-標準操作符名時,你通常將需要用空白把聯接的操作符分離開以避免含混.例如,如果你定義了一個左目操作符,名為 "@",你不能寫 X*@Y;你必須些成 X* @Y 以保証 Postgres 把它讀做兩個操作符而不是一個.
操作符 "!=" 在輸入時映射成 "<>" , 因為這兩個名稱總是相等的. 
至少需要定義一個 LEFTARG 或 RIGHTARG .對雙目操作符來說,兩者都需要定義.對右目操作符來說,只需要定義 LEFTARG,而對左目操作符來說,只需要定義 RIGHTARG. 

同樣, func_name 過程必須已經用 CREATE FUNCTION 定義過,而且必須定義為接受正確數量的參數(一個或是兩個). 

換向操作符用令 Postgres 可以按它的意願轉換操作符的方向.例如,操作符面積小,<<<,就有一個轉換操作符:面積大操作符, >>>.因此,查詢優化器可以自由的將下面查詢從: 

box '((0,0),(1,1))'  >>> MYBOXES.description
轉換到 
MYBOXES.description <<< box '((0,0),(1,1))'
這就允許執行代碼總是使用面的形式而某種程度上簡化了查詢優化器. 
類似地,如果存在負號操作符則應該聲明。假設一個操作符,面積相等, ===,存在,同樣有一個面積不等操作符,!==.負號操作符允許查詢優化器將 

NOT MYBOXES.description === box '((0,0),(1,1))'
簡化成 
MYBOXES.description !== box '((0,0),(1,1))'
如果提供了一個轉換器操作符名稱,Postgres 將在目錄中查找它.如果找到,而且其本身沒有一個轉換器,那轉換器表將被更新,以當前(最新)操作符作為它的轉換器.這一點一樣適用負號操作符.這就允許定義兩個互為轉換器或負號符的操作符.第一個操作符應該定義為沒有轉換器或負號符(as appropriate).當定義第二個操作符時,將第一個符號作為轉換器或負號符.第一個將因上述的副作用一樣被更新(而獲得轉換器或負號符).(對 Postgres 6.5,把兩個操作符指向對方同樣也行。) 
HASHES,SORT1 和 SORT2 選項將為查詢優化器進行聯合查詢時提供支持.Postgres 能夠總是用語義替換  [WONG76] 來計算一個聯合(也就是說,處理這樣的子句,該子句有兩個記錄變量,這兩個變量被一個操作符分開,最這個子句返回一個布爾量).另外, Postgres 準備在行[SHAP86](?)實現一個哈希-聯合算法(hash-join algorithm);但是,我們必須知道這個策略是否可行.目前的哈希-聯合算法只是對代表相等測試的操作符有效;而且,數據類型的相等必須意味著類型的表現是按位相等的。(例如,一個包含未用的位的數據類型,這些位對相等測試沒有影響,但卻不能用哈希聯合。)HASHES 標記告訴優化器,對這個操作符可以安全地使用哈希聯合。 

類似的,兩目排序操作符告訴查詢優化器一個融合-排序(merge-sort)是否是一個可用的聯合策略,並且告訴優化器使用哪個操作符來對這兩個操作數表排序.排序操作符應該只提供給相等操作符,並且它們應該對應用對應的左邊和右邊數據類型的小操作符。 

如果發現其他聯合策略可用, Postgres 將更改優化器和運行時系統以利用這些策略,並且在定義一個操作符時將需要更多的聲明.幸運的是,研究團隊不經常發明新的聯合策略,而且增加用戶定義聯合策略的方法看來與其實現的復雜性相比是不值得的。 

RESTRICT 和 JOIN 選項幫助優化器計算結果的尺寸大小.如果像下面的語句: 

MYBOXES.description <<< box '((0,0),(1,1))'
在判斷條件中出現,那 Postgres 將不得不估計 MYBOXES 中滿足該子句的記錄數量的范圍的大小.函數 res_proc 必需是一個注冊過的函數(也就是說它已經用 CREATE FUNCTION 定義過了),它接受一個正確數據的數據類型作為參數,返回一個浮點數.查詢優化器只是簡單的調用這個函數,將參數 ((0,0),(1,1))  傳入並且把結果乘以關系(表)尺寸以獲得所需要的記錄的數值。 
類似的,當操作符的操作數都包含記錄變量時,優化器必須計算聯合結果的尺寸.函數 join_proc 將返回另一個浮點數,這個數就是將兩個表相關的記錄相乘,計算出預期結果的尺寸. 

函數 

my_procedure_1 (MYBOXES.description, box '((0,0),(1,1))')
和操作符 
MYBOXES.description === box '((0,0),(1,1))'
之間的區別是 Postgres 試圖優化操作符並且可以決定使用索引來縮小相關操作符的搜索區間.但是,對函數將不會有任何優化的動作,而且是強制執行.最,函數可有任意個參數,而操作符限一個或兩個. 
注意
請參閱PostgreSQL 用戶手冊 中操作符章節獲取更多信息.請使用 DROP OPERATOR 從數據庫中刪除用戶定義操作符.
用法
下面命令定義一個新操作符,面積相等,用 BOX 數據類型. 
CREATE OPERATOR === (
   LEFTARG = box,
   RIGHTARG = box,
   PROCEDURE = area_equal_procedure,
   COMMUTATOR = ===,
   NEGATOR = !==,
   RESTRICT = area_restriction_procedure,
   JOIN = area_join_procedure,
   HASHES,
   SORT1 = <<<,
   SORT2 = <<<
);
兼容性
SQL92
CREATE OPERATOR 是 Postgres 擴展.在 SQL92 中沒有 CREATE OPERATOR 語句.
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-VACUUM (2001-04-21 22:16:33)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-UPDATE (2001-04-21 22:16:12)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-UNLISTEN (2001-04-21 22:15:44)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-TRUNCATE (2001-04-21 22:15:24)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SHOW (2001-04-21 22:15:01)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SET (2001-04-21 22:14:42)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SELECT INTO (2001-04-21 22:14:19)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-SELECT (2001-04-21 22:14:01)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-ROLLBACK (2001-04-21 22:13:41)
PostgreSQL7.0手冊-用戶手冊-19. SQL命令-REVOKE (2001-04-21 22:13:18)

===更多相關===
 

★  樊強制作 歡迎分享  ★