oraclesql並集
⑴ 如何對Oracle sql 進行性能優化的調整
在SQL查詢中,為了提高查詢的效率,我們常常採取一些措施對查詢語句進行SQL性能優化。本文我們總結了一些優化措施,接下來我們就一一介紹。
1.查詢的模糊匹配
盡量避免在一個復雜查詢裡面使用 LIKE '%parm1%'—— 紅色標識位置的百分號會導致相關列的索引無法使用,最好不要用。
解決辦法:
其實只需要對該腳本略做改進,查詢速度便會提高近百倍。改進方法如下:
a、修改前台程序——把查詢條件的供應商名稱一欄由原來的文本輸入改為下拉列表,用戶模糊輸入供應商名稱時,直接在前台就幫忙定位到具體的供應商,這樣在調用後台程序時,這列就可以直接用等於來關聯了。
b、直接修改後台——根據輸入條件,先查出符合條件的供應商,並把相關記錄保存在一個臨時表裡頭,然後再用臨時表去做復雜關聯。
2.索引問題
在做性能跟蹤分析過程中,經常發現有不少後台程序的性能問題是因為缺少合適索引造成的,有些表甚至一個索引都沒有。這種情況往往都是因為在設計表時,沒去定義索引,而開發初期,由於表記錄很少,索引創建與否,可能對性能沒啥影響,開發人員因此也未多加重視。然一旦程序發布到生產環境,隨著時間的推移,表記錄越來越多。這時缺少索引,對性能的影響便會越來越大了。
法則:不要在建立的索引的數據列上進行下列操作:
避免對索引欄位進行計算操作
避免在索引欄位上使用not,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現數據類型轉換
避免在索引欄位上使用函數
避免建立索引的列中使用空值
3.復雜操作
部分UPDATE、SELECT 語句 寫得很復雜(經常嵌套多級子查詢)——可以考慮適當拆成幾步,先生成一些臨時數據表,再進行關聯操作。
4.update
同一個表的修改在一個過程里出現好幾十次,如:
update table1 set col1=... where col2=...; update table1 set col1=... where col2=... ...
這類腳本其實可以很簡單就整合在一個UPDATE語句來完成(前些時候在協助xxx項目做性能問題分析時就發現存在這種情況)
5.在可以使用UNION ALL的語句里,使用了UNION
UNION 因為會將各查詢子集的記錄做比較,故比起UNION ALL ,通常速度都會慢上許多。一般來說,如果使用UNION ALL能滿足要求的話,務必使用UNION ALL。還有一種情況大家可能會忽略掉,就是雖然要求幾個子集的並集需要過濾掉重復記錄,但由於腳本的特殊性,不可能存在重復記錄,這時便應該使用 UNION ALL,如xx模塊的某個查詢程序就曾經存在這種情況,見,由於語句的特殊性,在這個腳本中幾個子集的記錄絕對不可能重復,故可以改用UNION ALL)。
6.在WHERE 語句中,盡量避免對索引欄位進行計算操作
這個常識相信絕大部分開發人員都應該知道,但仍有不少人這么使用,我想其中一個最主要的原因可能是為了編寫寫簡單而損害了性能,那就不可取了。9月份在對XX系統做性能分析時發現,有大量的後台程序存在類似用法,如:where trunc(create_date)=trunc(:date1),雖然已對create_date 欄位建了索引,但由於加了TRUNC,使得索引無法用上。此處正確的寫法應該是where create_date>=trunc(:date1) and create_date< pre=""><>或者是where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)。
注意:因between 的范圍是個閉區間(greater than or equal to low value and less than or equal to high value.),故嚴格意義上應該再減去一個趨於0的小數,這里暫且設置成減去1秒(1/(24*60*60)),如果不要求這么精確的話,可以略掉這步。
7.對Where 語句的法則
7.1 避免在WHERE子句中使用in,not in,or 或者having。
可以使用 exist 和not exist代替in和not in。
可以使用表鏈接代替 exist。Having可以用where代替,如果無法代替可以分兩步處理。
例子
SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN (SELECT CUSTOMER_NAME FROM CUSTOMER)
優化
SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist (SELECT CUSTOMER_NAME FROM CUSTOMER)
7.2 不要以字元格式聲明數字,要以數字格式聲明字元值。(日期同樣)否則會使索引無效,產生全表掃描。
例子使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
--不要使用:
SELECT emp.ename, emp.job FROM emp WHERE emp.empno = '7369'
8.對Select語句的法則
在應用程序、包和過程中限制使用select * from table這種方式。看下面例子
--使用
SELECT empno,ename,category FROM emp WHERE empno = '7369'
--而不要使用
SELECT * FROM emp WHERE empno = '7369'
9. 排序
避免使用耗費資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎 執行,耗費資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序。
10.臨時表
慎重使用臨時表可以極大的提高系統性能。
關於SQL性能優化的知識就介紹到這里了
⑵ oracle中,多個結果集union後保持各自原有排序,是否可行
使用Union All就是能實現
Oracle中Union與Union All的區別
如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。union(或稱為聯合)的作用是將多個結果合並在一起顯示出來。
union和union all的區別是,union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來,不管是不是重復。
Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;
Union All:對兩個結果集進行並集操作,包括重復行,不進行排序;
Intersect:對兩個結果集進行交集操作,不包括重復行,同時進行默認規則的排序;
Minus:對兩個結果集進行差操作,不包括重復行,同時進行默認規則的排序。
可以在最後一個結果集中指定Order by子句改變排序方式。
有關union和union all關鍵字需要注意的問題是:
union 和 union all都可以將多個結果集合並,而不僅僅是兩個,你可以將多個結果集串起來。
使用union和union all必須保證各個select 集合的結果有相同個數的列,並且每個列的類型是一樣的。但列名則不一定需要相同,oracle會將第一個結果的列名作為結果集的列名。
⑶ Oracle 10g如何實現高級查詢
許多人愁不會Oracle 10g的高級查詢,其實也是比較簡單的。在查詢數據時,為了獲取完整的信息就要將多個表連接起來,這也是關系資料庫的一個重要特性---表之間存在的關系。這種關系可以將表的數據聯系起來。多表查詢就是根據這種關系,實現從多個表中獲取數據還原信息。下面這個圖就是我將要操作的表結構。
工具/材料
電腦
Oracle 10g
- 01
基本連接查詢
在簡單查詢中我們一般只使用了from字句的一個表,然而在關系資料庫中,表與表之間往往是存在關系的,這就是要求從多個表中檢索數據,以輸出更有意義的結果。最簡單的連接方式就是在select語句中,通過from子句使用多個表,並用逗號將不同的基本表隔開。下面語句將商品信息表和供應商信息表連接起來,查詢其中的商品名稱,產地,供應商名稱。 - 02
但此時結果顯示該查詢語句共顯示了200行記錄,這顯然是錯誤的。因為僅僅通過select和from子句連接那麼查詢結果將是一個通過笛卡兒積生成的表,包含大量無意義的信息。而where語句可以有效避免笛卡兒積的出現。只有當兩個表具有相同匹配的列時才返回結果集。例如下面語句通過在where子句中使用連接條件,實現了每件商品名稱,產地,供應商名稱信息。
- 03
但也要注意一個問題如果想要查詢「供應商編號」應該怎麼處理,因為兩個表中都有「供應商編號」,所以應該查詢的時候限定一下,說明究竟是哪一個表中的。
- 04
join連接查詢
join用於連接兩個不同的表,on用於給出這兩個表之間的連接條件。如果進一步限制查詢范圍,可以在後面添加where語句,下面示例使用從商品信息表和供應商信息表查詢單價大於1200元的商品信息。 - 05
並且join連接也可以實現兩個以上的表查詢,寫語句的時候一個join對應一個on,看下面的例子。
- 06
自然連接查詢
其實自然連接查詢(natural join)就是更加方便的join連接查詢,自然連接不必指定任何同等連接條件,系統將自動判斷出具有相同名稱的列然後形成匹配,但注意自然連接是根據兩個表中同名的列而進行連接的,當列不同名時,自然連接將失去意義。 - 07
集合操作查詢
集合操作就是將兩個或多個SQL查詢結合構成符合查詢,集合操作符有union(並集)、intersect(交集)、minus(差集),現在以union為例,union查詢必須從每個表中讀取相同的列。 - 08
子查詢
子查詢和連接查詢一樣提供了使用單個查詢訪問多個表中的數據的方法,使用in關鍵字,意思是在in後面的集合中查詢我們需要的,即in後面是限定條件。
特別提示
注意在Oracle 10g中的標點符號是英文狀態下的
⑷ Oracle查詢2張表差集、交集、並集
select 欄位1 from 表1 minus select 欄位1 from 表2
select 欄位1 from 表1 intersect select 欄位1 from 表2
select 欄位1 from 表1 union all select 欄位1 from 表2
⑸ 什麼是 SQL Developer
Oracle SQL Developer 是一個 免費的圖形化資料庫開發工具。使用 SQL Developer,您可以瀏覽資料庫對象、運行 SQL 語句和 SQL 腳本,並且還可以編輯和調試 PL/SQL 語句。您還可以運行所提供的任何數量的報表,以及創建和保存您自己的報表。SQL Developer 可以提高工作效率並簡化資料庫開發任務。
SQL Developer 可以連接到任何 9.2.0.1 版和更高版本的 Oracle 資料庫,並且可以在 Windows、Linux 和 Mac OSX 上運行。
SQL Developer 包括了移植工作台,它是一個重新開發並集成的工具,擴展了原有 Oracle 移植工作台的功能和可用性。通過與 SQL Developer 緊密集成,使用戶在一個地方就可以瀏覽第三方資料庫中的資料庫對象和數據,以及將這些資料庫移植到 Oracle。
Oracle SQL Developer 與 Oracle APEX 集成,使您可以瀏覽應用程序和執行其他 Application Express 活動。通過 Oracle SQL Developer,您可以瀏覽、導出和導入、刪除或部署應用程序。有許多 Application Express 報表可供選擇,您可以創建自己的定製報表。
最新版本的 Oracle SQL Developer 包括為版本控制和源代碼控制系統 CVS(並發版本控制系統)以及 Subversion 提供集成的支持。支持版本控制是通過一個可以瀏覽和讀取文件系統中存儲的文件的文件瀏覽器實現的。您可以在 SQL Developer 中打開並編輯這些文件。除了 SQL Developer 的這些主要新增特性之外,1.5 版還包括了許多更新的特性,如 SQL 格式化、模式比較、復制和導出向導,以及對 Sybase 的移植支持。Times Ten 支持也集成在該產品中。還提供了所有 SQL Developer 1.5 新增功能的列表。
http://www.oracle.com/technetwork/cn/developer-tools/sql-developer/what-is-sqldev-094441-zhs.html
⑹ oracle中不用union如何獲取並集的結果
oracle不同表之間使用union合並
有關聯關系的表,可以使用其他方式,沒有關聯關系,一定使用union
跨過oracle,使用程序查詢多次,然後放到一個集合里,這樣也可以達到同樣的效果
⑺ sql中 union 和union all的區別
union和union all的區別是
union會自動壓縮多個結果集合中的重復結果
union all則將所有的結果全部顯示出來,不管是不是重復。
Union:對兩個結果集進行並集操作,不包括重復行,同時進行默認規則的排序;
UNION在進行表鏈接後會篩選掉重復的記錄,所以在表鏈接後會對所產生的結果集進行排序運算,刪除重復的記錄再返回結果。實際大部分應用中是不會產生重復的記錄,最常見的是過程表與歷史表UNION
union All:對兩個結果集進行並集操作,包括重復行,不進行排序;
如果返回的兩個結果集中有重復的數據,那麼返回的結果集就會包含重復的數據了。
Intersect:對兩個結果集進行交集操作,不包括重復行,同時進行默認規則的排序;
Minus:對兩個結果集進行差操作,不包括重復行,同時進行默認規則的排序。
可以在最後一個結果集中指定Order by子句改變排序方式。
例如:
select employee_id,job_id from employees
union
select employee_id,job_id from job_history
以上將兩個表的結果聯合在一起。這兩個例子會將兩個select語句的結果中的重復值進行壓縮,也就是結果的數據並不是兩條結果的條數的和。如果希望即使重復的結果顯示出來可以使用union all,例如:
2.在oracle的scott用戶中有表emp
select * from emp where deptno >= 20
union all
select * from emp where deptno <= 30
這里的結果就有很多重復值了。
有關union和union all關鍵字需要注意的問題是:
union 和 union all都可以將多個結果集合並,而不僅僅是兩個,你可以將多個結果集串起來。
使用union和union all必須保證各個select 集合的結果有相同個數的列,並且每個列的類型是一樣的。但列名則不一定需要相同,oracle會將第一個結果的列名作為結果集的列名。例如下面是一個例子:
select empno,ename from emp
union
select deptno,dname from dept
沒有必要在每一個select結果集中使用order by子句來進行排序,可以在最後使用一條order by來對整個結果進行排序。例如:
select empno,ename from emp
union
select deptno,dname from dept
⑻ ORACLE SQL語句查詢一個欄位在另一表欄位中有兩條或以上 的數據
1、創建兩張測試表,
create table test_student(student_id varchar2(20), student_name varchar2(20));
create table test_class(student_id varchar2(20), class_id varchar2(20));
⑼ SQL如何將同一記錄的多個欄位的值合並到一個字元串中,然後再跟別的SQL語句並集
可以用連接符號 || 或者&
我的是Oracle || 可以
select date||depart||name
from A
union all
select date||note from B
⑽ 資料庫中 查詢結果的 並集,交集是怎麼寫的啊,用的什麼關鍵字
A 並 B 去掉重復記錄----union
select empno, ename ,salary ,deptno from employee_ccy where deptno=10
union
select empno, ename ,salary ,deptno from employee_ccy where salary>100;
--union all 不排序,不去重復
select empno, ename ,salary ,deptno from employee_ccy where deptno=10 union all
select empno, ename ,salary ,deptno from employee_ccy where salary>100;
---交集-----intersect
select empno, ename ,salary ,deptno from employee_ccy where deptno=10
intersect
select empno, ename ,salary ,deptno from employee_ccy where salary>100;
--差集--------minus
select empno, ename ,salary ,deptno from employee_ccy where deptno=10
minus
select empno, ename ,salary ,deptno from employee_ccy where salary>100;
-------------用兩個結果集的差集 ,獲得
select deptno,dname ,location from department_ccy where deptno in(select deptno from department_ccy
minus
select distinct deptno from employee_ccy );
希望對你有幫助