在SQL最好的選擇是UNION
,雖然你可以通過取出distinct
關鍵字來節省一些性能:
select FIELD1 FROM TABLE
UNION
select FIELD2 FROM TABLE
UNION
提供了從兩個表中的一套獨特的,所以在這種情況下,明顯是多餘的。根本沒有辦法以不同的方式編寫這個查詢,以使其執行速度更快。沒有什麼神奇的公式可以更快地搜索200,000多行。它需要搜索表格的每一行兩次,並按照唯一性排序,這正是UNION
所要做的。
使其更快的唯一方法是在兩個字段(可能)上創建單獨的索引,或者減少要搜索的數據集。
或者,如果您要做的很多,並且很少添加新字段,則可以使用實例化視圖來存儲結果並僅定期刷新它。
順便說一句,您的第二個查詢似乎沒有做你想做的。 Distinct
總是適用於select
部分中的所有列,因此具有字段名稱的常量將導致查詢始終爲兩列返回單獨的行。
我想出了另一種方法,在實驗上,似乎有點快。在情況中,這允許我們交易一個全表掃描以進行笛卡爾連接。在大多數情況下,我仍然會選擇使用union
,因爲它更清楚查詢的內容。
SELECT DISTINCT CASE lvl WHEN 1 THEN field1 ELSE field2 END
FROM table
CROSS JOIN (SELECT LEVEL lvl
FROM DUAL
CONNECT BY LEVEL <= 2);
這也是值得補充的是我測試這兩個查詢表上不含有800,000行有用的索引,並花了大約45秒(返回145000行)。但是,大部分時間都花費在實際獲取記錄上,而不是運行查詢(查詢耗時3-7秒)。如果您獲得了相當數量的行,那可能只是導致您看到的性能問題的行數。
所以您要選擇查詢的輸出串聯到一個單一的記錄,不是嗎?像這樣? http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:229614022562 – Aitor
「太慢」的速度有多慢?我們在談論多少條記錄?總記錄數有多少個不同的值? – APC
@APC選項2約80秒,它通過108443條記錄 – Rodriguez