共用方式為


使用 DataConnection 時的考量

使用 DataConnection 與商務規則引擎時請考量以下幾點。

使用主索引鍵

有主索引鍵時,兩個資料列的相等性是由資料列是否具有相同的主索引鍵,而非物件的比較而決定。 若資料列判定為相同,則記憶體中僅會保留一個複本,並釋出另一個。 如此可耗用較少的記憶體。

第一次在規則引擎中判斷提示 DataConnection 時,引擎一律會嘗試從其架構找出其主鍵資訊。 若是有主索引鍵,即會擷取主索引鍵資訊,然後用於所有後續的評估。

注意

若是需要變更資料庫,則主索引鍵為必要項目。

若是情況許可,儘可能為 DataConnection 提供執行中交易

如果沒有交易, DataConnection 上的每個查詢和更新都會起始自己的本機交易,而不同的查詢可能會在規則評估的不同部分傳回不同的結果。 若是基礎資料庫資料表中有所變更,使用者可能會發現處理不一致的情形。

雖然當資料表未隨著時間變更時,您可以使用 DataConnection 而不提供交易,但即使 DataConnection 僅用於讀取作業,還是建議使用交易。

不過,更新資料時應該永遠會使用交易。

查詢數目可能呈線性增加

由於 對 DataConnection 的查詢是由其他聯結物件參數化,因此針對 DataConnection 執行的查詢數目會直接對應至到達 DataConnection的聯結物件數目。 因此,如果連線到 DataConnection 物件的聯結物件數目會以線性方式成長, 則對 DataConnection 的查詢數目也會以線性方式成長。 目前並沒有減少查詢數的最佳化方法。

此範例為規則:

IF A.x = 7 AND DC.y = A.y  
THEN  

代表 ObjectBinding、DC 代表 DataConnection,而 x 和 y 代表 A 和 DC 的屬性。

對於通過測試 (x = 7) 的每個 A 實例,都會使用 DataConnection產生查詢。 若是有許多相符的執行個體,會產生相同的查詢數。

小心使用 OR 條件

如果規則只使用結合 (AND) 條件,則會儘早執行測試和查詢,因此傳遞的物件實例將會減少。 因此,後續 DataConnection 的查詢數目會按比例減少。 如果在規則中同時使用分離 (OR) 條件和 DataConnection ,則會將所有條件評估推送至最終查詢。 如果在規則中使用多個 DataConnection ,最後一個查詢以外的所有查詢都會有效地成為 Select-ALL 查詢語句。

一般而言,最好是將具有 OR 條件的規則分割為兩個或多個不連續規則,因為與多個不可部分完成的規則定義相較,使用 OR 條件的話將會降低效能。 無論是否使用 DataConnections 都會發生這種情形。

您也可以考慮使用只包含結合條件的個別規則,而不是具有 OR 條件的一個規則。 使用 OR 條件時,查詢數目會以所有聯結物件的實例乘法速度成長。 下列範例會顯示這一點。

IF (A.x ==7 OR A.x == 8) AND DC.y == A.y  
THEN DC.z = 10  

在此範例中,A 代表 ObjectBinding;DC 代表 DataConnection,而 x、y 和 z 代表 A 和 DC 的屬性。 如果 A 有 100 個實例,而 x 在第一個物件中為 1,第二個物件中為 2,在第 100 個物件中為 100,則 100 個查詢必須針對 DataConnection執行。

最好是重寫前述規則,將它分割為兩個規則。

規則 1

IF A.x =7 AND DC.y = A.y  
THEN DC.z = 10  

規則 2

IF A.x = 8 AND DC.y = A.y  
THEN DC.z = 10  

SQL 不支援某些述詞和函式

某些規則引擎支援的述詞和函式,SQL 是不支援的。 若在規則條件中使用這些不支援的述詞和函式,就無法併入查詢中。 下列詞彙無法最佳化為 SQL 查詢:

  • 某些引擎內建函式在 SQL 查詢中沒有相等函式。 這些是 PowerFindFirstFindAll。 使用 DataConnection 資料行作為其一或多個引數無法優化為查詢的一部分;例如,Power ( 2、dc.Column1) 。

  • 使用 DataConnection 資料行做為其正則運算式引數的內建述詞比對, (第一個引數) 。 例如,Match("abc*", dc1.Column2) 是有效的,但是 Match(dc1.Column1, dc1.Column2) 則是無法轉譯的。

  • 使用具有 DataConnection 資料行做為其其中一個參數的使用者函式。 例如,c1.M(dc.Column1) 無法最佳化,因為無法在資料庫伺服器上執行使用者函式,必須由商務規則引擎來執行。

  • 代表 DataConnection上設定作業的使用者函式;例如,dc.Column1 (5) 。

  • 使用 ObjectReferenceDataConnection 的函式;例如,ObjecRef (dc) 。

  • 若是一或多個函式引數是無法轉譯的,函式呼叫也會變成無法轉譯;例如,Add(c1.M(dc.Column1), 5)。

另請參閱

商務規則引擎中的資料存取