SQL慢查询在Greenplum/Deepgreen中的定位方法

在生产过程中,有的SQL查询往往会变得越来越慢,这时候,我们该怎么办呢?首当其冲的,我们可以通过查询计划来定位问题,今天就来谈谈如何在查询计划中定位这些慢查询产生的原因。

1.查询计划中是否有操作耗时特别的长?

当我们分析查询计划时,是否有一个异常操作消耗了大部分的查询时间?比如,在执行索引扫描时,时间比预期的要长很多,这时候我们基本可以判断此索引可能已经超期了,需要重建。

2.查询计划预估的时间和真实的时间接近吗?

我们通过运行 EXPLAIN ANALYZE ,查看执行计划预估的返回行数与实际返回的行数是否接近,如果出入很大,说明统计信息是有问题的,我们需要对相关表/列收集更多的统计信息。

3.选择语句中的限定条件是否生效更早?

在执行计划中,选择性限定条件应该更早的应用,目的是让更少的数据返回到上层操作中。如果查询在选择性限定条件应用后表现并不好,返回的消耗依然很大,我们可以收集相关列的统计信息再看看是否会提高性能;另外,还可以通过调整SQL语句中不合理的 WHERE 条件来提高性能。

4.查询计划是否选择了最佳的JOIN顺序?

当我们的查询里面有很多连接操作(JOIN)时,要确保执行计划选择了一个最优连接顺序。拥有大量返回数据的连接应该尽早完成,以保证我们为上层操作返回更少的行。如果执行计划没有选择最佳的连接顺序,我们可以设置参数 join_collapse_limit=1 ,然后在SQL语句中使用明确的JOIN语法强迫执行计划按照特定的执行顺序执行。另外,我们可以收集相关列的统计信息再看看是否会提高性能。

5.查询计划是否有选择性的扫描分区表?

如果我们使用查询中涉及到了分区表数据查询,那么查询计划是否直接定位到扫描满足条件的分区,而不是扫描整张表。

6.查询计划是否适当的选择Hash Aggregate和Hash Join操作?

Hash操作比其他类型的聚合或者连接操作要快很多,行数据的比较和分类操作是在内存中进行,而不是通过读写磁盘完成。为了能够使用Hash操作,我们必须保证有足够的 work memory 可以容纳查询计划返回的行数据,所以我们可以通过尝试增加work memory来提高查询性能。通过运行EXPLAIN ANALYZE命令,这样可以看出哪些计划会有数据使用到磁盘,需要多少额外的work memory等,为work memory的调整提供参考。例如:

Work_mem used: 23430K bytes avg, 23430K bytes max (seg0).
Work_mem wanted: 33649K bytes avg, 33649K bytes max (seg0) to lessen workfile I/O affecting 2 workers.
时间: 2024-12-02 20:57:51

SQL慢查询在Greenplum/Deepgreen中的定位方法的相关文章

SQL同时更新两张表中关联数据方法

文章标题比较难理解,先让我举个例子,解释一下要实现的操作. 有两张表,t_statistics.t_add,如下 t_statistics数据 t_add数据 现在需要将 t_statistics 表 addtotal 字段的值减去 t_add 表 total 字段的值,条件是两者有相同的 id,所以正确的操作之后,t_add 记录无变化,t_statistics 记录如下 测试的数据库为Oracle(Oracle Database 10g Enterprise Edition Release

T-SQL命令在SQL Server查询中的运用

server 首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的. 从表面上看,查询性能的调节是一件十分简单的事.从本质上讲,我们希望查询的运行速度能够尽可能地快,无论是将查询运行的时间从10分钟缩减为1分钟,还是将运行的时间从2秒钟缩短为1秒种,我们最终的目标都是减少运

SQL数据查询语句

查询是SQL语言的核心,SQL语言只提供唯一一个用于数据库查询的语句,即SELECT语句.用于表达SQL查询的SELECT语句是功能最强也是最复杂的SQL语句,它提供了很多选项和使用方法.SELECT语句的命令格式如下: SELECT查询语句是由七个子句构成,其中SELECT和FROM子句是一个完整SELECT查询语句必须要有的,其它的子句可以根据具体需要任选.上述的每个子句功能说明如下: (1)SELECT子句 列出所有要求SELECT语句进行检索的数据项,这些项可能取自数据库中关系表的列,也

sql子查询中列别名在主查询中无效

问题描述 sql子查询中列别名在主查询中无效 CREATE PROCEDURE dbo.query_test( @i_begin_time varchar(128) IN, /* 开始时间 / @i_end_time varchar(128) IN, / 结束时间 / @i_bussiness_tpe varchar(512) IN, / 类型 ) as declare @v_sql varchar(16384)/* 定义 需要执行的sql / declare @Rtime varchar(12

不用SQL语句查询DataTable中的数据

数据|语句 在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他改动),在这些情况下,要查询DataTable中的数据,强大的SQL语言就派不上用场了. 有些.NET程序员采取在数据库中建立临时表等方法来解决这类查询问题.而我觉得这种方法不可行,其实只要用.NET类库中提供的DataView类的强大功能(主要是用它的RowFilter属性),就能方便

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以

vb6 sql instr-vb6环境下,无法使用instr、charindex查询数据库指定字段中特定字符的位置。

问题描述 vb6环境下,无法使用instr.charindex查询数据库指定字段中特定字符的位置. 创建视图,需要查询数据库指定字段特定字符,代码以下: quetn = "create view que_ta AS select max(que_info.test_id) as test_id,sum(case when instr(1, que_category.cate_name, '选择题')>0 then 1 end) as 选择题," & _ "sum

数据-订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品)

问题描述 订单列表查询SQL,查询出订单的数量和订单详细信息(包括订单中的所有商品) 一对多关系的数据比如订单和订单商品,要一起显示订单和其商品信息,怎么样查询最优 就像淘宝一样,每个订单(order表)对应多个商品(order_item表)时,查询订单信息必须把该订单的商品主要信息也显示出来. 解决方案 使用连接进行查询.有订单肯定就有商品了 涉及到三张表订单表订单商品表商品表select * from (select 订单.*订单商品.* from 订单 left join 订单商品 on

sql-如何用SQL语句查询Table表中的ID1中的O1,O2,O3为1 的数目

问题描述 如何用SQL语句查询Table表中的ID1中的O1,O2,O3为1 的数目 如何用SQL语句查询Table表中的ID1中的O1,O2,O3为1 的数目 Table ID O1 O2 O3 ID1 1 1 0 ID2 1 0 1 ID3 0 1 1 解决方案 select COUNT(*), (select COUNT(*) FROM a where O1='1') AS COUNTO1,(SELECT COUNT(*) FROM A WHERE O2="1") AS COUN