首页 > 编程知识 正文

sqlserver优化方案,如何优化sql,提高性能问题

时间:2023-05-06 15:14:12 阅读:57322 作者:4356

文章目录日志模式同步提交添加临时文件内存映射页面大小的操作

你好,我是只谈技术不剪头发的ttdxn老师。

SQLite是嵌入式数据库引擎,通常作为代码库在其他程序中运行,因此不需要服务器配置。 很多人认为SQLite只能用于没有性能要求的小型数据库,但实际情况并非如此。 SQLite只支持一个并发写入,但多个进程可以同时连接到同一数据库进行查询。 通过一些简单的配置和操作,您可以使用SQLite创建GB级数据库,并支持每秒多达10万次的并发查询。

简而言之,优化SQLite性能的配置包括:

pragma journal_mode=WAL; pragma同步=正常; pragma temp_store=memory; pragma mmap_size=30000000000; 上述部分配置是永久有效的,但其他部分在每次连接时都会重置为默认值,因此建议您在每次连接到数据库时运行这些配置命令。

接下来,具体说明各参数的作用。

日志模式pragma journal_mode=WAL; I通过以上配置,SQLite会先写入预写入日志(顺序写入),而不是直接写入(随机写入)数据库文件,然后定期提交到数据库文件。 在此模式下,可以在事务写入期间同时支持读取操作,从而大大提高性能。

注意: WAL模式存在一些问题,写压力可能会导致WAL文件无限增长,从而导致性能大幅下降。 SQLite无法执行检查点,因为写入操作通常频繁。 有多种方法可以缓解这个问题:

减少wal_autocheckpoint间隔。 该方法不一定有效,因为自动检查点是被动触发的操作。 定期运行pragma wal _ check point (完整或pragma wal _ check point (中断命令)。 在full方法中,如果其他进程打开文件,则WAL大小不会改变,但会提交所有内容,以免新数据增加WAL文件。 对于中断方法,SQLite阻止其他进程并将WAL文件重置为空。 这些命令可以在一个进程中运行。 同步提交pragma同步=正常; pragma同步=off; 同步的默认值为full,表示每次更新操作都必须等待FSYNC完成内存数据与磁盘文件的同步。 在WAL模式下,normal方法仍然是完全安全的,这意味着只有WAL检查点操作需要等待FSYNC完成。 如果禁用此选项,数据库可能会损坏,但很少遇到这样的问题。 有关详细信息,请参阅官方文档。

临时文件pragma temp_store=memory; 上述命令表示将临时索引和表存储在内存中。 SQLite允许为特定查询语句自动创建临时索引。 我不知道这个操作能获得多大的性能帮助。 如果SQLite创建了临时索引(在EXPLAIN QUERY PLAN命令中显示),则必须主动创建相应的索引。

内存映射pragma mmap_size=30000000000; 如果数据库的大小小于mmap_size字节,请使用内存映射而不是读/写调用。 操作系统管理的syscall、页面和缓存更少。 这种情况下的性能取决于所使用的操作系统。 请注意,此设置不使用物理内存,而是保留虚拟内存。 然后,操作系统根据典型的“磁盘缓存”逻辑来确定哪些页面将被驱逐,哪些页面将保留在内存中。 至少在Linux上,如果为SQLite进程分配了足够的内存,性能将大大提高。 如果数据库大小大于指定的mmap_size,则数据库部分使用内存映射,其他使用read ()/write )系统调用。

32位操作系统可能只能设置小于4 GB的mmap_size。

如果发生I/O错误,内存映射还会影响官方文档。

页面大小pragma page_size=32768; 在存储大型BLOB数据时,增加页面大小可以提高数据库的性能,但在典型的APP场景中,此方法可能不适用。 对于写入操作,SQLite始终替换整个页面,因此增加页面大小会增加写入操作的开销。

除了上述配置外,其他操作还可以通过定期执行特定操作来提高数据库的性能。

首先,可以定期重新组织数据库。

pragma vacuum 每次执行上述命令时都重新写入数据库文件。 如果数据库大小超过100 MB,则需要花费时间。

然后,可以定期重新分析数据库。

pragma优化; 为了在不详细分析APP应用程序模式和SQL的情况下优化长期查询性能,建议APP应用程序在每次关闭数据库连接时执行上述命令。 对于长期运行的APP应用程序,还可以定期运行这些命令,几小时一次,以提高性能。 我相信信息可以参考官方文档。

此外,还可以定期清理数据库。

pragma auto_vacuum=incremental; -创建数据库后,单击pragma incremental_vacuum; -只有在数据库大小定期大幅缩小时,定期运行上述命令才能显著提高性能。

清理命令会将数据库文件中的可用列表页移动到文件末尾并将其删除。 请注意,自动清理只会截断可用列表页,而不会对VACUUM命令执行文件碎片整理和页面修复。 实际上,由于要移动数据页,自动清理反而会增加碎片。 我相信内容可以参考官方文档。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。