『壹』 怎麼優化這條sql
case when 的效率低於isnull(),這是第一個要改的
-----------------------------------------------------------
然後可以使用表表達式來優化查詢語句本身,表表達式在查詢中只執行一次,這就避免了一些重復的工作 。
started與endeds可以共用一個表表達式:
select storeUuid
,case when createOpeTime < #{starttime} then 0 else 1 end started
,max(createOpeTime) createOpeTime
from store_capital_virtual_account_detail
where createOpeTime >= #{endtime}
group by storeUuid
,case when createOpeTime < #{starttime} then 0 else 1 end
類似的,added與reced也可以共用一個表表達式:
select storeUuid
,inOrOut
,sum(operAmount) add_amount
from store_capital_virtual_account_detail
where (inOrOut=1 or (inOrOut=1 and businessType != 52))
and createOpeTime between #{starttime} and #{endtime}
group by storeUuid,inOrOut
------------------------------------------------------------
再然後如果還需要進一步優化,那麼,就要考慮那些可選的條件了。例如,where 條件直接寫成smi.storeName LIKE .... and smi.storeNo LIKE ...,對參數進行預處理,沒有它們就處理為''
如果能夠限定這兩個參數至少有一個不為空,那麼,可以預見smi集就會小很多,那麼,可以進一步把smi相關的查詢部分也做成cte,並且用它們對cte_1和cte_2進行過濾以減少cte_1和cte_2做group時前中間集的大小,就能進一步提高效率。
----------------------------------------------------------
如果還不能滿足需要,那麼,還可以對表結構進行優化。
很多使用java的程序員設計表時為了方便,將很多欄位都設計為字元類型,這減少了java代碼中對類型的轉換處理,但是,查詢過程中計算壓力都轉稼到了sql引擎。當數據量大的時候,對字元欄位的搜索效率是遠低於一個適當的欄位類型的,因為在查詢過程中動態索引時,欄位寬度與索引時間是強相關的。
inOrOut可以定義為tinyint,這只需要一個位元組,可以存放256個不同的值(0~255或-128~127),記錄時間的欄位首選timestamp,如果不能滿足需要可用datetime,它們分別需要4位元組與8位元組存儲空間。
『貳』 sql語句中的欄位的值是一個表達式時,怎麼書寫才是規范的
插入的語法
insert into table1(欄位1,欄位2……) values(值1,值2)
insert into table1(欄位1,欄位2……) select 欄位1,欄位2…… from table2
修改的語法
update table set 欄位1=值1,欄位2=值2
『叄』 ORACLE的SQL書寫規范
/**
ORACLE的SQL規范,目的避免SQL執行錯誤,提高SQL腳本的質量;
一般執行SQL在command模式下,所以每個完整的語句需要在後面加上斜杠("/"),特別是過程或函數必須在其後加上斜杠("/")
多條非過程SQL語句在最後面一條語句後加上斜杠("/"),如insert、update、delete。在執行完,做下commit;
例子以表名TEST1說明,注意:create_str使用的varchar2類型,長度5000,如果SQL太長,要調整長度。
*/
declare
create_str varchar2(5000) := 'create table TEST1(ID int,REALNAME varchar2(32))';
count_flag number;
begin
select count(*)
into count_flag
from user_tables
where table_name = 'TEST1';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop table TEST1';
execute immediate create_str;
--欄位註解規范
execute immediate 'COMMENT ON COLUMN "TEST1"."ID" IS ''編號''';
execute immediate 'COMMENT ON COLUMN "TEST1"."REALNAME" IS ''姓名''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 add NICKNAME varchar(32)';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag < 1 then
execute immediate add_str;
--欄位註解規范
execute immediate 'COMMENT ON COLUMN "TEST1"."NICKNAME" IS ''昵稱''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 modify NICKNAME varchar(100)';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag = 1 then
execute immediate add_str;
--欄位註解規范
execute immediate 'COMMENT ON COLUMN "TEST1"."NICKNAME" IS ''昵稱''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 drop column NICKNAME';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag = 1 then
execute immediate add_str;
end if;
end;
/
declare
create_str varchar2(5000) := 'create index IDX_TEST1_ID on TEST1(id)';
count_flag number;
begin
select count(*) into count_flag from user_indexes where table_name='TEST1' and index_name='IDX_TEST1_ID';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop index IDX_TEST1_ID';
execute immediate create_str;
end if;
end;
/
declare
create_str varchar2(5000) := 'create sequence SEQ_TEST1 minvalue 1 maxvalue 999999999999 start with 1 increment by 1';
count_flag number;
begin
select count(*) into count_flag from user_sequences where sequence_name='SEQ_TEST1';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop sequence SEQ_TEST1';
execute immediate create_str;
end if;
end;
/
insert into TEST1
(id, realname, nickname)
select 1, '網名', '網蟲'
from al
where not exists (select * from TEST1 where id = 1);
/
update TEST1 set realname='網名', nickname='網蟲' where id=1;
/
delete from TEST1 t where t.id=1;
/
『肆』 SQL語句為什麼是大寫
在oracle里,如果同樣的一條語句,但大小寫不同的話,oracle會認為這是2個不同的SQL。所以oracle會對這2個SQL語句解析兩次。這樣就導致了buffer hit的命中率和soft parse的百分比。如果有很多這樣的情況發生,會導致oracle整體性能的下降。
所以強烈建議制定SQL的書寫規范
『伍』 資料庫管理員的職責主要包括哪些
資料庫管理員的主要職責為:
1、資料庫管理員規定用戶訪問許可權和為不同用戶組分配資源。
2、監視監控資料庫的警告日誌,定期做備份刪除。
3、對資料庫的備份策略要根據實際要求進行更改,數據的日常備份情況進行監控。
4、規范資料庫用戶的管理定期對管理員等重要用戶密碼進行修改。
5、對SQL語句的書寫規范的要求一個SQL語句,如果寫得不理想,對資料庫的影響是很大的。
(5)sql書寫規范優化擴展閱讀
技術分工
產品的整個生命周期里資料庫管理員的職責重要而廣泛,這催生了各個縱向的運維技術方向,凡是關繫到資料庫質量、效率、成本、安全等方面的工作,及涉及到的技術、組件,主要包括:
1、資料庫監控技術:包括監控平台的研發、應用,服務監控准確性、實時性、全面性的保障。
2、資料庫故障管理:包括服務的故障預案設計,預案的自動化執行,故障的總結並反饋到產品/系統的設計層面進行優化以提高產品的穩定性。
3、資料庫容量管理:測量服務的容量,規劃服務的機房建設,擴容、遷移等工作。
4、資料庫性能優化:從各個方向,包括SQL優化、參數優化、應用優化、客戶端優化等,提高資料庫的性能和響應速度,改善用戶體驗。
『陸』 SQL語句必須用大寫,是不是規范為什
SQL推薦使用大寫,但是使用小寫也也可以!沒有嚴格規定。
『柒』 SQL編寫規范
書寫格式 示例代碼 存儲過程SQL文書寫格式例selectc dealerCode round(sum(c submitSubletAmountDLR + c submitPartsAmountDLR + c submitLaborAmountDLR) / count(*) ) as avg decode(null x xx CNY )from (selecta dealerCode a submitSubletAmountDLR a submitPartsAmountDLR a submitLaborAmountDLRfrom SRV_C_F awhere (to_char(a ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(a ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(a deleteflag ) <> )union allselectb dealerCode b submitSubletAmountDLR b submitPartsAmountDLR b submitLaborAmountDLRfrom SRV_CHistory_F bwhere (to_char(b ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(b ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(b deleteflag ) <> )) cgroup by c dealerCodeorder by avg desc;Java source里的SQL字元串書寫格式例strSQL = insert into Snd_FinanceHistory_Tb + (DEALERCODE + REQUESTSEQUECE + HANDLETIME + JOBFLAG + FRAMENO + INMONEY + REMAINMONEY + DELETEFLAG + UPDATECOUNT + CREUSER + CREDATE + HONORCHECKNO + SEQ) + values ( + draftInputDetail dealerCode + + + draftInputDetail requestsequece + + sysdate + + + frameNO + + requestMoney + + remainMoney + + + + + draftStruct employeeCode + + sysdate + + draftInputDetail honorCheckNo + + index + ) ; ) 縮進對於存儲過程文件 縮進為 個空格對於Java source里的SQL字元串 不可有縮進 即每一行字元串不可以空格開頭 ) 換行 > Select/From/Where/Order by/Group by等子句必須另其一行寫 > Select子句內容如果只有一項 與Select同行寫 > Select子句內容如果多於一項 每一項單獨佔一行 在對應Select的基礎上向右縮進 個空格(Java source無縮進) > From子句內容如果只有一項 與From同行寫 > From子句內容如果多於一項 每一項單獨佔一行 在對應From的基礎上向右縮進 個空格(Java source無縮進) > Where子句的條件如果有多項 每一個條件佔一行 以AND開頭 且無縮進 > (Update)Set子句內容每一項單獨佔一行 無縮進 > Insert子句內容每個表欄位單獨佔一行 無縮進 values每一項單獨佔一行 無縮進 > SQL文中間不允許出現空行 > Java source里單引號必須跟所屬的SQL子句處在同一行 連接符( + )必須在行首 ) 空格 > SQL內算數運算符 邏輯運算符連接的兩個元素之間必須用空格分隔 > 逗號之後必須接一個空格 > 關鍵字 保留字和左括弧之間必須有一個空格 不等於統一使用 <> Oracle認為 != 和 <> 是等價的 都代表不等於的意義 為了統一 不等於一律使用 <> 表示 使用表的別名 資料庫查詢 必須使用表的別名 SQL文對表欄位擴展的兼容性 在Java source里使用Select *時 嚴禁通過getString( )的形式得到查詢結果 必須使用getString( 欄位名 )的形式使用Insert時 必須指定插入的欄位名 嚴禁不指定欄位名直接插入values 減少子查詢的使用 子查詢除了可讀性差之外 還在一定程度上影響了SQL運行效率請盡量減少使用子查詢的使用 用其他效率更高 可讀性更好的方式替代 適當添加索引以提高查詢效率 適當添加索引可以大幅度的提高檢索速度請參看ORACLE SQL性能優化系列 對資料庫表操作的特殊要求 本項目對資料庫表的操作還有以下特殊要求 ) 以邏輯刪除替代物理刪除注意 現在資料庫表中數據沒有物理刪除 只有邏輯刪除以deleteflag欄位作為刪除標志 deleteflag= 代表此記錄被邏輯刪除 因此在查詢數據時必須考慮deleteflag的因素deleteflag的標准查詢條件 NVL(deleteflag ) <> ) 增加記錄狀態欄位資料庫中的每張表基本都有以下欄位 DELETEFLAG UPDATECOUNT CREDATE CREUSER UPDATETIME UPDATEUSER要注意在對標進行操作時必須考慮以下欄位插入一條記錄時要置DELETEFLAG= UPDATECOUNT= CREDATE=sysdate CREUSER=登錄User查詢一條記錄時要考慮DELETEFLAG 如果有可能對此記錄作更新時還要取得UPDATECOUNT作同步檢查修改一條記錄時要置UPDATETIME=sysdate UPDATEUSER=登錄User UPDATECOUNT=(UPDATECOUNT+ ) mod 刪除一條記錄時要置DELETEFLAG= ) 歷史表資料庫里部分表還存在相應的歷史表 比如srv_c_f和srv_chistory_f在查詢數據時除了檢索所在表之外 還必須檢索相應的歷史表 對二者的結果做Union(或Union All) 用執行計劃分析SQL性能 EXPLAIN PLAN是一個很好的分析SQL語句的工具 它可以在不執行SQL的情況下分析語句通過分析 我們就可以知道ORACLE是怎樣連接表 使用什麼方式掃描表(索引掃描或全表掃描) 以及使用到的索引名稱按照從里到外 從上到下的次序解讀分析的結果EXPLAIN PLAN的分析結果是用縮進的格式排列的 最內部的操作將最先被解讀 如果兩個操作處於同一層中 帶有最小操作號的將首先被執行目前許多第三方的工具如PLSQL Developer和TOAD等都提供了極其方便的EXPLAIN PLAN工具PG需要將自己添加的查詢SQL文記入log 然後在EXPLAIN PLAN中進行分析 盡量減少全表掃描 ORACLE SQL性能優化系列 選擇最有效率的表名順序(只在基於規則的優化器中有效) ORACLE的解析器按照從右到左的順序處理FROM子句中的表名 因此FROM子句中寫在最後的表(基礎表driving table)將被最先處理在FROM子句中包含多個表的情況下 必須選擇記錄條數最少的表作為基礎表當ORACLE處理多個表時 會運用排序及合並的方式連接它們首先 掃描第一個表(FROM子句中最後的那個表)並對記錄進行排序 然後掃描第二個表(FROM子句中最後第二個表) 最後將所有從第二個表中檢索出的記錄與第一個表中合適記錄進行合並例如:表 TAB 條記錄表 TAB 條記錄選擇TAB 作為基礎表 (最好的方法)select count(*) from tab tab 執行時間 秒選擇TAB 作為基礎表 (不佳的方法)select count(*) from tab tab 執行時間 秒如果有 個以上的表連接查詢 那就需要選擇交叉表(intersection table)作為基礎表 交叉表是指那個被其他表所引用的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L CATEGORY C EMP EWHERE E EMP_NO BEEEN AND AND E CAT_NO = C CAT_NOAND E LOCN = L LOCN將比下列SQL更有效率SELECT *FROM EMP E LOCATION L CATEGORY CWHERE E CAT_NO = C CAT_NOAND E LOCN = L LOCNAND E EMP_NO BEEEN AND WHERE子句中的連接順序 ORACLE採用自下而上的順序解析WHERE子句根據這個原理 表之間的連接必須寫在其他WHERE條件之前 那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾例如 (低效 執行時間 秒)SELECT *FROM EMP EWHERE SAL > AND JOB = MANAGER AND < (SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO);(高效 執行時間 秒)SELECT *FROM EMP EWHERE < (SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO)AND SAL > AND JOB = MANAGER ; SELECT子句中避免使用 * 當你想在SELECT子句中列出所有的COLUMN時 使用動態SQL列引用 * 是一個方便的方法 不幸的是 這是一個非常低效的方法實際上 ORACLE在解析的過程中 會將 * 依次轉換成所有的列名這個工作是通過查詢數據字典完 lishixin/Article/program/Oracle/201311/18246
『捌』 萬得資訊數據處理員的復試,主要是什麼樣的流程、會問什麼
復試一般都是管理層的直接對你面試。談的大概是薪酬、以及你對自己將來職業生涯的規劃等等一些問題,再有,不了解你那個公司大不大。一般公司不大的話復試不會特別嚴格,自由發揮就好,大公司更要講究應變了,對著他笑絕對有用,一下是資料庫管理員的職責。供參考
資料庫管理員的職責:
一、 一般監視
1. 監控資料庫的警告日誌。Alert<sid>.log,定期做備份刪除。
2. Linstener.log的監控,/network/admin/linstener.ora。
3. 重做日誌狀態監視,留意視圖v$log,v$logfile,該兩個視圖存儲重做日誌的信息。
4. 監控資料庫的日常會話情況。
5. 碎片、剩餘表空間監控,及時了解表空間的擴展情況、以及剩餘空間分布情況,如果有連續的自由空間,手工合並。
6. 監控回滾段的使用情況。生產系統中,要做比較大的維護和資料庫結構更改時,用rbs_big01來做。
7. 監控擴展段是否存在不滿足擴展的表。
8. 監控臨時表空間。
9. 監視對象的修改。定期列出所有變化的對象。
10. 跟蹤文件,有初始化參數文件、用戶後台文件、系統後台文件
二、 對資料庫的備份監控和管理
資料庫的備份至關重要,對資料庫的備份策略要根據實際要求進行更改,數據的日常備份情況進行監控。由於我們使用了磁帶庫,所以要對legato備份軟體進行監控,同時也要對rman備份資料庫進行監控。
三、 規范資料庫用戶的管理
定期對管理員等重要用戶密碼進行修改。對於每一個項目,應該建立一個用戶。DBA應該和相應的項目管理人員或者是程序員溝通,確定怎樣建立相應的資料庫底層模型,最後由DBA統一管理,建立和維護。任何資料庫對象的更改,應該由DBA根據需求來操作。
四、 對SQL語句的書寫規范的要求
一個SQL語句,如果寫得不理想,對資料庫的影響是很大的。所以,每一個程序員或相應的工作人員在寫相應的SQL語句時,應該嚴格按照《SQL書寫規范》一文。最後要有DBA檢查才可以正式運行。
五、 DBA深層次要求
一個資料庫能否健康有效的運行,僅靠這些日常的維護還是不夠的,還應該致力於資料庫的更深一層次的管理和研究:資料庫本身的優化,開發上的性能優化;項目的合理化;安全化審計方面的工作;資料庫的底層建模研究、規劃設計;各種數據類型的處理;內部機制的研究;ora-600錯誤的研究、故障排除,等等很多值得探討的問題。
『玖』 請教寫sql代碼時,縮進格式的規范問題
有多種風格,但有一個基本點:增強可讀性。
縮進是一種重要的格式化,所有格式化(換行、關鍵字大寫、運算符前後加空格、。。。)都是這個目的。
附註:
A)分隔符【,】寫在前,是為了復制、刪除方便;
B )子查詢縮進多少,AND是否縮進等,則取決於個人的目的。
當然,縮進過多會影響頁面空間。所以,我個人是只喜歡縮進一個TAB。