2010-02-18 60 views
0

Oracle 10g。用NLS_COMP修剪Oracle分區=語言

我們有一個由varchar2列分區的大表(如果它是由我決定的,它不會是這個列,但它是),每個分區都有一個值。防爆。 PARTITION「PARTION1」VALUE('C')。

我們也有NLS_COMP = LINGUISTIC。

分區修剪在指示該列中的值時不起作用。

SELECT * from table1 where column_partitioned_by = 'C' 

這對所有分區進行全表掃描,而不僅僅是相關的分區。

根據文檔here,「NLS_COMP參數不影響分區表的比較行爲。」

如果我發出:

ALTER SESSION SET NLS_COMP = BINARY 

然後:

SELECT * from table1 where column_partitioned_by = 'C' 

它不正確修剪分區下來。 (我正在修剪/不修剪生成的計劃)

有什麼,缺少硬編碼分區名稱到from子句,這將在這裏工作?

此外,更改分區定義也是如此。我在我的團隊中屬於少數派,因爲他甚至認爲這是一個問題。在我到達那裏之前,先前的團隊決定通過在FROM子句中添加硬編碼分區名稱的字符串查找和替換來發送所有應用程序SQL查詢來「解決」此問題,並且有人手動更新存儲的特效中的分區名稱根據需要...但它有一天會突破,而且會突破。我試圖找到最少侵入性的方法,但恐怕可能沒有。

最好,這將是一個解決方案,只改變查詢本身而不是基礎數據庫結構。就像我說的,這種解決方案可能根本不存在......

回答

1

一些解決方案,以原型:

CAST功能。您可以通過表達式進行分區;缺點是您的應用程序必須提供類似的表達式。

分區NLS_SORT(column_partitioned_by, 'NLSSORT=BINARY')。同樣,需要更改應用程序。

column_partitioned_by轉換爲數值,可能使用代碼表在兩者之間進行轉換。不過,您必須在整個應用程序中爲該表添加一個連接。

+0

我希望我能做任何事情,但看到我上面的編輯。我會在修改之前爲您提供技術上正確的投票和我的問題範圍。 – rfusca 2010-02-18 20:05:59