(使用Oracle)鍵/值表
NULL-鍵我有一個鍵/值對的表是這樣的:
create table MESSAGE_INDEX
(
KEY VARCHAR2(256) not null,
VALUE VARCHAR2(4000) not null,
MESSAGE_ID NUMBER not null
)
我現在想去的地方鍵查找所有的消息=' someKey「,值爲'val1','val2'或'val3' - 或值爲空,在這種情況下表中根本沒有條目。這是爲了節省空間;如果我將它們全部存儲,將會有大量具有空值的鍵。
我想這樣的作品:
SELECT message_id
FROM message_index idx
WHERE ((key = 'someKey' AND value IN ('val1', 'val2', 'val3'))
OR NOT EXISTS (SELECT 1 FROM message_index WHERE key = 'someKey'
AND idx.message_id = message_id))
不過是極其緩慢。在message_index中記錄700K記錄需要8秒鐘,並且在我的測試環境外移動時會有更多記錄和更多搜索條件。
主鍵是關鍵,價值,MESSAGE_ID:
add constraint PK_KEY_VALUE primary key (KEY, VALUE, MESSAGE_ID)
我又增加了指數MESSAGE_ID,加快尋找丟失的鑰匙:
create index IDX_MESSAGE_ID on MESSAGE_INDEX (MESSAGE_ID)
我會做一些這些每個搜索中的鍵/值查找,而不僅僅是上面顯示的一個。到目前爲止,我在嵌套它們,其中一個級別的輸出ID是下一個輸入的輸入。例如:
SELECT message_id from message_index
WHERE (key/value compare)
AND message_id IN
(
SELECT ... and so on
)
我能做些什麼來加快速度?
你是什麼意思的「值是null在這種情況下根本不會在表中進入」?當VALUE爲空時沒有行?如果是這樣,那麼你的查詢似乎不起作用 – MartW 2010-05-25 14:12:08
爲什麼你的'PRIMARY KEY'包含'value'?消息對於一個密鑰有兩個不同的值是否是有效的情況? – Quassnoi 2010-05-25 14:13:02
值在索引中以快速查找某個鍵的特定值。我的理解是,如果沒有包含在索引中,則需要掃描給定鍵的所有值。這是錯的嗎? – Rabbit 2010-05-25 14:37:55