日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)

發布時間:2025/3/15 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

oracle下一條SQL語句的優化過程(比較詳細)

更新時間:2010年04月14日 23:56:49 ? 作者:

很簡單的一次調整,語句加了適當的索引后性能就有大幅的提升。當時看到這條語句的時候,第一感覺就是執行效率肯定低下。語句的功能是求某一客戶當天產品的總銷量。

原來的語句是這樣的:

select sum(sl0000) from xstfxps2 where

dhao00 in (

select dhao00 from xstfxps1 where trunc(ywrq00)=trunc(sysdate)

and khdm00='500000003913');

已用時間: 00: 02: 49.04

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (AGGREGATE)

2 1 NESTED LOOPS

3 2 TABLE ACCESS (FULL) OF 'XSTFXPS2'

4 2 TABLE ACCESS (BY INDEX ROWID) OF 'XSTFXPS1'

5 4 INDEX (UNIQUE SCAN) OF 'XSTFXPS1_PK' (UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

17355138 consistent gets

34141 physical reads

2912 redo size

198 bytes sent via SQL*Net to client

275 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

我們看到統計信息里面進行了17355138次邏輯讀,34141次物理IO,這是相當嚇人的數字。在執行計劃里面我們看到表XSTFXPS2來了一次全表掃描。

我們首先看一下這兩張表總的數據量:

SQL> select count(*) from xstfxps2;

COUNT(*)

----------

5585018

我們這里看到XSTFXPS2這張表有5585018條記錄。

SQL> select count(*) from xstfxps1;

COUNT(*)

----------

702121

兩張表的表結構如下所示:

SQL> desc xstfxps1

Name Type Nullable Default Comments

------ ------------ -------- ------- --------

DHAO00 NUMBER(8)

LHDH00 NUMBER(8) Y

FLDH00 NUMBER(8) Y

FPLB00 VARCHAR2(2) Y

YWRQ00 DATE Y

YWRY00 VARCHAR2(8) Y

SHRQ00 DATE Y

XSQRRQ DATE Y

XSQRRY VARCHAR2(8) Y

KHDM00 VARCHAR2(12)

XKZH00 VARCHAR2(12)

CKDM00 VARCHAR2(2) Y

THCKDM VARCHAR2(2) Y

XSFSDM VARCHAR2(2) Y

FXRYDM VARCHAR2(4) Y

SHRYDM VARCHAR2(4) Y

SHBJ00 VARCHAR2(1) 'N'

FXBJ00 VARCHAR2(1) 'N'

SKBJ00 VARCHAR2(2) Y

FKDM00 VARCHAR2(2) Y

SQL> desc xstfxps2

Name Type Nullable Default Comments

------ ------------ -------- ------- --------

DHAO00 NUMBER(8)

SPDM00 VARCHAR2(8)

DJIA00 NUMBER(7,2) 0

FXSL00 NUMBER Y 0

SL0000 NUMBER Y 0

THSL00 NUMBER Y 0

JE0000 NUMBER Y 0

SE0000 NUMBER Y

FPBBH0 VARCHAR2(11) Y

FPHAO0 VARCHAR2(10) Y

RBDH00 NUMBER(8) Y

其中XSTFXPS1的客戶訂單的表頭,保存訂單的客戶信息、訂貨日期等信息。XSTFXPS2是訂單的表體,詳細記錄了客戶訂單的商品、價格、數量等信息。

調整的第一步是把子查詢提取出來,再看語句的執行計劃。通常來說,如果語句能夠避免子查詢的使用,就盡量不用子查詢。因為子查詢的開銷是相當昂貴的。改寫后的語句如下:

select sum(sl0000)

from xstfxps2 a,(select dhao00 from xstfxps1 where trunc(ywrq00)=trunc(sysdate)

and khdm00='500000003913') b

where a.dhao00=b.dhao00;

已用時間: 00: 00: 03.05

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (AGGREGATE)

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'XSTFXPS2'

3 2 NESTED LOOPS

4 3 TABLE ACCESS (FULL) OF 'XSTFXPS1'

5 3 INDEX (RANGE SCAN) OF 'XSTFXPS2_PK' (UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

11974 consistent gets

225 physical reads

832 redo size

211 bytes sent via SQL*Net to client

275 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

我們可以看到邏輯IO由原來的17355138次下降到11974次,有了數量級的提升。執行時間也有原來將近3分鐘下降到現在的3秒多一些。很顯然性能有了大幅的提升。不過我們看到執行計劃里面表XSTFXPS1還是有一個全表掃描存在。通常來說我們應該盡量避免全表掃描的存在,尤其對于大表,應該建立合適的索引以避免FTS的產生。我們來看這兩張表的索引信息:

select index_name,column_name from dba_ind_columns where table_name like 'XSTFXPS%'

INDEX_NAME COLUMN_NAME

------------------------------ -----------------------------------

XSTFXPS1_PK DHAO00

XSTFXPS2_PK DHAO00

XSTFXPS2_PK SPDM00

我們看到這兩張表除了主鍵約束外都沒有建另外的索引。根據語句的查詢情況,我們建立了如下的復合索引:

create index idx_xstfxps1_khdm00_ywrq00 on xstfxps1(khdm00,ywrq00) tablespace indx;

為了使用索引,我們必須對原來的日期字段的條件進行一些調整。因為有個trunc()函數的存在,語句將不會使用到索引。我們只要明白trunc(ywrq00)=trunc(sysdate)事實上等同于ywrq00大于trunc(sysdate),小于trunc(sysdate+1)減去一秒,我們就有了比較好的辦法來處理

這個條件。最終改寫后的語句如下:

select sum(sl0000)

from xstfxps2 a, xstfxps1 b

where a.dhao00=b.dhao00

and b.khdm00='500000003913'

and b.ywrq00 between trunc(sysdate)

and trunc(sysdate)+1-1/(24*60*60);

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (AGGREGATE)

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'XSTFXPS2'

3 2 NESTED LOOPS

4 3 TABLE ACCESS (BY INDEX ROWID) OF 'XSTFXPS1'

5 4 INDEX (RANGE SCAN) OF 'IDX_XSTFXPS1_KHDM00_YWRQ00'

(NON-UNIQUE)

6 3 INDEX (RANGE SCAN) OF 'XSTFXPS2_PK' (UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

3 consistent gets

0 physical reads

0 redo size

210 bytes sent via SQL*Net to client

275 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

我們這時候看邏輯IO已經降為3次,語句的執行計劃也符合我們的調整目標,創建的索引產生了比較大的效果。這條語句的調整至此告一段落。

相關文章

第一步:創建一個表、第二步:創建一個自增序列以此提供調用函數、第三步:我們通過創建一個觸發器,使調用的方式更加簡單2013-11-11

當數據庫或PL/SQL在運行時發生錯誤時,一個異常被PL/SQL運行時引擎自動拋出,oracle有三種方式拋出異常,需要了解的朋友可以祥看本文2012-12-12

Oracle數據庫處理多媒體信息...2007-03-03

這篇文章主要介紹了CentOS命令行下裝oracle 12c的方法(命令行模式安裝),需要的朋友可以參考下2016-09-09

今天小編就為大家分享一篇關于oracle常用分析函數與聚合函數的用法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01

批量導入文本文件在Oracle數據庫操作中經常遇見,今天給大家介紹一種通過sqlldr批處理實現的方法,有需要的朋友們可以參考借鑒,下面來一起看看。2016-09-09

這篇文章主要介紹了Oracle 日志挖掘(LogMiner)使用,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07

本篇文章是對系統重裝后Oracle數據庫完全恢復的解決辦法進行了詳細的分析介紹,需要的朋友參考下2013-06-06

這篇文章主要介紹了Orcale 數據庫客戶端PL/SQL 中文亂碼的問題解決方法,需要的朋友可以參考下2014-05-05

這篇文章主要介紹了Oracle用decode函數或CASE-WHEN實現自定義排序功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

最新評論

總結

以上是生活随笔為你收集整理的oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。