首页 > 数据库 >如何在Oracle、MySQL、Postgresql中查找全表扫描SQL

如何在Oracle、MySQL、Postgresql中查找全表扫描SQL

时间:2024-07-02 13:00:19浏览次数:3  
标签:tables full Postgresql seq scan time 全表 SQL table

How to find full table scan SQL in Oracle,MySQL,Postgresql ?

Queries that do “full table scan” are the ones that don’t use indexes. However, it is more suitable to use a full table scan for small tables, and it will not cause performance problems. Or when the data on the large table is seriously skewed and a large proportion of data records need to be returned, a full table scan will also be better than an index scan.

进行“全表扫描”的查询是不使用索引的查询。但是,对小表使用全表扫描更合适,它不会导致性能问题。或者当大型表上的数据严重倾斜并且需要返回大部分数据记录时,全表扫描也将优于索引扫描。

ORACLE

-- prompt Top 50 Full table scan caused by implicit conversion:
select * from
(
select PARSING_SCHEMA_NAME,s.sql_id, s.sql_text,s.EXECUTIONS,
	fetches,
	rows_processed,
  rows_processed/nullif(fetches,0) rows_per_fetch,
	ROUND(cpu_time/NULLIF(executions,0)/1000000,3)     cpu_sec_exec,
	ROUND(elapsed_time/NULLIF(executions,0)/1000000,3) ela_sec_exec,
	ROUND(buffer_gets/NULLIF(executions,0),3)  lios_per_exec,
	ROUND(disk_reads/NULLIF(executions,0),3)   pios_per_exec,
	ROUND(cpu_time/1000000,3) total_cpu_sec,
	ROUND(elapsed_time/1000000,3) total_ela_sec,
  user_io_wait_time/1000000 total_iowait_sec,
	buffer_gets total_LIOS,
	disk_reads total_pios
  from v$sqlarea s
 where s.sql_id in
       (select p.sql_id
          from v$sql_plan p
         where p.OPERATION = 'TABLE ACCESS'
           and p.OPTIONS = 'FULL'
           and p.FILTER_PREDICATES like '%INTERNAL_FUNCTION%')
		   and PARSING_SCHEMA_NAME not in('SYS')
		   order by elapsed_time desc)
		   where rownum<=50;

COLUMN large_table_scans FORMAT 999,999,999,999,999 HEADING 'Large Table Scans' ENTMAP off
COLUMN small_table_scans FORMAT 999,999,999,999,999 HEADING 'Small Table Scans' ENTMAP off
COLUMN pct_large_scans HEADING 'Pct. Large Scans' ENTMAP off

SELECT
a.value large_table_scans
, b.value small_table_scans
, '' || ROUND(100*a.value/DECODE((a.value+b.value),0,1,(a.value+b.value)),2) || '%
' pct_large_scans
FROM
v$sysstat a
, v$sysstat b
WHERE
a.name = 'table scans (long tables)'
AND b.name = 'table scans (short tables)';

MySQL

Try to log them in the slow query log using this option log_queries_not_using_indexes, Be careful though that small tables that have frequent queries running against will fill your slow query log files. You may want to enable this option for limited amount of time. To reduce this chance, you may set min_examined_row_limit variable to a reasonable value, depending on your small tables.

尝试使用此选项“log_queries_not_using_indexes”将它们记录在慢速查询日志中,但是要小心,频繁运行查询的小表会填满慢速查询日志文件。您可能希望在有限的时间内启用此选项。为了减少这种可能性,您可以根据您的小表,将’ min_examined_row_limit '变量设置为一个合理的值。

You can use view with full query

select query, exec_count
from sys.x$statements_with_full_table_scans

PostgreSQL

First of all, PostgreSQL itself does not have system dictionary cascading SQL execution plan information like Oracle, but it can be recorded in the database log file with the auto_explain Extention. or There is a view pg_stat_user_tables with table-level indexing or full table scanning fields, you can refer to.

首先,PostgreSQL本身不像Oracle那样有系统字典级联SQL执行计划信息,但是可以用auto_explain扩展记录在数据库日志文件中。或者有带表级索引或者全表扫描字段的视图pg_stat_user_tables,可以参考。

-- The ratio of index scans
SELECT 
  relname table_name, 
  idx_scan index_scan,
  seq_scan table_scan,
   100*idx_scan / (seq_scan + idx_scan) index_usage, 
  n_live_tup rows_in_table
FROM 
  pg_stat_user_tables
WHERE 
    seq_scan + idx_scan > 0 and 100 * idx_scan / (seq_scan + idx_scan) < 99 and n_live_tup > 70000
ORDER BY 
  4 DESC;

select seq_scan, n_live_tup, relname
from pg_stat_user_tables
order by seq_scan desc
limit 10;

标签:tables,full,Postgresql,seq,scan,time,全表,SQL,table
From: https://blog.csdn.net/weixin_tank88921/article/details/140123707

相关文章

  • MySQL 加锁案例--基于《MySQL 45 讲》的第 21 讲的总结
    前言丁奇大佬的《MySQL45讲》可以说是每个DBAboy的必读经典,但教材中,大佬用的毕竟是5.7版本,日常用 8.0的我还是得持怀疑的态度阅读文章。毕竟实践是检验真理的唯一标准。因此对21讲做了个总结(幸好8.0和5.7有出入,不然白搞了)。案例总结+验证+一点点个人思考秉承......
  • ubuntu安装mysql后修改密码
    一直没有接触ubuntu系统,今天在ubuntu上安装mysql,安装完成后发现修改密码不生效,拆腾好久。。。 切记使用root用户安装,要不然权限不够 sudoaptupdate#更新系统软件包列表sudoaptinstallmysql-server#安装MySQLServer#在安装过程中,系统可能要求设置root用户......
  • 基于Java+MySQL+SSM彩妆小样售卖商城
    系列文章目录项目介绍开发环境系统实现论文参考项目介绍随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于彩妆小样售卖商城当然也不能排除在外,随着网络技术的不断成熟,带动了彩妆小样售卖商城,它彻底改变了过去传统的管理方式,不......
  • 基于Java+MySQL+SSM斗车交易系统
    系列文章目录项目介绍系统环境系统实现论文参考项目介绍21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高......
  • 基于Java+MySQL+SSM校园教务系统的设计与实现
    系列文章目录项目介绍开发环境系统实现论文参考项目介绍随着信息技术的迅猛发展,教育信息化已成为推动教育现代化、提高教育质量的重要手段。特别是在高等教育领域,学生数量持续增长,课程种类日益丰富,教务管理工作日趋复杂,传统的纸质记录和人工管理方式已难以满足日益增长......
  • 基于Java+MySQL+SSM舞蹈网站
    系列文章目录项目介绍开发环境系统实现论文参考项目介绍舞蹈作为一种艺术形式,不仅具有娱乐性,还有助于身心健康的发展。近年来,随着人们生活水平的提高和文化素养的增强,舞蹈文化逐渐普及并受到广大民众的喜爱。然而,传统的舞蹈教学方式和宣传渠道存在一定的局限性,难以满足......
  • 腾讯云服务器上安装mysql,本地windows机器通过heidisql客户端连接引发的问题
    一、问题描述1.腾讯云服务器上docker方式安装完mysql后,windows电脑上heidisql客户端不用密码就能连接2.修改docker里mysql密码,heidisql客户端就连接不上了二、问题排查1.不用密码就能连接是因为mysql的配置文件中有设置skip-grant-tables参数(1)dockerinspectsmysql查看挂......
  • OceanBase获取执行效率下降SQL
    移动现场有一个原厂写的通过gv$plan_cache_plan_stat视图来查询执行计划突变的SQL,通过比较gv$plan_cache_plan_stat视图记录的不同执行计划来判断是否执行计划发生突变而导致的执行计划变差,但是在gv$plan_cache_plan_stat视图中只有一个执行计划的时候,且这个执行计划的效率低......
  • PHP8.0正常,PHP7.2,PHP7.3报错Connection failed: SQLSTATE[HY000] [2054] The server
    构建网站API接口的时候,使用了PDO进行数据库连接,原文如下 测试后发现,PHP8.0版本下,可以正常输出,但是PHP7.2和7.3则会报错:Connectionfailed:SQLSTATE[HY000][2054]Theserverrequestedauthenticationmethodunknowntotheclient经查验,发现因为所用的PHP7.2和7.3版本不支......
  • 2.FineReport连接MySQL数据库
    1.服务器–定义数据连接2.添加JDBC3.配置连接4.添加数据库查询5.添加查询语句并预览结果......