這是一個基於this question about query optimization的後續。SQLite觸發器優化
爲了快速做出選擇,如上所示,我嘗試在插入時使用觸發器預先計算一些數據。
基本上,我想保持給定列值的出現次數到給定的表中。
以下模式用於存儲的出現對於每個值:
CREATE TABLE valuecount (value text, count int)
CREATE INDEX countidx ON t (count DESC)
CREATE UNIQUE INDEX valueidx ON valuecount (value);
這裏是我一直在測試觸發器:
CREATE TRIGGER counttrigger INSERT ON collection
FOR EACH ROW
BEGIN
INSERT OR REPLACE INTO valuecount VALUES
(NEW.value, coalesce((SELECT count + 1 FROM count WHERE valuecount.query LIKE
NEW.value), 1));
END;
在一個典型的插入collection
表包含幾十萬行,在單個INSERT INTO ... SELECT ...
聲明(我正在將數據從一個數據庫合併到另一個)。
的問題是,這個觸發器,插入300K行需要4個小時,而不是300毫秒......
有沒有辦法實現這個不犧牲性能?
預先感謝您的幫助,
你可能會想嘗試,你新加入的更新,然後是INSERT SELECT FROM NEW的行不存在。 –
你能舉個例子嗎? – Sylvain
對不起,我不知道[此時SQLite僅支持FOR EACH ROW觸發器,而不是FOR EACH STATEMENT觸發器。](http://www.sqlite.org/lang_createtrigger.html)。在我使用的其他數據庫中,它們在「FOR EACH STATEMENT」作用域中運行,您可以在其中對正在更改的整個數據集執行操作。我沒有意識到SQLite的這種限制,所以你不能在我之前的評論中談論的。 –