Sql最佳化(十一) 避免對資料的重複掃描(1)
一、 用CASE EXPRESSION將多句查詢組合在一起
SELECT COUNT (*)
FROM employees
WHERE salary < 2000;
SELECT COUNT (*)
FROM employees
WHERE salary BETWEEN 2000 AND 4000;
SELECT COUNT (*)
FROM employees
WHERE salary>4000;
改寫成
SELECT COUNT (CASE WHEN salary < 2000
THEN 1 ELSE null END) count1,
COUNT (CASE WHEN salary BETWEEN 2001 AND 4000
THEN 1 ELSE null END) count2,
COUNT (CASE WHEN salary > 4000
THEN 1 ELSE null END) count3
FROM employees;
二、 DML with returning clause
有時候DML操作後緊跟著對這些行的select操作。DML with returning clause將insert/update/delete操作和select操作合併在一起,避免了重複掃描。
例子:
UPDATE employees
SET job_id ='SA_MAN', salary = salary + 1000, department_id = 140
WHERE last_name = 'Jones'
RETURNING salary*0.25, last_name, department_id
INTO :bnd1, :bnd2, :bnd3;
如果修改的是多行記錄,則returning clause返回到陣列變數中。
三、 multitable insert
一句sql包含多條insert的寫法。相比於多句insert語句,前者只需掃描源table一次,而後者要掃描多次。這在資料量很大的情況下效能差別非常大。Multitable insert可分為conditional(有條件的),unconditional,insert all(執行所有insert),insert first(只執行第一個滿足條件的insert)等不同用法
有時候表裡面一行記錄包含了多類資訊,如某一話單表中包含了一個裝置多種話務型別的費用,這種表我們稱為非關係表。下面例子應用oracle multitable insert技術將非關係錶轉換為關係型表。
create table test_table (id1 number,val_1 number,id2 number,val_2 number); --非關係表
insert into test_table values(1,101,1,202);
insert into test_table values(6,666,7,777);
--基表
create table id_type (a number);
insert into id_type values(1);
insert into id_type values(2);
insert into id_type values(3);
--目標表(將非關係錶轉換為兩張關係表)
create table id1_table (id number,val number);
create table id2_table (id number,val number);
--普通方法,用多條insert語句
insert INTO id1_table select id1,val1 from test_table;
insert INTO id2_table select id2,val2 from test_table;
--用multiple insert,將非關係型表資料一條記錄拆成兩條,分別插入兩張目標表
insert all
INTO id1_table values(id1,val_1)
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;
--有判斷條件的multiple insert
insert all
WHEN id1 =1 then
INTO id1_table values(id1,val_1)
when ID2 =5 then
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;
--multiple insert還有更復雜的寫法,判斷條件可以用子查詢
insert all
WHEN id1 in(select a from id_type) then
INTO id1_table values(id1,val_1)
when ID2 in(select a from id_type) then
INTO id2_table values(id2,val_2)
select id1,val_1,id2,val_2 from test_table;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2124916/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sql最佳化(十二)避免資料重複掃描(2) 使用with as子句提高效能SQL
- 掃描重複和類似的 CSSCSS
- mysql避免插入重複資料MySql
- 理解資料庫掃描方法-利用掃描方法對資料儲存進行優化資料庫優化
- [zt] SQL存取Oracle當中掃描資料的方法SQLOracle
- 使用索引快速全掃描(Index FFS)避免全表掃描的若干場景索引Index
- oracle優化:避免全表掃描Oracle優化
- Oracle中存取資料掃描Table及索引的方式(全表掃描,索引掃描等)Oracle索引
- T-SQL 刪除重複資料SQLSQL
- 如何避免重複性地做資料維護頁面?
- 高併發下如何避免產生重複資料?
- Oracle中刪除重複資料的SqlOracleSQL
- SQL 掃描引數(SARG)SQL
- 24_Oracle資料庫全表掃描詳解(四)_全表掃描生產最佳化案例三則Oracle資料庫
- 查詢全表掃描的sqlSQL
- SQL Server 2005資料頁讀取--高階掃描SQLServer
- delete 刪除資料 全表掃描還是掃描所有塊的測試delete
- sql查詢一張表的重複資料SQL
- 存取Oracle當中掃描資料的方法Oracle
- 在MySQL資料庫中,這4種方式可以避免重複的插入資料!MySql資料庫
- MS SQL Server 刪除重複行資料SQLServer
- 刪除重複資料的三種sql寫法SQL
- pl/sql原始碼掃描sql(10g)SQL原始碼
- @dbsnake-用合適的函式索引來避免看似無法避免的全表掃描函式索引
- Go~避免重複造輪子Go
- java 表單避免重複提交?Java
- 掃描技術和掃描工具
- SQL Server中刪除重複資料的幾個方法SQLServer
- 一個過濾重複資料的sql語句(轉)SQL
- 三張圖快速掃描中國最新GDP資料
- 對上次的自動掃描進行改造
- SQL Server之旅(2):理解萬惡的表掃描SQLServer
- 一條全表掃描sql語句的分析SQL
- MySQL中的全表掃描和索引樹掃描MySql索引
- javascript避免dom事件重複觸發JavaScript事件
- React 效能優化 - 避免重複渲染React優化
- 如何避免任務重複執行
- jFinal避免表單重複提交