Postgres 11 获得了基于LLVM技术执行即时编译 (JIT) 的能力。
\n\n手册指出,此功能取决于使用该选项构建的 Postgres --with-llvm
。
\xe2\x9e\xa5 如何验证他们的 Postgres 版本是否包含 LLVM?
\n\n假设安装了 LLVM\xe2\x80\xa6 在 Postgres 11 中,默认情况下禁用 JIT。在 Postgres 12 中,启用了该功能。这就提出了一个问题:
\n\n\xe2\x9e\xa5 如何判断 JIT 当前是启用还是禁用?
\ntl; dr:处理由 jit 引起的性能下降的最佳方法是什么?
背景:
最近我从 postgres 11 迁移到 12 并注意到,一些查询/程序运行得相当慢。我做了一些研究并测试了不同的配置 - 结果表明 jit 开销超过了它的收益。我看到两种可能的解决方案:
通过运行set jit = off;
一次永久禁用所有查询的 jit 。这有帮助,但感觉不自然。(也许是因为更改了默认配置,我没有做太多,因为没有这样的需要。默认值是理智的,需要更改的可能性很小。)这也意味着在运行长查询时放弃可能的性能提升.
在程序开始时禁用 jit 并在结束时启用它。我反对更改配置对并行运行的查询的影响。当然,这会损害日志查询的性能,这些查询会同时运行,但这可能会导致其他可能难以检测的错误。此外,这似乎比第一个解决方案更不正确 - 作为程序的一部分更改配置。
处理这个问题的最好方法是微调配置,这样 jit 就不会被完全丢弃,而且配置也不会在运行时改变。不幸的是,我发现几乎没有任何资源如何,这将是可能的(只有像参数jit_above_cost
中的文件,似乎是帮助不大)。
问题:解决此问题的最佳方法是什么?除了运行和测量之外,是否有关于何时禁用 jit 的任何标准?是否可以微调行为(例如,针对特定查询禁用 jit)?
我正在尝试在大型数据库上运行查询而不终止与服务器的连接。
我在具有 16GB 内存和大约 40GB 可用磁盘空间的 Mac 上使用 Postgres 12.1。根据数据,数据库为 78GB pg_database_size
,最大表为 20GB pg_total_relation_size
。
无论我运行哪个非工作查询,我(从日志中)得到的错误是:
server process (PID xxx) was terminated by signal 9: Killed: 9
Run Code Online (Sandbox Code Playgroud)
在 VS 代码中,错误是"lost connection to server"
.
两个不起作用的例子是:
UPDATE table
SET column = NULL
WHERE column = 0;
Run Code Online (Sandbox Code Playgroud)
select columnA
from table1
where columnA NOT IN (
select columnB
from table2
);
Run Code Online (Sandbox Code Playgroud)
我可以通过添加 1,000,000 个来运行某些查询(例如上面的查询)LIMIT
。
我怀疑由于临时文件而导致磁盘不足,但在日志(带有log_temp_files = 0
)中,我看不到任何正在写入的临时文件。
我尝试增加和减少work_mem
, maintenance_work_mem
,shared_buffers
和temp_buffers
。没有一个起作用,性能大致相同。 …