| PostgreSQL | ||
|---|---|---|
| 上一頁 | 下一頁 | |
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 ] )
CREATE OPERATOR 定義一個新的運算符號, name 。定義該運算符號的用戶成為其所有者。
運算符號 name 是下列字符的小於32個字符的任意組合:
+ - * / < > = ~ ! @ # % ^ & | ` ? $ :
注意: 在運算符號名裡不允許有字符存在。這就允許Postgres 將 SQL 輸入分析成一個一個的令牌(token)而不需要在令牌之間插入空白。
運算符號 "!=" 在輸入時映射成 "<>" , 因而他們是相等的。
至少需要定義一個 LEFTARG 或 RIGHTARG 。對於雙目運算符號來說,兩者都需要定義。對右目運算符號來說,只需要定義 LEFTARG,而對於左目運算符號來說,只需要定義 RIGHTARG。
同樣, func_name 程序必須已經用 CREATE FUNCTION 定義過,而且必須定義為接受正確數量的參數(一個或是兩個)。
換向運算符號用於令 Postgres 可以按它的意願轉換運算符號的方向。例如,運算符號面積小於,<<<,就有一個轉換運算符號:面積大於運算符號, >>>。因此,查詢最佳化器可以自由的將下面查詢從:
"0,0,1,1"::box >>> MYBOXES.description
轉換到
MYBOXES.description <<< "0,0,1,1"::box
這就允許執行程式碼總是使用後面的形式而某種程度上簡化了查詢最佳化器。
類似地,如果存在負號運算符號則應該聲明。假設一個運算符號,面積相等, ===,存在,同樣有一個面積不等運算符號,!==。負號運算符號允許查詢最佳化器將
NOT MYBOXES.description === "0,0,1,1"::box
簡化成
MYBOXES.description !== "0,0,1,1"::box
如果提供了一個轉換器運算符號名稱,Postgres 將在目錄中查找它。如果找到,而且其本身沒有一個轉換器,那麼轉換器表將被更新,以當前(最新)運算符號作為它的轉換器。這一點一樣適用於負號運算符號。
這就允許定義兩個互為轉換器或負號符的運算符號。第一個運算符號應該定義為沒有轉換器或負號符(as appropriate)。當定義第二個運算符號時,將第一個符號作為轉換器或負號符。第一個將因上述的副作用一樣被更新(而獲得轉換器或負號符)。(對於 Postgres 6.5,把兩個運算符號指向對方同樣也行。)
另外三個聲明將為查詢最佳化器進行聯合查詢時提供支援。Postgres 總是用迭代 [WONG76](譯注:好像作者編輯器出事了。)評估一個聯合查詢。(比如,處理一個用返回布爾值的運算符號分隔開的有兩個字段的語句)另外, Postgres 準備在行[SHAP86](?)實現一個哈希-聯合算法(hash-join algorithm)﹔但是,我們必須知道這個策略是否可行。目前的哈希-聯合算法只是對代表相等測試的運算符號有效﹔而且,數據型態的相等必須意味著型態的表現是按位相等的。(例如,一個包含未用的位的數據型態,這些位對相等測試沒有影響,但卻不能用於哈希聯合。)HASHES 標記告訴最佳化器,對這個運算符號可以安全地使用哈希聯合。
類似的,兩目排序運算符號告訴查詢最佳化器一個混合-排序(merge-sort)是否是一個可用的聯合策略,並且告訴最佳化器使用哪個運算符號來對這兩個操作數表排序。排序運算符號應該只提供給相等運算符號,並且它們應該對應用於對應的左邊和右邊數據型態的小於運算符號。
如果發現其他聯合策笨莃用, Postgres 將更改最佳化器和運行時系統以利用這些策略,並且在定義一個運算符號時將需要更多的聲明。幸運的是,研究團隊不經常發明新的聯合策略,而且增加用戶定義聯合策略的方法看來與其實現的複雜性相比是不值得的。
最後兩個聲明可提供給最佳化器用於估計結果的尺寸大小。如果像下面的語句:
MYBOXES.description <<< "0,0,1,1"::box
在判斷條件刈艴現,那麼 Postgres 將不得不估計記錄 MYBOXES 中的部分區域的大小。函數 res_proc 必需是一個註冊過的函數(也就是說它已經用 CREATE FUNCTION 定義過了),它接受一個正確數據的數據型態作為參數,返回一個浮點數。查詢最佳化器只是簡單的調用這個函數,將參數 "0,0,1,1" 傳入並且計算相關尺寸的結果以獲得所需要的記錄的數值。
類似的,當運算符號的操作數都包含記錄變數時,最佳化器必須估計聯合結果的尺寸。函數 join_proc 將返回另一個浮點數,這個數就是將兩個表相關的記錄相乘,計算出預期結果的尺寸。
函數
my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)
和運算符號
MYBOXES.description === "0,0,1,1"::box
之間的區別是 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 = <<< );
CREATE OPERATOR 是 Postgres 擴展。在 SQL92 中沒有 CREATE OPERATOR 語句。
| 上一頁 | 首頁 | 下一頁 |
| CREATE LANGUAGE | 開頭 | CREATE RULE |