(sqlite3學習2)sqlite中的限制:數據庫大小、表數、列數、行數、參數個數、連接數等

一、參考網址
SQLite中的限制(官網):https://sqlite.org/limits.html
運行時限制類別(官網):https://sqlite.org/c3ref/c_limit_attached.html#sqlitelimitcolumn

二、詳解
1、查看、設置sqlite限制命令.limit
sqlite> .limit    // 顯示或設置數據庫限制信息:SQLITE_LIMIT

              length 1000000000    // 字符串或BLOB的最大長度10億,一行的最大長度
          sql_length 1000000000    // sql語句最大長度
              column 2000    // 列數,可以在編譯時纔可以將最大列出改爲32767
          expr_depth 1000    // 表達式樹的最大深度,SQLite將表達式解析到樹中進行處理。
     compound_select 500    // 複合SELECT語句中的最大術語數
             vdbe_op 25000    // 虛擬機程序中用於實現SQL語句的最大指令數
        function_arg 127    // 一個函數的最大參數個數
            attached 10        // ATTACH語句,附加數據庫最大值爲125
 like_pattern_length 50000    // LIKE模式匹配算法或GLOB模式的最大長度
     variable_number 250000    // 任何參數的索引號
       trigger_depth 1000    // 觸發遞歸的最大深度
      worker_threads 0        // 可以啓動的輔助工作線程的最大數量



2、SQLite中的限制彙總
1)字符串或BLOB的最大長度
注:BLOB是sqlite的一種類型,用於存儲二進制。
限制SQLite中字符串、BLOB類型值、數據庫一行的最大字節數,默認值爲10億,最大爲2147483647;
在編譯時,通過SQLITE_MAX_LENGTH來設置;

-DSQLITE_MAX_LENGTH = 123456789
1
在運行時,通過sqlite3_limit(db, SQLITE_LIMIT_LENGTH, size)來降低該值;

官方建議:最好將最大字符串長度和blob長度減小到幾百萬。
在SQLite的INSERT和SELECT處理的一部分期間,數據庫中每一行的全部內容被編碼爲單個BLOB。因此,SQLITE_MAX_LENGTH參數還確定一行中的最大字節數。

2)最大列數
最大列數用於限制一下項的上限:

表中的列數
索引中的列數
視圖中的列數
UPDATE語句的SET子句中的術語數
SELECT語句的結果集中的列數
GROUP BY或ORDER BY子句中的術語數
INSERT語句中的值數

默認值爲2000,最大爲32767;
在編譯時,通過SQLITE_MAX_COLUMN來設置,
在運行時,通過sqlite3_limit(db, SQLITE_LIMIT_COLUMN,size)來降低最大列數。

3)SQL語句的最大長度
對SQL語句的最大字節數的限制,默認值爲1000000,最大爲SQLITE_MAX_LENGTH和1073741824中較小的一個。
在編譯時,通過SQLITE_MAX_SQL_LENGTH來設置;
在運行時,通過sqlite3_limit(db, SQLITE_LIMIT_SQL_LENGTH, size)來降低該值。

4)聯接中的最大表數
SQLite不支持包含超過64個表的聯接。不可更改

5)表達式樹的最大深度
限制SQL語句表達式的複雜程度;
編譯時通過SQLITE_MAX_EXPR_DEPTH參數設置,默認是1000;
如果SQLITE_MAX_EXPR_DEPTH爲正,可以在運行時通過sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size)來降低;
如果SQLITE_MAX_EXPR_DEPTH爲0,則不受限制,上面的接口無效。

6)函數的最大參數個數
限制函數的參數個數,默認值是100,最大爲127;
在編譯時,通過SQLITE_MAX_FUNCTION_ARG來設置最大值;
在運行時,通過sqlite3_limit(db,SQLITE_LIMIT_FUNCTION_ARG,size)來降低該值。

7)複合SELECT語句中的最大項數
複合SELECT語句是通過運算符UNION,UNION ALL,EXCEPT或INTERSECT連接的兩個或多個SELECT語句。每個單獨的SELECT語句稱爲“項”。
默認值爲500;官方不建議再增大;
在編譯時,通過SQLITE_MAX_COMPOUND_SELECT來設置最大值;
在運行時,通過 qlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size)來降低該值。

8)LIKE或GLOB模式的最大長度
LIKE、GLOB運算符:模式匹配比較,類似正則表達式;
限制LIKE或GLOB模式的表達式的字符長度;默認值爲50000,官方不建議再增大;
在編譯時,通過SQLITE_MAX_LIKE_PATTERN_LENGTH來設置最大值;
在運行時,通過sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size)來降低該值。

9)單個SQL語句中的最大佔位符個數
限制C或C++ SQL接口中使用的佔位符的個數;默認爲999,最大值10億;
在編譯時,通過SQLITE_MAX_VARIABLE_NUMBER來設置最大值;
在運行時,通過sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size)來降低該值。

10)觸發遞歸的最大深度
SQLite 觸發器(Trigger)是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用。
限制回調函數遞歸的深度。
默認值是1000.;
在編譯時,通過SQLITE_MAX_TRIGGER_DEPTH來設置最大值;
在運行時,無法設置;

11)數據庫關聯的最大數
使用ATTACH可以將多個數據庫關聯到一起,這樣在操作時,就像操作一個數據庫。
限制關聯數據庫的個數,默認值10,最大125;
在編譯時,通過SQLITE_MAX_ATTACHED來設置最大值;
在運行時,通過sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size)來降低該值。

12)數據庫文件中的最大頁數
防止單個數據庫文件過大;數據庫文件大小由頁數和單個頁大小決定;
默認值爲1073741823,最大2147483646
在編譯時,通過SQLITE_MAX_PAGE_COUNT來設置;
在運行時,通過PRAGMA schema.max_page_count來查詢和設置該值;
在插入新數據時,頁數將要超過該值,會返回SQLITE_FULL。
如果頁數最大爲2147483646,頁大小爲65536時,數據庫大小約爲140 TB。

13)表中的最大行數
表中的理論最大行數爲2^ 64(18446744073709551616或大約1.8e+19)。由於將首先達到140 TB的最大數據庫大小,因此無法達到此限制。一個140 TB的數據庫最多可以容納大約1e+13行。
無法改變該值。

14)數據庫大小限制
頁數最大爲2147483646,頁大小爲65536時,數據庫大小約爲140 TB

15)表個數限制
保存每個表的描述信息需要一頁,因此該表的數量不會超過頁數。
初始化數據庫時,需要掃描所有表的描述信息、並保存在內存中。因此數據庫連接啓動時間和初始內存使用量和表的數量成正比。

3、運行時限制類別

#define SQLITE_LIMIT_LENGTH                    0
#define SQLITE_LIMIT_SQL_LENGTH                1
#define SQLITE_LIMIT_COLUMN                    2
#define SQLITE_LIMIT_EXPR_DEPTH                3
#define SQLITE_LIMIT_COMPOUND_SELECT           4
#define SQLITE_LIMIT_VDBE_OP                   5
#define SQLITE_LIMIT_FUNCTION_ARG              6
#define SQLITE_LIMIT_ATTACHED                  7
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH       8
#define SQLITE_LIMIT_VARIABLE_NUMBER           9
#define SQLITE_LIMIT_TRIGGER_DEPTH            10
#define SQLITE_LIMIT_WORKER_THREADS           11



這些常量定義了各種性能限制,可以在運行時使用 sqlite3_limit 降低這些限制

int sqlite3_limit(sqlite3*, int id, int newVal);
1
id取值如下:
SQLITE_LIMIT_LENGTH:任何字符串或BLOB或錶行的最大大小,以字節爲單位。

SQLITE_LIMIT_SQL_LENGTH:SQL語句的最大長度,以字節爲單位。

SQLITE_LIMIT_COLUMN:表定義或SELECT結果集中的最大列數,或索引或ORDER BY或GROUP BY子句中的最大列數。

SQLITE_LIMIT_EXPR_DEPTH:任何表達式上分析樹的最大深度。

SQLITE_LIMIT_COMPOUND_SELECT:複合SELECT語句中的最大術語數。

SQLITE_LIMIT_VDBE_OP:虛擬機程序中用於實現SQL語句的最大指令數。如果sqlite3_prepare_v2()或等效方法試圖在單個準備好的語句中爲多個操作碼分配空間,則將返回SQLITE_NOMEM錯誤。

SQLITE_LIMIT_FUNCTION_ARG:一個函數的最大參數個數。

SQLITE_LIMIT_ATTACHED:附加數據庫的最大數量。

SQLITE_LIMIT_LIKE_PATTERN_LENGTH:LIKE或 GLOB運算符的pattern參數的最大長度。

SQLITE_LIMIT_VARIABLE_NUMBER:SQL語句中任何參數的最大索引號。

SQLITE_LIMIT_TRIGGER_DEPTH:觸發器的最大遞歸深度。

SQLITE_LIMIT_WORKER_THREADS:一個準備好的語句可以啓動的輔助工作線程的最大數量 。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章