首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Postgres中加速慢速SELECT DISTINCT查询的解决方案

在Postgres中加速慢速SELECT DISTINCT查询的解决方案
EN

Stack Overflow用户
提问于 2011-07-06 15:16:11
回答 3查看 86.9K关注 0票数 37

查询基本上是:

代码语言:javascript
运行
AI代码解释
复制
SELECT DISTINCT "my_table"."foo" from "my_table" WHERE...

我假装100%确定查询的DISTINCT部分是它运行缓慢的原因,为了避免混淆,我省略了查询的其余部分,因为我主要关心的是distinct部分的缓慢(distinct总是缓慢的来源)。

有问题的表有250万行数据。这里没有列出的目的需要DISTINCT (因为我不想返回修改过的查询,如果可能的话,我只想返回有关在DBMS级更快地运行distinct查询的一般信息)。

我怎样才能让DISTINCT运行得更快(特别是使用postgres9)而不改变SQL (也就是,我不能改变这个SQL,但有权在DB级优化一些东西)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-06 15:29:04

您的DISTINCT会导致它对输出行进行排序,以便查找重复项。如果将索引放在查询所选的列上,则数据库可能能够按索引顺序读出它们并保存排序步骤。这在很大程度上取决于查询的细节和所涉及的表--您所说的“知道问题出在DISTINCT”确实限制了可用答案的范围。

票数 28
EN

Stack Overflow用户

发布于 2011-07-06 15:25:54

通常,您可以通过使用group by绕过distinct来更快地运行此类查询:

代码语言:javascript
运行
AI代码解释
复制
select my_table.foo 
from my_table 
where [whatever where conditions you want]
group by foo;
票数 46
EN

Stack Overflow用户

发布于 2011-07-08 00:40:24

您可以尝试增加work_mem设置,具体取决于数据集的大小,这可能会导致将查询计划切换为散列聚合,后者通常会更快。

但在全局设置得太高之前,首先要仔细阅读它。您可以很容易地炸毁您的服务器,因为max_connections设置相当于这个数字的乘数。

这意味着,如果您设置了work_mem = 128MB并设置了max_connections = 100 (默认值),那么您应该有超过12.8 of的内存。您实际上是在告诉服务器,它可以使用这些内存来执行查询(甚至不考虑Postgres或其他方面使用的任何其他内存)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6598778

复制
相关文章
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
子润先生
2021/07/01
8960
SAP ABAP 技能:SELECT、SELECT SINGLE 和 SELECT DISTINCT
最近开始接触一些BW历程的内容,就看到有有一部分SELECT关键词不同,但是功能类似,就想着整理一下。
Adil_zhang
2023/05/10
4.7K0
【DB笔试面试621】在Oracle中,举例说明“DISTINCT配置(Distinct Placement,DP)”查询转换。
在Oracle中,举例说明“DISTINCT配置(Distinct Placement,DP)”查询转换。
AiDBA宝典
2019/09/29
5750
SQL 简介:如何使用 SQL SELECT 和 SELECT DISTINCT
结构化查询语言 (SQL) 是用于与关系数据库通信的标准编程语言。由于业务中的数据使用量以惊人的速度增长,因此对了解 SQL、关系数据库和数据管理的人员的需求也在上升。
IT千锋教育
2023/05/30
1.3K0
SQL 简介:如何使用 SQL SELECT 和 SELECT DISTINCT
java mongo 查询统计 distinct
CommandResult result = mongoTemplate.getDb().command(
艳艳代码杂货店
2021/10/27
9960
97- 优化select distinct owner from tbig
select distinct owner from tbig where owner is not null;
老虎刘
2022/12/09
4340
JAVA中SQL查询语句大全,select多表查询,各种查询
– 查询emp表中的所有部门, 剔除重复的记录, 提示: distinct用于剔除重复值
全栈程序员站长
2022/09/02
2.3K0
JAVA中SQL查询语句大全,select多表查询,各种查询
mysql longtext查询慢_select中的longtext使查询速度极慢
`date_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
全栈程序员站长
2022/08/28
3.2K0
select 高级查询之子查询
  在 SQL 语言中,一个 SELECT-FROM-WHERE 语句称为一个查询块。当获得一个查询的答案需要多个步骤的操作,首先必须创建一个查询来确定用户不知道但包含在数据库中的值,将一个查询块嵌套在另一个查询块的 WHERE 字句或 HAVING 短语的条件中查询块称为子查询或内层查询。外部的 SELECT 查询语句,称为主查询或外查询。按结果集的行列数不同子查询可以分为 4 种  ♞ 标量子查询(结果集只有一行一列)  ♞ 列子查询(结果集只有一列多行)  ♞ 行子查询(结果集有一行多列)  ♞ 表子查询(结果集一般为多行多列)
Demo_Null
2020/09/28
2.6K0
Oracle 中的SELECT 关键字(查询、检索)
检索单个列:select 列名 from 表名; 例:select ename from emp; 检索多个列: select [列1,列2, ... ,列N] from 表名; 例:select ename , sal from emp; 检索所有列:select * from 表名; 例:select * from emp;
星哥玩云
2022/08/18
4.3K0
select 进阶查询
 ① 分组查询中,select 后面只能出现,在 group by 后出现过的列或者聚合函数。  ② where 是在分组前对记录进行筛选,而 having 是在分组结束后的结果里筛选,最后返回最终查询结果。  ③ having 后所接的字段必须经过过滤(即:该字段必须使用),一般与 group by 连用  ④ 分组查询中,若一个字段在一个组内有多个结果,则后一个结果覆盖前一个结果
Demo_Null
2020/09/28
1.3K0
SQL中distinct的用法
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。 表A: 表B: 1.作用于单列 select d
学到老
2018/03/16
1.7K0
SQL中distinct的用法
SQL中distinct的用法
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。关键词 distinct用于返回唯一不同的值。
学到老
2019/02/14
2.3K0
select 查询基础
  如果不查询表中所有的列,尽量避免使用 SELECT *,因为它会进行全表扫描,不能有效利用索引,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络 IO 开销。
Demo_Null
2020/09/28
8040
select 查询基础
select基础查询
select查询 distinct取消重复 create table student( id int not null default 1, name varchar(20) not null default '', chinese float not null default 0.0, english float not null default 0.0, math float not null default 0.0 ) insert into student(id,name,chine
秋名山码神
2022/12/13
3360
select基础查询
mybatisplus select foreach in 的查询
高久峰
2023/07/02
4300
MySQL中update select多表联合查询更新
MySQL 中当需要使用其它表的数据来更新数据时,多表联合查询的数据进行更新,可通过 update select 语句将select查询结果执行update。
Petrochor
2023/06/18
2.4K0
理解dajngo ORM查询中select_related的作用
 两种查询方式: A. 不带select_related book = Book.objects.filter(pk=1) # 需要查询数据库 1 n = book.name # 需要查询数据库 2 a = book.age # 需要查询数据库 3 *总共向数据库发起三次查询。 B. 带select_related book = Book.objects.select_related().filter(pk=1) # 需要查询数据库 1 n = book.name # 直接从book对象中取 a = book.age # 直接从book对象中取 *总共向数据库发起一次查询。 也就是说使用select_related()方法一次性的把Book关联的对象都查询出来放入对象中,再次查询时就不需要再连接数据库,节省了后面查询数据库的次数和时间。
KEVINGUO_CN
2020/03/17
8550
select 高级查询之连接查询
  笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尔积(Cartesian product),又称直积,表示为 X×Y,第一个对象是 X 的成员而第二个对象是 Y 的所有可能有序对的其中一个成员。假设集合 A={a, b},集合 B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。
Demo_Null
2020/09/28
9180
select 高级查询之连接查询
MySQL使用distinct去掉查询结果重复的记录
使用 DISTINCT 关键字去掉重复记录具有较大的局限性。DISTINCT() 只能包含一个字段且查询结果也只返回该字段而非数据完整记录(如上例所示)。
用户7657330
2020/08/14
7.7K0

相似问题

postgres上的慢速select distinct查询

41

在postgres中优化大型"distinct“select

10

如何在mysql中加速此Select Distinct查询

10

带Postgres的varchar列上带有distinct/group的慢速查询

26

如何修复慢速distinct查询

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档