當前位置:首頁 » 編程語言 » sql執行順序o
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql執行順序o

發布時間: 2022-05-13 19:07:36

❶ 程序中執行循環執行sql插入,但數據進入資料庫的順序確不一樣

你首先確定你每次讀入的是否為完整一行(這個你連續看兩行就應該能確定),其次再確認一下接收的串和中間變數是否及時清空

看你的程序應該沒有問題,你檢查一下txt文件中是否有亂碼等不能顯示的字元,如果你有unix環境就拿到那個下面用vi看一下,如果沒有用ultraedit或者editplus都可以,不過這兩個打開你這個20w行的文件可能會比較困難,要不你就改一下你現在這個程序,判斷一下ascii碼

❷ sql執行的作業是串列還是並行的

oracle 10g的DBMS_XPLAN包中display_cursor函數不同於display函數,display_cursor用於顯示SQL語句的真實的執行計劃,在大多數情況下,
顯示真實的執行計劃有助於更好的分析SQL語句的全過程,尤其是運行此SQL語句實時的I/O開銷。通過對比預估的I/O與真實的I/O開銷來判斷
SQL語句所存在問題,如缺少統計信息,SQL語句執行的次數,根據實際中間結果集的大小來選擇合適的連接方式等。本文僅僅講述
display_cursor函數的使用。

一、display_cursor函數用法
1、display_cursor函數語法

DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');

2、display_cursor函數參數描述
sql_id
指定位於庫緩存執行計劃中SQL語句的父游標。默認值為null。當使用默認值時當前會話的最後一條SQL語句的執行計劃將被返回
可以通過查詢V$SQL 或V$SQLAREA的SQL_ID列來獲得SQL語句的SQL_ID。
cursor_child_no
指定父游標下子游標的序號。即指定被返回執行計劃的SQL語句的子游標。默認值為0。如果為null,則sql_id所指父游標下所有子游標
的執行計劃都將被返回。
format
控制SQL語句執行計劃的輸出部分,即哪些可以顯示哪些不顯示。使用與display函數的format參數與修飾符在這里同樣適用。
除此之外當在開啟statistics_level=all時或使用gather_plan_statistics提示可以獲得執行計劃中實時的統計信息
有關詳細的format格式描述請參考:dbms_xplan之display函數的使用 中format參數的描述

下面給出啟用統計信息時format新增的修飾符
iostats 控制I/O統計的顯示
last 默認,顯示所有執行計算過的統計。如果指定該值,則只顯示最後一次執行的統計信息
memstats 控制pga相關統計的顯示
allstats 此為iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同於iostats last。只能用於oracle 10g R1
run_stats_tot 等同於iostats。只能用於oracle 10g R1

抓一個最近一小時最消耗IO的SQL:
SELECT sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
WHERE ash.sample_time > SYSDATE - 1 / 24
AND ash.session_state = 'WAITING'
AND ash.event_id = evt.event_id
AND evt.wait_class = 'User I/O'
GROUP BY sql_id
ORDER BY COUNT(*) DESC;

執行上面的SQL:
SQL> SELECT sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
2 3 WHERE ash.sample_time > SYSDATE - 1 / 24
4 AND ash.session_state = 'WAITING'
5 AND ash.event_id = evt.event_id
6 AND evt.wait_class = 'User I/O'
7 GROUP BY sql_id
8 ORDER BY COUNT(*) DESC;

SQL_ID COUNT(*)
------------- ----------
g7fu6qba82m6b 668
63r47zyphdk06 526
9f5m4wd88nc1h 514
593p47drw5fhk 232
br91w16jzy4fu 120
4fvwyjpnh6tp7 78
gm0nrbfuj8kzr 70
2184k363hw4xd 68
gc4dajs7g5myy 46
8vrk9sfuwfdgq 42
ccpnb4dwdmq21 40

查看SQL的執行計劃:
SELECT * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));

在SQLPLUS中執行:
SQL> set pagesize 2000
SQL> SELECT * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
SQL_ID g7fu6qba82m6b, child number 0
-------------------------------------
UPDATE "CPDDS_PDATA"."CDM_LEDGER" SET "CSTM_NAME" = :a1,"CSTM_NO" =
:a2,"PAPER_TYPE" = :a3,"PAPER_NO" = :a4,"CURR_TYPE" = :a5,"SVT_NO" =
:a6,"BAL_DIR" = :a7,"BAL" = :a8,"AVAL_BAL" = :a9,"NORM_FRATIO" =
:a10,"PK_BAL" = :a11,"DR_ACCU" = :a12,"CR_ACCU" = :a13,"LAST_TRAN_DATE" =
:a14,"LAST_TRAN_TIME" = :a15,"PRT_LINE_NUM" = :a16,"NOREG_PK_REC_NUM" =
:a17,"PK_NO" = :a18,"PWD" = :a19,"FLAG" = :a20,"FRZ_FLAG" =
:a21,"CARD_HOLD_FLAG" = :a22,"PK_HOLD_FLAG" = :a23,"BGN_INT_DATE" =
:a24,"OPEN_DATE" = :a25,"ACC_HOLD_FLAG" = :a26,"CLS_DATE" =
:a27,"OPEN_TLR" = :a28,"CLS_TLR" = :a29,"CLS_INT" = :a30,"OPEN_INST" =
:a31,"ADD_NUM" = :a32,"DAC" = :a33,"FRZ_TIMES1" = :a34,"FRZ_TIMES2" =
:a35,"HOST_SEQNO" = :a36,"D_UPDATE_DATE" = :a37 WHERE "ACC" = :b0

Plan hash value: 319441092

-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | 3 (100)| |
| 1 | UPDATE | CDM_LEDGER | | | | |
|* 2 | INDEX UNIQUE SCAN| I_CDM_LEDGER | 1 | 269 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("ACC"=:B0)

29 rows selected.

總結
1、與display函數不同,display_cursor顯示的為真實的執行計劃
2、對於format參數,使用與display函數的各個值,同樣適用於display_cursor函數
3、當statistics_level為all或使用gather_plan_statistics提示可以獲得執行時的統計信息
4、根據真實與預估的統計信息可以初步判斷SQL效率低下的原因,如統計信息的准確性、主要的開銷位於那些步驟等

❸ 如何優化SQL語句

一、問題的提出
在應用系統開發初期,由於開發資料庫數據比較少,對於查詢SQL語句,復雜視圖的的編寫等體會不出SQL語句各種寫法的性能優劣,但是如果將應用系統提交實際應用後,隨著資料庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。對於海量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,可見對於一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。
在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。在編寫SQL語句時我們應清楚優化器根據何種原則來刪除索引,這有助於寫出高性能的SQL語句。
二、SQL語句編寫注意問題
下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。在這些where子句中,即使某些列存在索引,但是由於編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。
1.
IS
NULL

IS
NOT
NULL
不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。
任何在where子句中使用is
null或is
not
null的語句優化器是不允許使用索引的。
2.
聯接列
對於有聯接的列,即使最後的聯接值為一個靜態值,優化器是不會使用索引的。我們一起來看一個例子,假定有一個職工表(employee),對於一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾.柯林頓(Bill
Cliton)的職工。
下面是一個採用聯接查詢的SQL語句,
select
*
from
employss
where
first_name||''||last_name
='Beill
Cliton';
上面這條語句完全可以查詢出是否有Bill
Cliton這個員工,但是這里需要注意,系統優化器對基於last_name創建的索引沒有使用。
當採用下面這種SQL語句的編寫,Oracle系統就可以採用基於last_name創建的索引。
***
where
first_name
='Beill'
and
last_name
='Cliton';
.
帶通配符(%)的like語句
同樣以上面的例子來看這種情況。目前的需求是這樣的,要求在職工表中查詢名字中包含cliton的人。可以採用如下的查詢SQL語句:
select
*
from
employee
where
last_name
like
'%cliton%';
這里由於通配符(%)在搜尋詞首出現,所以Oracle系統不使用last_name的索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。然而當通配符出現在字元串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用:
select
*
from
employee
where
last_name
like
'c%';
4.
Order
by語句
ORDER
BY語句決定了Oracle如何將返回的查詢結果排序。Order
by語句對要排序的列沒有什麼特別的限制,也可以將函數加入列中(象聯接或者附加等)。任何在Order
by語句的非索引項或者有計算表達式都將降低查詢速度。
仔細檢查order
by語句以找出非索引項或者表達式,它們會降低性能。解決這個問題的辦法就是重寫order
by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order
by子句中使用表達式。
5.
NOT
我們在查詢時經常在where子句使用一些邏輯表達式,如大於、小於、等於以及不等於等等,也可以使用and(與)、or(或)以及not(非)。NOT可用來對任何邏輯運算符號取反。下面是一個NOT子句的例子:
...
where
not
(status
='VALID')
如果要使用NOT,則應在取反的短語前面加上括弧,並在短語前面加上NOT運算符。NOT運算符包含在另外一個邏輯運算符中,這就是不等於(<>)運算符。換句話說,即使不在查詢where子句中顯式地加入NOT詞,NOT仍在運算符中,見下例:
...
where
status
<>'INVALID';
對這個查詢,可以改寫為不使用NOT:
select
*
from
employee
where
salary<3000
or
salary>3000;
雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。
雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。

❹ MYSQL資料庫如何執行SQL語句

select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 以上這些SQL語句能不能轉成一個存儲過程?我自己試了下 ALTER PROCEDURE Pr_GetClass @TeacherID int, @a char(50), @b char(50), @c char(50), @d char(50), @e char(50) as select @a=DRClass1, @b=DRClass2, @c=DRClass3, @d=DRClass4, @e=DRClass5 from Teacher Where TeacherID = @TeacherID DROP TABLE classname create table classname(classname char(50)) insert into classname (classname) values (@a) if (@b is not null) begin insert into classname (classname) values (@b) if (@c is not null) begin insert into classname (classname) values (@c) if (@d is not null) begin insert into classname (classname) values (@d) if (@e is not null) begin insert into classname (classname) values (@e) end end end end select * from classname 但是這樣的話,這個存儲過程就有6個變數,實際上應該只提供一個變數就可以了 主要的問題就是自己沒搞清楚 @a,@b,@C,@d 等是臨時變數,是放在as後面重新做一些申明的,而不是放在開頭整個存儲過程的變數定義。 (標准化越來越近了):namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 實戰SQL語句收集(不斷更新中--) 前言:這里將我編程實踐中遇到的有價值的sql語句一路記下來,一方面方便自己查用,一方面也夯實下即將遺忘的回憶。整個過程中我會不斷更新,直到不能再加為止,同時,這里只記錄最實用的咚咚,不效仿學院派的那一套。

❺ 請教一條sql語句的執行順序

這個我正好有收藏O(∩_∩)O哈哈~

1、FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian proct)(交叉聯接),生成虛擬表VT1
2、ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
3、outer(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),
保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,
完全外部聯接把兩個表都標記為保留表)
中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,
則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
4、WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
5、 group by:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
6、CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
7、HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
8、SELECT:處理SELECT列表,產生VT8.
9、DISTINCT:將重復的行從VT8中移除,產生VT9.
10、order by:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
TOP:從VC1

❻ PLSQL執行sql的幾種方法

plsql很方便我們執行sql。下面就簡單介紹我常用的幾種(當然每次svn的分支也可以ant腳本自動執行某個文件下的所以sql文件)首先打開plsq的命令窗口1)執行sql文件(可以把需要執行的sql放一個文件中)輸入@'' 在單引號中輸入sql文件的路徑既可,比如D:\db下的jbpm.oracle.sql文件,見下圖(sql文件內容是select * from system_menu r where r.menu_name='銷售訂單' ;) 2)導入dmp文件。導入dmp文件前先刪除對應的user(下面以test_user為例)drop user test_user cascade;
$ impdp system/test123@SYSTEM directory=data_pump_dir schemas=test_user mpfile=date.DMP REMAP_SCHEMA=test_user:test_userTABLE_EXISTS_ACTION=replace logfile=imp.log;
alter user test_user identified by 123456; 3)當需要重新從正式版資料庫到數據到測試版時,我們需要重啟測試版伺服器或者kill掉應用程序伺服器(比如tomcat)的session連接v$session 這張表可以查找到連接 oracle 資料庫的應用程序基本信息。因此可以通過該表來kill掉相應程序的session如果你想kill到連接到用戶 test_user ,可以執行下面的sql: select * from v$session r where r.USERNAME=『test_user』 ;然後kill對應的session'就行了,參考下面的截圖: 比如你要kill 第一條;就執行下面的sql : alter system kill session '21,77' ; //因為sid, serial#.這2列很唯一的。 下面補充一些連接oracle的應用程序信息和oracle 操作 session 情況。 1.查找到連接 oracle 資料庫的應用程序基本信息。 select sid, serial#,
username, --連接用戶名
program, --應用程序名
machine, --機器名
osuser, --操作系統用戶
logon_time --登錄時間
from v$session; 2.如何查看session級的等待事件?當我們對資料庫的性能進行調整時,一個最重要的參考指標就是系統等待事 件。$system_event,v$session_event,v$session_wait這三個視圖里記錄的就是系統級和session級的等待 事件,通過查詢這些視圖你可以發現資料庫的一些操作到底在等待什麼?是磁碟I/O,緩沖區忙,還是插鎖等等。通過如下sql你可以查詢你的每個應用程序到底在等待什麼,從而針對這些信息對資料庫的性能進行調整。
Select s.username,s.program,s.status,se.event,se.total_waits,se.total_timeouts,se.time_waited,se.average_wait
from v$session s, v$session_event se
Where s.sid=se.sid And se.event not like 'SQl*Net%' And s.status ='ACTIVE'And s.username is not null 3.oracle中查詢被鎖的表並釋放session SELECT A.OWNER,A.OBJECT_NAME,B.XIDUSN,B.XIDSLOT,B.XIDSQN,B.SESSION_ID,B.ORACLE_USERNAME, B.OS_USER_NAME,B.PROCESS, B.LOCKED_MODE, C.MACHINE,C.STATUS,C.SERVER,C.SID,C.SERIAL#,C.PROGRAM
FROM ALL_OBJECTS A,V$LOCKED_OBJECT B,SYS.GV_$SESSION C
WHERE ( A.OBJECT_ID = B.OBJECT_ID ) AND (B.PROCESS = C.PROCESS ) ORDER BY 1,2釋放session Sql:alter system killsession'sid,serial#'
alter systemkillsession'379,2'
alter systemkillsession'374,6938'4.查看佔用系統io較大的session SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program,se.MODULE,se.sql_address,st.event,st.p1text,si.physical_reads,si.block_changes
FROM v$session se, v$session_wait st,v$sess_io si,v$process pr
WHERE st.sid=se.sid AND st.sid=si.sid AND se.PADDR=pr.ADDR AND se.sid>6 AND st.wait_time=0 AND st.event NOT LIKE '%SQL%' ORDER BY physical_reads DESC5.找出耗cpu較多的session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc
6.另外oracle是否運行可以用sql語句查出:select status from v$instance;
其中,status可能返回三種值:open(資料庫打開),mount(資料庫已經載入,但還沒有打開),started(資料庫進程已經啟動,但是還沒有載入),這個數據字典可以在資料庫沒有打開的情況下查詢,但是需要用sys用戶執行。
反應時間,請求數需要具體說明到底是那個參數。你可以參考字典;v$status,v$session(看當前有多少個連接用戶等).

❼ SQL條件的順序對資料庫性能有怎樣的影響

經常有人問到oracle中的Where子句的條件書寫順序是否對SQL性能有影響,我的直覺是沒有影響,因為如果這個順序有影響,Oracle應該早就能夠做到自動優化,但一直沒有關於這方面的確鑿證據。在網上查到的文章,一般認為在RBO優化器模式下無影響(10G開始,預設為RBO優化器模式),而在CBO優化器模式下有影響,主要有兩種觀點:
a.能使結果最少的條件放在最右邊,SQL執行是按從右到左進行結果集的篩選的;
b.有人試驗表明,能使結果最少的條件放在最左邊,SQL性能更高。
此答案是在中國IT實驗室找到的非常感謝

❽ sql語句性能如何優化

如何加快查詢速度?
1、升級硬體
2、根據查詢條件,建立索引,優化索引、優化訪問方式,限制結果集的數據量。
3、擴大伺服器的內存
4、增加伺服器CPU個數
5、對於大的資料庫不要設置資料庫自動增長,它會降低伺服器的性能
6、在查詢Select語句中用Where字句限制返回的行數,避免表掃描,如果返回不必要的數據,浪費了伺服器的I/O資源,加重了網路的負擔降低性能。如果表很大,在表掃描的期間將表鎖住,禁止其他的聯接訪問表,後果嚴重。
7、查詢時不要返回不需要的行、列
8、用select top 100 / 10 Percent 來限制用戶返回的行數或者SET ROWCOUNT來限制操作的行
9、在IN後面值的列表中,將出現最頻繁的值放在最前面,出現得最少的放在最後面,減少判斷的次數
10、一般在GROUP BY 個HAVING字句之前就能剔除多餘的行,所以盡量不要用它們來做剔除行的工作。他們的執行順序應該如下最優:
select的Where字句選擇所有合適的行,Group By用來分組個統計行,Having字句用來剔除多餘的分組。這樣Group By 個Having的開銷小,查詢快.對於大的數據行進行分組和Having十分消耗資源。如果Group BY的目的不包括計算,只是分組,那麼用Distinct更快
11、一次更新多條記錄比分多次更新每次一條快,就是說批處理好

❾ SQL排序問題

按字母排列A-E
select * from wy_Down_Spec where SpecName between 'a' and 'e' or SpecName between '阿' and '鞥' order by SpecName collate Chinese_PRC_CS_AS_KS_WS

按字母排列F-K
select * from wy_Down_Spec where SpecName between 'f' and 'k' or SpecName between '發' and '困' order by SpecName collate Chinese_PRC_CS_AS_KS_WS

按字母排列L-N
select * from wy_Down_Spec where SpecName between 'l' and 'n' or SpecName between '拉' and '黁' order by SpecName collate Chinese_PRC_CS_AS_KS_WS

按字母排列O-T
select * from wy_Down_Spec where SpecName between 'o' and 't' or SpecName between '哦' and '臋' order by SpecName collate Chinese_PRC_CS_AS_KS_WS

按字母排列U-Z
select * from wy_Down_Spec where SpecName between 'u' and 'z' or SpecName between '哇' and '繜' order by SpecName collate Chinese_PRC_CS_AS_KS_WS

❿ oracle sql的執行計劃如何查看

方法/步驟

打開PL/SQL Developer軟體,請確保plsql能夠成功連接到一個oracle資料庫。

在PL/SQL Developer中寫好一段SQL代碼,按F5,或者點擊「執行執行計劃」圖標,PL/SQL Developer會自動打開執行計劃窗口,顯示該SQL的執行計劃。

可以看到窗口上方是sql語句,下方顯示執行計劃表格。表格的列主要包含描述、用戶、對象、成本花費、IO開銷等,表格,當然表格列還可以自定義。表格的行包含了查詢邏輯的執行順序和各個步驟信息。

執行計劃表格內容的執行順序是:按照從左至右,從上至下的步驟執行,具體是指執行計劃按照層次逐步縮進,從左至右看,縮進最多的那一步最先執行,如果縮進量相同,則按照從上而下的方法判斷執行順序。

通過查看執行計劃表格的cost列,即成本花費能夠知道哪個步驟花費的成本高,通過查看執行計劃表格的行中的objectname列,能夠知道是否使用到表中的索引。
步驟閱讀
6
本文先簡單介紹在plsql中的使用方法,後續會逐步完成各種理論和技巧的使用方法,例如優化器、表連接訪問方法、索引等