非常教程

Sqlite参考手册

其他 | Miscellaneous

Memory-Mapped I/O

SQLite访问和更新数据库磁盘文件的默认机制是sqlite3_io_methods VFS对象的xRead()和xWrite()方法。这些方法通常实现为“read()”和“write()”系统调用,这些系统调用会导致操作系统在内核缓冲区高速缓存和用户空间之间复制磁盘内容。

从版本3.7.17(2013-05-20)开始,SQLite可以选择使用内存映射I/O和sqlite3_io_methods上的新xFetch()和xUnfetch()方法直接访问磁盘内容。

使用内存映射I/O有优点和缺点。优点包括:

  • 许多操作,特别是I/O密集型操作,可能会更快,因为内容确实需要在内核空间和用户空间之间进行复制。
  • SQLite库可能需要更少的RAM,因为它与操作系统页面缓存共享页面,并不总是需要它自己的工作页面副本。

但也有缺点是:

  • 内存映射文件上的I/O错误不能被SQLite捕获和处理。相反,I/O错误会导致一个信号,如果未被应用程序捕获,则会导致程序崩溃。
  • 操作系统必须具有统一缓冲区高速缓存,以便内存映射I/O扩展能够正常工作,特别是在两个进程正在访问同一个数据库文件并且一个进程正在使用内存映射I/O的情况下不是。并非所有操作系统都有统一的缓冲区缓存。在一些声称拥有统一缓冲区高速缓存的操作系统中,实现有问题,并可能导致数据库损坏。
  • 性能并不总是随着内存映射I/O而增加。实际上,可以构建测试用例,通过使用内存映射I/O来降低性能。
  • Windows无法截断内存映射文件。因此,在Windows上,如果诸如VACUUM或auto_vacuum之类的操作尝试减小内存映射数据库文件的大小,则大小缩减尝试将自动失败,从而在数据库文件末尾留下未使用的空间。由于这个问题没有数据丢失,并且未使用的空间将在数据库下一次增长时再次使用。但是,如果3.7.0之前的SQLite版本在这样的数据库上运行PRAGMA integrity_check,它将(错误地)报告由于末尾未使用的空间而导致的数据库损坏。或者,如果3.7.0之前的SQLite版本在数据库中写入数据库的同时尚未使用空间,则可能会使该未使用的空间无法访问,直到下一个VACUUM之后才能重用。

由于潜在的缺点,默认情况下禁用内存映射I/O。要激活内存映射I/O,请使用mmap_size编译指示并将mmap_size设置为一个大数字,通常为256MB或更大,具体取决于应用程序可以节省多少地址空间。其余的是自动的。对于不支持内存映射I/O的系统,PRAGMA mmap_size语句将成为无提示操作。

How Memory-Mapped I/O Works

要使用传统的xRead()方法读取数据库内容的页面,SQLite首先分配一个页面大小的堆内存块,然后调用xRead()方法,这会使数据库页面内容被复制到新分配的堆内存中。这涉及(至少)整个页面的副本。

但是,如果SQLite想要访问数据库文件的页面并启用了内存映射I/O,则它首先调用xFetch()方法。如果可能,xFetch()方法会要求操作系统返回指向所请求页面的指针。如果请求的页面已经或可以映射到应用程序地址空间中,则xFetch将返回一个指向该页面的指针,供SQLite使用而不必复制任何内容。跳过复制步骤是使内存映射I/O更快的原因。

SQLite不会假定xFetch()方法会起作用。如果对xFetch()的调用返回一个NULL指针(表示请求的页面当前没有映射到应用程序地址空间中),那么SQLite会默默地回退到使用xRead()。仅当xRead()也失败时才报告错误。

当更新数据库文件时,SQLite总是在修改页面之前将页面内容拷贝到堆内存中。这是必要的,原因有两个。首先,在事务提交之前,对数据库的更改不应该对其他进程可见,因此更改必须发生在私有内存中。其次,SQLite使用只读内存映射来防止应用程序中的杂散指针覆盖和破坏数据库文件。

完成所有必需的更改后,将使用xWrite()将内容移回数据库文件。因此,使用内存映射I/O不会显着改变数据库更改的性能。内存映射I/O主要是查询的好处。

Configuring Memory-Mapped I/O

“mmap_size”是SQLite试图同时映射到进程地址空间的数据库文件的最大字节数。mmap_size单独应用于每个数据库文件,因此可能使用的进程地址空间总量是mmap_size乘以打开的数据库文件数。

要激活内存映射I/O,应用程序可以将mmap_size设置为一个较大的值。例如:

PRAGMA mmap_size=268435456;

要禁用内存映射I/O,只需将mmap_size设置为零即可:

PRAGMA mmap_size=0;

如果mmap_size设置为N,那么所有当前实现都会映射数据库文件的前N个字节,并使用旧版xRead()调用来处理超出N个字节的任何内容。如果数据库文件小于N个字节,则映射整个文件。在未来,新的操作系统接口理论上可以映射除前N个字节以外的文件区域,但目前没有这种实现。

使用“PRAGMA mmap_size”语句为每个数据库文件单独设置mmap_size。通常的默认mmap_size为零,这意味着内存映射I/O默认是禁用的。但是,默认的mmap_size可以在编译时使用SQLITE_DEFAULT_MMAP_SIZE宏或在启动时使用sqlite3_config(SQLITE_CONFIG_MMAP_SIZE,...)接口增加。

SQLite也在mmap_size上维护一个硬性的上界。尝试在这个硬上限(使用PRAGMA mmap_size)之上增加mmap_size会自动限制硬上限的mmap_size。如果硬性上限为零,则内存映射I/O是不可能的。可以使用SQLITE_MAX_MMAP_SIZE宏在编译时设置硬上限。如果SQLITE_MAX_MMAP_SIZE设置为零,那么用于实现内存映射I/O的代码将从构建中省略。在某些平台(例如:OpenBSD)上,由于缺少统一的缓冲区缓存,内存映射I/O无法正常工作,硬盘上限会自动设置为零。

如果mmap_size的硬上限在编译时为非零值,则可能会在启动时使用sqlite3_config(SQLITE_CONFIG_MMAP_SIZE,X,Y)接口将其减少或归零。X和Y参数必须都是64位有符号整数。X参数是进程的默认mmap_size,Y是新的硬上限。硬上限不能使用SQLITE_CONFIG_MMAP_SIZE增加到编译时设置以上,但可以减少或归零。

 SQLite is in the Public Domain.

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Architecture of SQLite
6.Atomic Commit In SQLite
7.Automatic Undo/Redo With SQLite
8.Benefits of SQLite As A File Format
9.Change in Default Page Size in SQLite Version 3.12.0
10.Clustered Indexes and the WITHOUT ROWID Optimization
11.Compile-time Options
12.Constraint Conflict Resolution in SQLite
13.Custom Builds Of SQLite
14.Deterministic SQL Functions
15.Distinctive Features Of SQLite
16.EXPLAIN QUERY PLAN
17.Features Of SQLite
18.File Format Changes in SQLite
19.Full-Featured SQL
20.High Reliability
21.Hints for Debugging SQLite
22.How SQLite Is Tested
23.How To Compile SQLite
24.How To Download Canonical SQLite Source Code
25.Imposter Tables
26.In-Memory Databases
27.Indexes On Expressions
28.Internal Versus External BLOBs
29.Isolation In SQLite
30.Long Term Support
31.Maintaining Private Branches Of SQLite
32.Many Small Queries Are Efficient In SQLite
33.Measuring and Reducing CPU Usage in SQLite
34.NULL Handling in SQLite
35.Partial Indexes
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By