20個資料庫設計最佳實踐: 使用明確、統一的標明和列名,例如 School, SchoolCourse, CourceID。 數據表名使用單數而不是復數,例如 StudentCourse,而不是StudentCourses。 數據表名不要使用空格。 數據表名不要使用不必要的前綴或者後綴,例如使用School,而不是TblSchool,或者SchoolTable等等。 資料庫中的密碼要加密,到應用中再解密。 使用整數作為ID欄位,也許現在沒有這個必要,但是將來需要,例如關聯表,索引等等。 使用整數欄位做索引,否則會帶來很大的性能問題 。 使用bit 作為布爾欄位,使用整數或者varcha是浪費。同時,這類欄位應該以「Is」開頭。 要經過認證才能訪問資料庫,不要給每一個用戶管理員許可權。 盡量避免使用「select *」,而使用「select [required_column_list]」以獲得更好的性能。 假如程序代碼比較復雜,使用ORM框架,例如hibernate,iBatis。ORM框架的性能問題可以通過詳細的配置去解決。 分割不常使用的數據表到不同的物理存儲以獲得更好的性能。 對於關鍵資料庫,使用安全備份系統,例如集群,同步等等。 使用外鍵,非空等限制來保證數據的完整性,不要把所有的東西都扔給程序。 缺乏資料庫文檔是致命的。你應該為你的資料庫設計寫文檔,包括觸發器、存儲過程和其他腳本。 對於經常使用的查詢和大型數據表,要使用索引。數據分析工具可以幫助你決定如何建立索引。 資料庫伺服器和網頁伺服器應該放在不同的機器上。這回提高安全性,並減輕CPU壓力。 Image和blob欄位不應該定義在常用的數據表中,否則會影響性能。 範式(Normalization)要按照要求使用以提高性能。Normalization做的不夠會導致數據冗餘,而過度Normalization 會導致太多的join和數據表,這兩種情況都會影響性能。 多花點時間在資料庫設計上,否則你將來會付出加倍的時間來償還。設置外鍵:方法一:SQL語句alter table 表名 add constraint 外鍵名 foreign key(欄位名) references 主表名(欄位名) on delete cascade方法二:不想寫sql 語句也可以直接用圖形化操作 選擇你要創建外鍵的表,反鍵選擇修改表,點擊
B. 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;
/
C. sql查詢語句格式是什麼
sql查詢語句格式是:
D. 如何編寫健壯的sql代碼
所謂健壯就是出錯少,能擴展(重寫次數少),執行效率高的代碼。 這個是所有代碼工的想法,不過要寫這樣的代碼有一個必須的前提,就是你要足夠了解業務。只有足夠了解業務才能寫出最合適的代碼。 舉個例子,在保險行業編寫代碼,為某一個險種寫代碼,所有的內容都是靜態sql(按照一般的意義來說,靜態sql都很健壯,因為不可能出錯,解析快),但是也有問題,那就是可重復利用率不高,比如你要給10個險種寫代碼,代碼類似,那麼是不是要寫10個靜態sql,這樣佔地方不說,將來可能出現什麼問題(比如某保險條款更改),那麼可能要修改10次代碼,甚至重寫10次代碼,這個工作量就很大(畢竟現在沒有哪家保險公司只有10個險種)。 那麼可能就要改為變數的動態sql(動態sql各種測試寫起來麻煩,而且實際應用中出現問題的可能性遠遠大於靜態sql),還是這10個險種。可能一個存儲過程就搞定了,這樣修改的話,可能也簡單很多。 但是還有問題,假設修改某一個險種的內容,那麼怎麼改?去掉這個險種很容易,那麼另外一個是不是要重新編寫,一切從頭來,這種代碼也不能稱為健壯。 那麼什麼樣子是健壯?要用業務知識對這10個險種進行分類,假設其中有5個已經賣了10年以上,而且變化不大,近三年內沒有變化,銷售量也差不多,那麼就說明這5個不太可能有變化,那麼可以放在一起。另外5個中,有三個是今年剛剛出現的新險種,還要經過市場考驗的,那麼就單獨設立。還有兩個近三年內有較大變化,或者可能有什麼其他問題(比如銷售量很小,正在考慮取消等),那麼這兩個也可以作為一個存儲過程,甚至單獨設立,這就要根據實際情況判斷了。 不過做到以上這些,沒有業務知識是絕對辦不到的,所以說健壯sql的前提是精通業務。 再精通業務的前提下,才是sql技巧(這里不考慮表的設置,如果考慮表,那麼夠論文的)。一般來說越簡單的sql越健壯,但是實際應用中, select aaa from bbb的形式很少,大多數需求都比較復雜,那就要看sql的基本功了。 舉個例子,一個人要兩張表的笛卡爾積結果,如果不知道什麼是笛卡爾積,那麼怎麼給出結果?寫法很簡單,但是不知道就不會(也就是說的「難者不會,會者不難」),所以基本上基礎扎實加上經常寫,那麼sql技巧總會提高了。 以上兩點搞定了,別說健壯sql,鑌鐵sql都行。
E. 在進行SQL腳本編寫規范
沒錯,加了索引會更新索引。導致慢也就會有可能產生索死。
F. 訪問oracle 的sql 語句的規范是什麼
SQL的使用規范:
i. 盡量避免大事務操作,慎用holdlock子句,提高系統並發能力。
ii. 盡量避免反復訪問同一張或幾張表,尤其是數據量較大的表,可以考慮先根據條件提取數據到臨時表中,然後再做連接。
iii. 盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那麼就應該改寫;如果使用了游標,就要盡量避免在游標循環中再進行表連接的操作。
iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、范圍大小來確定條件子句的前後順序,盡可能的讓欄位順序與索引順序相一致,范圍從大到小。
v. 不要在where子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
vi. 盡量使用exists代替select count(1)來判斷是否存在記錄,count函數只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
vii. 盡量使用「>=」,不要使用「>」。
viii. 注意一些or子句和union子句之間的替換
ix. 注意表之間連接的數據類型,避免不同類型數據之間的連接。
x. 注意存儲過程中參數和數據類型的關系。
xi. 注意insert、update操作的數據量,防止與其他應用沖突。如果數據量超過200個數據頁面(400k),那麼系統將會進行鎖升級,頁級鎖會升級成表級鎖。
b) 索引的使用規范:
i. 索引的創建要與應用結合考慮,建議大的OLTP表不要超過6個索引。
ii. 盡可能的使用索引欄位作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引
iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。
iv. 在使用索引欄位作為條件時,如果該索引是聯合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護,周期性重建索引,重新編譯存儲過程。
c) tempdb的使用規范:
i. 盡量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。
ii. 避免頻繁創建和刪除臨時表,減少系統表資源的消耗。
iii. 在新建臨時表時,如果一次性插入數據量很大,那麼可以使用select into代替create table,避免log,提高速度;如果數據量不大,為了緩和系統表的資源,建議先create table,然後insert。
iv. 如果臨時表的數據量較大,需要建立索引,那麼應該將創建臨時表和建立索引的過程放在單獨一個子存儲過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
v. 如果使用到了臨時表,在存儲過程的最後務必將所有的臨時表顯式刪除,先truncate table,然後drop table,這樣可以避免系統表的較長時間鎖定。
vi. 慎用大的臨時表與其他大表的連接查詢和修改,減低系統表負擔,因為這種操作會在一條語句中多次使用tempdb的系統表。
d) 合理的演算法使用:
根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,採用多種演算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。
G. sql語句的寫法有什麼規范嗎大寫小寫的 謝謝
這個純是個人書寫習慣問題,沒有什麼規范,主要看自己用哪個舒服了
只有一種情況大小寫敏感
select * from table where name ='A' ;
select * from table where name ='a' ;
也就這兩種情況下區分大小寫
H. 如何進行SQL性能優化
這里分享下mysql優化的幾種方法。
1、首先在打開的軟體中,需要分別為每一個表創建 InnoDB FILE的文件。
I. 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
J. 請教寫sql代碼時,縮進格式的規范問題
有多種風格,但有一個基本點:增強可讀性。
縮進是一種重要的格式化,所有格式化(換行、關鍵字大寫、運算符前後加空格、。。。)都是這個目的。
附註:
A)分隔符【,】寫在前,是為了復制、刪除方便;
B )子查詢縮進多少,AND是否縮進等,則取決於個人的目的。
當然,縮進過多會影響頁面空間。所以,我個人是只喜歡縮進一個TAB。