首先,这个SO问题描述了一个类似的问题:PostgreSQL query not using INDEX when RLS (Row Level Security) isenabled ,但我无法成功利用它的建议,还想看看是否有改进的方法Postgraphile 背景下的事物。
复制步骤:
作为超级用户,创建一个简单的表并用一些随机数据填充它:
CREATE TABLE public.videos AS SELECT id, md5(random()::text) AS title from generate_Series(1,1000000) id;
Run Code Online (Sandbox Code Playgroud)
执行 ILIKE 查询(在本文中,它被称为“ILIKE 查询”,用于多次测试性能):
EXPLAIN ANALYSE SELECT COUNT(*) FROM public.videos WHERE title ILIKE '%test%';
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它执行了 Seq Scan,执行时间约为 194.823 ms
安装 gp_trgm 扩展并添加 gin 索引:
CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
CREATE INDEX trgm_idx_videos_title ON public.videos USING gin (title gin_trgm_ops);
Run Code Online (Sandbox Code Playgroud)
由于表已经填充了数据,因此创建索引需要一些时间(约 10 秒)。现在,运行相同的 ILIKE 查询将使用“trgm_idx_videos_title 上的位图索引扫描”,执行时间为 0.036 毫秒。
到目前为止一切似乎都很好,但前提是您可以始终使用超级用户来获取数据并且不为所述表实现额外的安全性。
让我们设置一个额外的用户并授予其连接到我们的数据库的权限(名为 …
postgresql indexing performance row-level-security postgraphile
我试图将注意力集中在GraphQL上,尽管我使用PostGraphile来轻松快速地映射我的PostgreSQL数据库并使用GraphQL公开它。但是,我在某些事情上停留了很长时间,而用简单的SQL只需花几分钟的时间即可完成工作-
首先,我试图在定义的日期之后从数据库中获取所有记录,但到目前为止还不能这样做,最终我得到了效率极低的所有记录。
其次,我想获取所有记录,其中的可为空字段不为空(这意味着,只有其中包含某些内容,它才会显示在GraphQL结果中)
如果有人可以阐明如何执行此操作,或者为我提供了一个不错的教程,该教程以简单的方式说明了如何编写自定义过滤功能的方法,效果很好。
我正在研究 React + Postgraphile (GraphQL) + axios(对 postgraphile 服务器的 http 请求)的教学组合的项目。
它有很多 GraphQL 查询。最初是从同一文件中的查询与其他 JavaScript 和渲染代码开始的,但一旦添加了特定查询,它就变得混乱了。
在搜索时,我发现我们可以将查询分离到单独的文件中 - .graphql 或 .gql 为此,我必须与 Webpack 模块集成 -
我想知道是否有更简单(开箱即用)的方法来实现类似的事情,而不使用 Webpack,因为它需要大量的配置。
任何指针或示例都会非常有帮助。
谢谢。
我有以下 GraphQL 查询:
{
allForums {
nodes {
name,
topics: topicsByForumId(orderBy: [TITLE_ASC]) {
nodes {
title
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将返回如下内容:
{
"data": {
"allForums": {
"nodes": [
{
"name": "1",
"topics": {
"nodes": [
{
"title": "a"
},
{
"title": "b"
}
]
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到以下结果:
[
{
"name": "1",
"topics": [
{
"title": "a"
},
{
"title", "b"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
是否有可能摆脱data, nodes, ... 字段?这是可以在 GraphQL 中完成的事情,还是应该在我的服务实现中完成?
我在 PostgreSQL …
注意:这主要是关于 Node-PostgreSQL 模块的问题pg。它包含来自 Gatsby 和 Postgraphile 的详细信息,但我不需要这三个方面的专业知识,只需pg.
我有一个数据库,可以与使用 PostGraphile 的 Express 服务器配合使用。node我还可以通过命令行访问它......
const { Pool } = require("pg");
const pool = new Pool({ connectionString: myDbUrl });
pool.connect().then(() => console.log('connected'));
// logs 'connected' immediately
Run Code Online (Sandbox Code Playgroud)
完全相同的数据库之前也通过gatsby-source-pg插件与 Gatsby/PostGraphile 配合得很好...但最近我更换了开发机器,当我尝试构建或运行开发服务器时,Gatsby 挂在“源和转换节点”步骤上。当我调试它时,它挂在对 的调用上pool.connect()。
所以我实际上有两个使用 PostGraphile 的代码库,两者都具有相同的配置,一个可以工作,另一个则不能。更奇怪的是,如果我编辑 Gatsby 插件的源代码node_modules,使其使用完全相同的代码(我可以在命令行成功运行)......它仍然挂起。
我唯一能想到的是其他一些 Gatsby 插件正在耗尽所有连接并且没有释放它们,但据我所知(例如通过 grep-ing through node_modules)没有其他插件甚至使用pg.
所以我真的有两个问题:
A)谁能帮我理解为什么connect会挂起?如果你能帮助我理解为什么它会使用已知良好的配置并且仅在 Gatsby 内部(在某些环境因素发生变化后)这样做,那就加分了?
B) 谁能帮我解决这个问题吗?如果可能是某种“以前的代码忘记释放连接”问题,有什么方法可以测试吗?如果我能以某种方式记录,new …
有没有办法禁用 Postgraphile 中的“删除复数”功能?
我的数据库中有一个表OS,并且正在使用非常出色的Postgraphile库免费创建 GraphQL 界面。一切都很棒,但 Postgraphile 正在截断我的表名,认为它是复数。所以我得到的allOs不是allOsesand createO,updateO等等......
我试过:
O_S),复数形式大写-s,allOS但单数形式是O_E'@name os'但它仍然删除sE'@name oss'哪个正确地复数allOsses(哈哈)并保留两者为单数ossPS,如果您看到 Benjie/其他贡献者,您的文档令人难以置信,该库将节省我几个月的工作。
我在 PostgreSQL 中有这个函数:
CREATE FUNCTION it_exists(
email text,
name text
) RETURNS boolean AS $$
DECLARE
_eva1 boolean;
_eva2 boolean;
BEGIN
_eva1 := EXISTS(SELECT * FROM tableA AS A WHERE A.email = $1::citext);
_eva2 := EXISTS(SELECT * FROM tableB AS A WHERE A.name::citext = $2::citext);
RETURN _eva1 OR _eva2;
END;
$$ LANGUAGE plpgsql STRICT SECURITY DEFINER;
Run Code Online (Sandbox Code Playgroud)
它被翻译成 Postgraphile 是这样的:
mutation MyMutation($email: String!, $name: String!) {
itExists(
input: { email: $email, name: $name }
) {
boolean
}
}
Run Code Online (Sandbox Code Playgroud)
我想将“布尔”名称更改为“结果”之类的名称,有什么建议吗?考虑我有许多具有不同返回值的函数。
postgraphile ×7
graphql ×3
postgresql ×2
gatsby ×1
gql ×1
indexing ×1
node.js ×1
performance ×1
postgraphql ×1
reactjs ×1