标签: postgresql

postgres 系统目录从表中查询列

我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 schema_information.tables,因为当我尝试以下脚本时:

SELECT table_name
FROM information_schema.tables
WHERE table_schema='{schema}'
Run Code Online (Sandbox Code Playgroud)

我得到 0 的回报,因为该用户没有权限,我应该这样做。

我正在尝试查询数据库以验证创建的表和列。我可以使用以下脚本通过系统目录获取表名列表:

SELECT tablename
FROM pg_catalog.pg_tables
WHERE schemaname = '{schema}'
Run Code Online (Sandbox Code Playgroud)

这会按照我想要的方式输出表名:

业务、位置、人员等...

我找不到带有系统目录的脚本,然后才能找到每个表的列名(作为奖励,数据类型)。到目前为止,我已经尝试了以下方法:

SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE  attrelid = 'business'
Run Code Online (Sandbox Code Playgroud)

这是错误:

ERROR:  invalid input syntax for type oid: "business"
LINE 1: ...od) AS type FROM   pg_attribute WHERE  attrelid = 'business'
                                                         ^```
Run Code Online (Sandbox Code Playgroud)

还试过:

SELECT
    a.attname as "Column",
    pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
    pg_catalog.pg_attribute a
WHERE
    a.attnum > 0
    AND NOT a.attisdropped
    AND …
Run Code Online (Sandbox Code Playgroud)

postgresql information-schema catalogs system-tables

5
推荐指数
1
解决办法
1万
查看次数

在 JSONB 记录数组中查找包含键的行

我正在尝试查询对象数组中存在的键。这种结构:

column jdata
{"name": "Somedata",
 "array": [ {"name":"bla1", "attr": "somevalue"}, 
            {"name":"bla2", "otherdata": "somevalue2"},
            {"name":"bla3", "otherdata": "somevalue"}
           ],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)

现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。

我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。

我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?

目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。

请给我指明一个方向。

postgresql index array json json-path

5
推荐指数
1
解决办法
2万
查看次数

我应该为地理位置点创建一个单独的表吗?

我正在为在某些方面类似于 Uber 的服务开发后端(只是为您提供一般上下文的简化)。用户将预订乘车,因此用户将定义接送地点。这些位置将是一个城市的地址(未来可能会有多个城市)。我将从前端/应用程序收到的位置将采用纬度、经度和 google-maps-verified 地址的形式。

我想知道我是否应该将这些位置存储为一个单独的表,或者我是否应该将这些位置嵌入到我需要它们的任何表中。例如,bookings桌子将有一个上车地点和一个下车地点。这些应该只是对locations表的引用,还是应该添加更多列来存储位置?我将需要每个位置至少 3 列(纬度、长度、地址字符串),如果我们决定将街道地址分解为更多组件,则可能会有更多列。

我认为这两种方法在内存和时间性能之间进行权衡:

  • 单独的表将节省一些空间,因为我们避免多次复制相同的信息。但我不确定会节省多少空间,因为我们还没有足够的真实数据。我的大致估计是,一个中等规模的城市有数以万计的唯一地址。因此,如果我们进行 100 次乘车预订,则重叠的可能性很小。如果我们有 100,000 个乘车预订,那么肯定会有相当多的重叠。然而,空间并不是我们设计的真正限制因素,即使有数百万的预订。如果我们在数据库中多花 100MB,这并不重要。
  • 单独的表会使处理速度变慢。首先,每次我们收到预订请求时,我们都必须搜索请求中的位置是否已存在于我们的数据库中。如果没有,我们添加它们,否则我们使用现有的引用。由于我们的数据库中可能有数万个地址,这将需要一些时间。与我们其他耗时的任务相比,这额外的时间是否重要?另一个耗时任务的示例是调用 google-maps api 以查找从一个位置到另一个位置的路线并获得旅行时间估计。我相信此操作将花费比在我们的数据库中搜索更长的时间。因此,当我们遇到其他瓶颈时,优化数据库访问可能没有多大意义。其他操作呢?假设我们想在一个边界 [lat, long] 框中查找预订。使用单独的表可能会变得更加耗时,因为我们需要一个完整的表连接。或者做一个繁琐的两步搜索,在我们的表中找到边界框内的位置 ID,然后搜索bookings带有这些 ID 的表。如果我们在边界框中有数百或数千个位置,这可能不是一个好方法。但同样,我不确定尝试优化此操作的效用。我不确定我需要按位置搜索的频率。似乎不是那么频繁,所以我不会以任何方式获得/失去太多。

在我看来,没有基于时空权衡的有力论据。我还应该考虑其他方面吗?例如:设计清晰、易于开发、灵活性和可扩展性。如果模型需要改变,单独的表格方法似乎提供了更多的结构和更大的灵活性的机会。例如,将街道地址分解为多个组成部分(街道、城市、州)可能是有益的。如果我们要在其他表中使用位置列,我们就不太可能这样做(我们需要已经使用至少 3 列,并且将地址分成 3 个组件,使这个数字变为 5)。关于灵活性:在未来,我们可能会有多点骑行。拥有位置表将对此有所帮助。

我倾向于单独的表格,但我没有看到支持或反对它的有力论据。我还缺少其他论点吗?

不确定以下细节是否相关,但我将使用 postgresql 作为 RDBMS,使用 sqlalchemy 作为 ORM 来查询数据库。

postgresql database-design spatial routing

5
推荐指数
1
解决办法
1098
查看次数

Postgres:什么可能导致错误“无法在标量上调用 populate_composite”?

我有一列 type JSONB,其中每一行都包含一个带有对象数组的 JSON,例如:

[
    {
        "grade": "4.44/5",
        "endYear": 2011,
        "startYear": 2006,
        "userId": "defg"
    },
    {
        "grade": "9.133/10",
        "endYear": 2010,
        "startYear": 2006,
        "userId": "abcd"
    }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试将这些JSONB集合扩展为行,例如:

| grade    | startYear | endYear | userId |
-------------------------------------------
| 4.44/5   |    2006   | 2011    | defg   |
| 9.133/10 |    2006   | 2010    | abcd   |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)

..使用以下查询:

WITH arr AS (SELECT jsonb_array_elements(jsonbrecords) AS jsons
             FROM "table-with-jsonb"),
    lines AS (
      SELECT x.*
      FROM arr, jsonb_to_record(jsons) AS x(
                "field1" …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-10

5
推荐指数
1
解决办法
1万
查看次数

Postgresql 9.6 尝试让函数返回字符串而不先将其转换为字符串时出错。

我正在学习 PostgreSQL (9.6) 并且对我收到的错误有点困惑。如果我尝试创建以下函数 II 会收到以下错误。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT 'Hello' , 'World' ;
$$
 LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

错误:

    ERROR:  return type mismatch in function declared to return record
DETAIL:  Final statement returns unknown instead of text at column 1.
CONTEXT:  SQL function "helloworld"
SQL state: 42P13
Run Code Online (Sandbox Code Playgroud)

如果我将文本转换为文本,它可以正常工作。

create or replace FUNCTION HelloWorld ()
RETURNS TABLE(HelloCol text, WorldCol text) AS $$

SELECT cast('Hello' as text) , cast('World' as Text);
$$
 LANGUAGE …
Run Code Online (Sandbox Code Playgroud)

postgresql datatypes functions postgresql-9.6

5
推荐指数
1
解决办法
2180
查看次数

获取postgresql中表的最后修改日期

我想知道 postgresql 中表的最后修改日期。在 SQL Server 中可以得到使用

SELECT modify_date FROM sys.objects 
Run Code Online (Sandbox Code Playgroud)

如何在 Postgres 中得到同样的东西?我正在使用 Postgres 9.4

postgresql postgresql-9.4

5
推荐指数
2
解决办法
1万
查看次数

基于where子句从十亿行表中删除数据

我需要根据索引日期字段从 13 亿行表中删除大约 4 亿行。

该表的大小约为 800 GB。

在不造成不利影响的情况下删除数据的最有效方法是什么?该表正在大量使用,这意味着大量插入和更新(不会影响要删除的行)。

有一个维护窗口,这将是最快的,但我可能无法获得足够大的维护窗口。另一方面,我可以花时间进行删除,因此不会着急。

postgresql delete postgresql-9.2

5
推荐指数
1
解决办法
3818
查看次数

如何限制 PostgreSQL 上的 work_mem

作为一名分析师,我喜欢有能力work_mem在大型排序或索引构建即将到来时出现。

作为 DBA,随机用户能够在运行时请求任意数量的系统资源的想法有点吓人。我确认一个基本上不需要许可的新创建用户可以请求尽可能多的请求work_mem。估计一次只需要几个贪婪的用户就可以让其他用户挨饿,这很可怕。

有没有办法限制work_mem用户可以请求?

postgresql memory configuration

5
推荐指数
1
解决办法
735
查看次数

Postgres 撤销用户对数据库的访问

当我尝试

REVOKE ALL PRIVILEGES ON DATABASE postgres from admin; 
Run Code Online (Sandbox Code Playgroud)

但此后用户admin仍然可以postgres通过远程连接pgadmin

如何完全撤销用户对数据库的访问权限?

日志:https : //pastebin.com/raw/Q2mfkf3P

在此处输入图片说明

postgresql

5
推荐指数
1
解决办法
1万
查看次数

ORDER BY 子句会降低查询性能

语境:

PostgreSQL 10,users表有3667438条记录,users表有一个名为social的JSONB,我们通常使用对计算函数输出进行索引的策略,这样我们就可以将信息聚合到一个单独的索引中。的输出engagement(social)函数是双精度数字类型。

问题:

有问题的条款是 ORDER BY engagement(social) DESC NULLS LAST,还有一个 btree 索引idx_in_social_engagement with DESC NULLS LAST附加到这个数据。

快速查询:

EXPLAIN ANALYZE
SELECT  "users".* FROM "users"
WHERE (follower_count(social) < 500000)
AND (engagement(social) > 0.03)
AND (engagement(social) < 0.25)
AND (peemv(social) < 533)
ORDER BY "users"."created_at" ASC
LIMIT 12 OFFSET 0;

Limit  (cost=0.43..52.25 rows=12 width=1333) (actual time=0.113..1.625 
rows=12 loops=1)
   ->  Index Scan using created_at_idx on users  (cost=0.43..7027711.55 rows=1627352 width=1333) (actual time=0.112..1.623 rows=12 loops=1)
         Filter: ((follower_count(social) < 500000) AND …
Run Code Online (Sandbox Code Playgroud)

postgresql performance order-by postgresql-10 postgresql-performance

5
推荐指数
1
解决办法
8670
查看次数