- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个进行一些连接的查询。
SELECT feedback.note as notes,
to_char(feedback.data_compilazione,'DD/MM/YYYY') as date,
CAST(feedback.punteggio AS INT) as score,
upper(substring(cliente.nome from '^.') || '.' ||
substring(cliente.cognome from '^.') || '.') as customer,
testo.testo as nation FROM feedback
JOIN prenotazione ON prenotazione.id = feedback.id_prenotazione
JOIN cliente ON cliente.id = prenotazione.id_cliente
JOIN struttura ON struttura.id = prenotazione.id_struttura
JOIN lingua ON cliente.id_lingua = lingua.id
JOIN nazione ON cliente.codice_nazione = nazione.codice_iso
JOIN testo ON testo.nome_tabella = 'nazione' AND testo.id_record = nazione.id AND
testo.id_lingua = lingua.id AND testo.id_tipo_testo = 1 WHERE struttura.id = 43 AND
lingua.sigla = E'en' AND feedback.punteggio >= 3 AND feedback.note <> ''
ORDER BY feedback.data_compilazione DESC LIMIT 5
我的问题是我的表没有任何明确的索引。
这意味着这个查询花了很长时间,很长很长......很长的时间来执行。
AFAIK postresql 每次声明主键时都会创建一个“隐式”索引,因此我不必“显式”添加它。
这是查询的EXPLAIN
"Limit (cost=212.72..212.73 rows=1 width=208)"
" -> Sort (cost=212.72..212.73 rows=1 width=208)"
" Sort Key: feedback.data_compilazione"
" -> Nested Loop (cost=1.11..212.71 rows=1 width=208)"
" -> Nested Loop (cost=1.11..206.86 rows=1 width=212)"
" Join Filter: (("outer".codice_nazione)::text = ("inner".codice_iso)::text)"
" -> Nested Loop (cost=1.11..201.63 rows=1 width=223)"
" -> Nested Loop (cost=1.11..195.60 rows=1 width=187)"
" Join Filter: ("outer".id = "inner".id_cliente)"
" -> Nested Loop (cost=1.11..45.18 rows=1 width=183)"
" Join Filter: ("outer".id_lingua = "inner".id_lingua)"
" -> Index Scan using testo_pkey on testo (cost=0.00..6.27 rows=1 width=40)"
" Index Cond: (((nome_tabella)::text = 'nazione'::text) AND (id_tipo_testo = 1))"
" -> Hash Join (cost=1.11..38.86 rows=4 width=155)"
" Hash Cond: ("outer".id_lingua = "inner".id)"
" -> Seq Scan on cliente (cost=0.00..33.47 rows=847 width=151)"
" -> Hash (cost=1.11..1.11 rows=1 width=4)"
" -> Seq Scan on lingua (cost=0.00..1.11 rows=1 width=4)"
" Filter: ((sigla)::text = 'en'::text)"
" -> Seq Scan on prenotazione (cost=0.00..150.05 rows=30 width=12)"
" Filter: (43 = id_struttura)"
" -> Index Scan using feedback_id_prenotazione_key on feedback (cost=0.00..6.01 rows=1 width=44)"
" Index Cond: ("outer".id = feedback.id_prenotazione)"
" Filter: ((punteggio >= 3::double precision) AND (note <> ''::text))"
" -> Index Scan using nazione_pkey on nazione (cost=0.00..5.21 rows=1 width=11)"
" Index Cond: ("outer".id_record = nazione.id)"
" -> Index Scan using struttura_pkey on struttura (cost=0.00..5.82 rows=1 width=4)"
" Index Cond: (id = 43)"
所以我停止考虑在 DB 上建立索引。创建索引的最佳实践是什么?解决方案是:为每个连接的字段创建一个索引?
在我的数据库中,你建议索引什么?
我已经做了一些尝试(基本上索引每个连接的字段)并且查询现在运行得更快但不快(大约六秒检索零行)。我想我的解决方案不是最好的。
有人能指出我的看法吗?
编辑
如果我只添加一个索引(在 prenotazione.id_cliente 上),所有操作都将在几秒钟内完成(大约 1.5 秒)。那么,为什么在外键上添加所有索引会使我的查询运行速度变慢?
最佳答案
作为第一条经验法则,即使不查看查询计划,我肯定会将索引放在具有高选择性(>100 个不同值)的外键上。
有些数据库不问就把它们放了,而 Postgres 不会。我们谈论的是外键索引,而不是主键索引(显然总是提供这些索引)。
例如,prenotazione.id_struttura
和 feedback.id_prenotazione
可能是候选对象。
另一方面,包含 7 个不同值的 weekday
列不会从索引中获益,除非有数千个星期一和很少的星期日,在这种情况下,索引对某些值具有选择性.
关于postgresql - 我有什么索引到这个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9724320/
我的 postgresql 有问题,我复制了所有文件,然后将其删除。然后,我安装了新的,问题就解决了。现在可以将旧文件和文件导入新文件吗? 最佳答案 如果它们是相同的主要版本(即 9.0 到 9.0.
我想使用 Postgresql 9.2.2 来存储我的应用程序的数据。我不得不构建一个应该基于数据库级别的触发器(当数据库启动时,这个触发器将被触发并执行。),当 postgresql 服务器启动时是
我已经使用下面的查询从 Postgresql 目录表中获取 Sequence 对象的完整信息 select s.sequence_name, s.start_value, s.minimum_valu
Postgres 版本:9.3.4 我需要执行驻留在远程数据库中的函数。该函数根据给定的参数返回一个统计数据表。 我实际上只是在我的本地数据库中镜像该函数,以使用我的数据库角色和授权来锁定对该函数的访
我在 CentOS 7 上,我正在尝试解决“PG::ConnectionBad: FATAL: Peer authentication failed for user”错误。 所以我已经想出我应该更改
我写了一个触发器函数,在触发器表列名上循环,我从具有不同列的不同表调用该函数。该函数将列名插入到数组中并在它们上循环,以便将值插入到另一个模式和表中。 函数和触发器创建脚本: DROP TRIGGER
PostgreSQL 的默认空闲连接超时是多少,我运行了 show idle_in_transaction_session_timeout 查询并返回了 0,但是值 0 表示此选项被禁用,但我想知道默
我需要将十六进制值存储到数据库表中,谁能推荐我需要用于属性的数据类型? 提前致谢 最佳答案 您可以使用bytea 来存储十六进制格式。更多信息 can be found in the postgres
我有一个具有复合主键的(大)表,由 5 列(a、b、c、d、e)组成。 我想高效地选择具有其中两列 (a + e) 的所有行到给定值。 在 PostgreSQL 中,我需要索引吗?或者数据库会使用主键
在阅读 PostreSQL (13) 文档时,我遇到了 this页面,其中列出了不同日期时间类型的存储大小。 除其他外,它指出: Name Storag
我有两个大整数的巨大表(500 000 000 行)。两列都被单独索引。我正在使用语法批量插入此表: INSERT into table (col1, col2) VALUES(x0, y0), (x
有一台 CentOS7 Linux 机器正在运行(不是由我管理;拥有有限的权限)。 请求在其中设置 PostgreSQL。 刚刚从 CentOS 存储库安装了 PostgreSQL: sudo yum
我在 Ubuntu 18.04 上安装了 Postgresql 10,但不知何故坏了,不会重新启动。我可以重新安装它而不破坏它的数据库,以便我可以再次访问数据库吗? pg_dump 不起作用。 最佳答
我想在 UNIX 中使用 crontab 自动备份 PostgreSQL 数据库。我已经尝试过,但它会创建 0 字节备份。 我的 crontab 条目是: 24 * * * * /home/desk
我已经完成了PG服务器的安装。我希望能够使用 pgAdmin 远程连接到它,但不断收到服务器不听错误。 could not connect to server: Connection refused
Oracle 支持波斯历但需要知道 PostgreSQL 是否支持波斯历? 如果是,那么我们如何在 PostgreSQL 中将默认日历类型设置为 Persian 而不是 Gregorian(在 Ora
假设我们有一个带有表的 SQL 数据库 Person以及访问它的几个应用程序。出于某种原因,我们想修改 Person表以向后不兼容的方式。 保持兼容性的一种潜在解决方案是将表重命名为 User并创建一
我使用 PostgreSQL 中的模式来组织我庞大的会计数据库。每年年底,我都会通过为下一年创建一个新模式来进行协调过程。 新模式的文件是否与旧模式物理分离?或者所有模式一起存储在硬盘上? 这对我来说
我正在尝试使用配置文件中的以下配置参数调整 PostgreSQL 服务器: autovacuum_freeze_max_age = 500000000 autovacuum_max_workers =
我的数据包含数据库列中的表情符号,即 message_text ------- 🙂 😀 Hi 😀 我只想查询包含表情符号的数据的行。在 postgres 中是否有一种简单的方法可以做到这一点?
我是一名优秀的程序员,十分优秀!