簡體   English   中英

使用SQLite在附加數據庫內部使用觸發器的效率

[英]Efficiency using triggers inside attached database with SQLite

情況

我使用多個存儲數據庫作為一個中央“經理”數據庫的附件。

  • 存儲表在所有存儲數據庫之間共享一個偽AUTOINCREMENT索引。
  • 我需要經常遍歷共享索引。
  • 在創建存儲數據庫時,不知道存儲表的最終編號和名稱。
  • 根據某種信號,將刪除隨后提供的一系列條目。
  • 至關重要的是,插入操作必須成功,並且在輸入信號之前,不要刪除任何條目。
  • 可能會發生斷電,這種情況下的數據丟失幾乎是無法容忍的。 任何可能導致此問題的解決方案(內存數據庫等)都不可行。
  • 當前使用strands控制數據庫訪問。 這需要順序訪問。
  • 由於INSERT事務的頻率很高,因此我必須手動觸發WAL檢查點。 除此之外,我還見過最大2GB的日志。

當前解決方案

我使用參數綁定到預先創建的語句來插入數據集。

INSERT INTO datatable VALUES (:idx, ...);

這樣做時,我記得開始和結束索引。 接下來,我將其綁定到注冊表表中的插入語句:

INSERT INTO regtable VALUES (:idx, datatable);

我的查詢確定要返回的數據集,如下所示:

SELECT MIN(rowid), MAX(rowid), tablename
FROM (SELECT rowid,tablename FROM entryreg LIMIT 30000)
GROUP BY tablename;

之后,我查詢

SELECT * FROM datatable WHERE rowid >= :minid AND rowid <= :maxid;

在這里我使用的每個預定義報表datatable和兩個變量綁定到第一個查詢的結果。

這太慢了。 創建注冊表表后,插入速度會大大降低,我無法達到基准速度。

可能的解決方案

我可以想象有幾種其他方法可以完成:

  1. 創建所有索引的視圖,作為所有表索引的UNIONOUTER JOIN 這不能在附加數據庫上持久執行。

  2. 在創建表時為填入注冊表的表創建INSERT / REMOVE觸發器。 這不能在附加數據庫上持久執行。

  3. 在數據庫創建時為CREATE TABLE創建觸發器,該觸發器將創建上述觸發器。 需要用戶功能。

問題

現在,在我添加用戶功能(這是我以前從未做過的事情)之前,如果有機會解決我的性能問題,我想尋求一些建議。

  • 假設我在附加數據庫之前使用單獨的連接創建數據庫。 我可以在數據庫上創建視圖和/或觸發器(作為main模式),這些視圖和/或觸發器在以后通過ATTACH連接到數據庫時可以工作嗎?
  • 從外觀AFTER INSERT ,每插入一行后,觸發器AFTER INSERT就會觸發。 如果將內容插入到另一個表中,這是否意味着我將事務數從2增加到1 + N? 還是有一種機制可以加速觸發的交互? 第一種情況會使事情變慢。
  • 有沒有機會使FULL OUTER JOIN (我需要從其他JOIN命令創建它 )比每次用插入事務填充注冊表更快? 我們說的是每秒大約10個事務,平均有1000個元素(插入),而每2秒有30000個查詢(查詢)。

在多線程模式下打開sqlite3數據庫,通過單獨的線程處理insert / update / query / delete函數。 我更喜歡將查詢結果傳輸到stl容器進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM