一、參考網址
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:一個準備好的語句可以啓動的輔助工作線程的最大數量 。