謂詞條件的資料型別隨意書寫對SQL效能影響巨大
最近在最佳化某系統中發現許多SQL語句在書寫謂詞條件(wheret條件)時完全不根據表結構定義的欄位資料型別來,而是隨意書寫謂詞條件,這樣造成原來能走正確索引的結果不能使用該索引,其結果就是查詢語句的效能很差,這裡將我所遇到的兩種情況介紹一下.
第一種情況是謂詞條件進行了資料型別的轉換轉換使得CBO無法使用索引:
其SQL語句如下所示,該SQL的功能是統計一年社保中心一年內由於各種傷害或骨折所發生的醫療費用
select a.hospital_id, c.hospital_name, count(distinct a.serial_no) rc, round(sum(b.real_pay), 2) ylfyze, round(sum(case when b.fund_id in ('001') then b.real_pay else 0 end), 2) tczc, round(sum(case when b.fund_id in ('201') then b.real_pay else 0 end), 2) zffy, round(sum(case when b.fund_id in ('003', '999') then b.real_pay else 0 end), 2) yyzf from mt_biz_fin a, mt_pay_record_fin b, bs_hospital c, bs_disease d where a.hospital_id = b.hospital_id and a.serial_no = b.serial_no and a.hospital_id = c.hospital_id and a.fin_disease = d.icd and d.center_id = a.center_id and a.valid_flag = 1 and b.valid_flag = 1 and a.biz_type = 12 and a.pers_type in (1, 2) and (d.disease like '%傷%' or d.disease like '%骨折%') and a.center_id = '430740' and to_char(a.fin_date, 'yyyymmdd') >= '20140101' and to_char(a.fin_date, 'yyyymmdd') < = '20141231' group by a.hospital_id, c.hospital_name order by a.hospital_id
上述SQL執行情況如下,其執行時間為4分40秒
SQL> set timing on SQL> set autotrace traceonly SQL> select c.hospital_id, 2 c.hospital_name, 3 count(distinct a.serial_no) rc, 4 round(sum(b.real_pay), 2) ylfyze, 5 round(sum(case 6 when b.fund_id in ('001') then 7 b.real_pay 8 else 9 0 10 end), 11 2) tczc, 12 round(sum(case 13 when b.fund_id in ('201') then 14 b.real_pay 15 else 16 0 17 end), 18 2) zffy, 19 round(sum(case 20 when b.fund_id in ('003', '999') then 21 b.real_pay 22 else 23 0 24 end), 25 2) yyzf 26 from mt_biz_fin a, mt_pay_record_fin b, bs_hospital c, bs_disease d 27 where a.hospital_id = b.hospital_id 28 and a.serial_no = b.serial_no 29 and a.hospital_id = c.hospital_id 30 and a.fin_disease = d.icd 31 and d.center_id = a.center_id 32 and a.valid_flag = 1 33 and b.valid_flag = 1 34 and a.biz_type = 12 35 and a.pers_type in (1, 2) 36 and (d.disease like '%傷%' or d.disease like '%骨折%') 37 and a.center_id = '430740' 38 and to_char(a.fin_date, 'yyyymmdd') >= '20140101' 39 and to_char(a.fin_date, 'yyyymmdd') < = '20141231' 40 group by c.hospital_id, c.hospital_name 41 order by c.hospital_id 42 ; Elapsed: 00:04:39.59 Execution Plan ---------------------------------------------------------- Plan hash value: 1467084556 --------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 148 | 4254 (20)| 00:00:04 | | 1 | SORT GROUP BY | | 1 | 148 | 4254 (20)| 00:00:04 | |* 2 | TABLE ACCESS BY INDEX ROWID | MT_PAY_RECORD_FIN | 1 | 31 | 1 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 1 | 148 | 4252 (20)| 00:00:04 | | 4 | NESTED LOOPS | | 1 | 117 | 4251 (20)| 00:00:04 | | 5 | NESTED LOOPS | | 3 | 252 | 4250 (20)| 00:00:04 | | 6 | INDEX FULL SCAN | IDX_BS_HOSPITAL_NAME | 1227 | 39264 | 2 (0)| 00:00:01 | |* 7 | TABLE ACCESS BY INDEX ROWID| MT_BIZ_FIN | 1 | 52 | 3 (0)| 00:00:01 | |* 8 | INDEX RANGE SCAN | PK_MT_BIZ_FIN | 1 | | 3 (0)| 00:00:01 | |* 9 | TABLE ACCESS BY INDEX ROWID | BS_DISEASE | 1 | 33 | 1 (0)| 00:00:01 | |* 10 | INDEX RANGE SCAN | INX_BS_DISEASE_01 | 1 | | 1 (0)| 00:00:01 | |* 11 | INDEX RANGE SCAN | I_MT_PAY_RECORD_FIN_1| 1 | | 1 (0)| 00:00:01 | --------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(TO_NUMBER("B"."VALID_FLAG")=1) 7 - filter(TO_NUMBER("A"."VALID_FLAG")=1 AND (TO_NUMBER("A"."PERS_TYPE")=1 OR TO_NUMBER("A"."PERS_TYPE")=2)) 8 - access("A"."HOSPITAL_ID"="C"."HOSPITAL_ID" AND "A"."CENTER_ID"='430740') filter("A"."CENTER_ID"='430740' AND TO_NUMBER("A"."BIZ_TYPE")=12 AND TO_CHAR(INTERNAL_FUNCTION("A"."FIN_DATE"),'yyyymmdd')>='20140101' AND TO_CHAR(INTERNAL_FUNCTION("A"."FIN_DATE"),'yyyymmdd')< ='20141231') 9 - filter("D"."DISEASE" LIKE '%傷%' OR "D"."DISEASE" LIKE '%骨折%') 10 - access("D"."CENTER_ID"='430740' AND "A"."FIN_DISEASE"="D"."ICD") 11 - access("A"."HOSPITAL_ID"="B"."HOSPITAL_ID" AND "A"."SERIAL_NO"="B"."SERIAL_NO") Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 161233 consistent gets 83048 physical reads 624 redo size 1197 bytes sent via SQL*Net to client 492 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 5 rows processed
上述SQL對於表BS_HOSPITAL只查詢了hospital_name列,而在BS_HOSPITAL表中存在索引IDX_BS_HOSPITAL_NAME(hospital_name,hospital_id)所以首先對IDX_BS_HOSPITAL_NAME索引全掃描這樣就不用再回表查詢從索引中就是得到hospital_name列的值作為結果集1。再透過對MT_BIZ_FIN表執行索引(PK_MT_BIZ_FIN)範圍掃描,再回表查詢返回其記錄作為結果集2,再以結果集1作為驅動表進行巢狀迴圈連線。再與表BS_DISEASE,I_MT_PAY_RECORD_FIN_1執行巢狀迴圈連線,再執行分組排序。其實在MT_BIZ_FIN表中存在複合索引INDI_MT_BIZ_FIN_F_H(FIN_DATE,HOSPITAL_ID,BIZ_TYPE, TREATMENT_TYPE, CENTER_ID),而查詢條件中用到了find_date,hospital_id,biz_type,center_id,只是這裡因為謂詞條件中對於fin_date條件是to_char(a.fin_date, 'yyyymmdd') >= '20140101' and to_char(a.fin_date, 'yyyymmdd') < = '20141231',而fin_date(費用完成時間)是日期型別,這裡將find_date轉換成字元型所以沒有辦法使用索引INDI_MT_BIZ_FIN_F_H。 將to_char(a.fin_date, 'yyyymmdd') >= '20140101' and to_char(a.fin_date, 'yyyymmdd') < = '20141231'條件改寫成
a.fin_date between to_date('20140101','yyyymmdd') and to_date('20141231','yyyymmdd') ,改寫後其SQL語句如下所示:
select c.hospital_id, c.hospital_name, count(distinct a.serial_no) rc, round(sum(b.real_pay), 2) ylfyze, round(sum(case when b.fund_id in ('001') then b.real_pay else 0 end), 2) tczc, round(sum(case when b.fund_id in ('201') then b.real_pay else 0 end), 2) zffy, round(sum(case when b.fund_id in ('003', '999') then b.real_pay else 0 end), 2) yyzf from mt_biz_fin a, mt_pay_record_fin b, bs_hospital c, bs_disease d where a.hospital_id = b.hospital_id and a.serial_no = b.serial_no and a.hospital_id = c.hospital_id and a.fin_disease = d.icd and d.center_id = a.center_id and a.valid_flag = 1 and b.valid_flag = 1 and a.biz_type = 12 and a.pers_type in (1, 2) and (d.disease like '%傷%' or d.disease like '%骨折%') and a.center_id = '430740' and a.fin_date between to_date('20140101','yyyymmdd') and to_date('20141231','yyyymmdd') group by c.hospital_id, c.hospital_name order by c.hospital_id
來實際執行一次,其執行結果如下所示,現在執行時間穩定在1-2秒之間,能滿足客戶要求。
SQL> set autotrace traceonly SQL> select c.hospital_id, 2 c.hospital_name, 3 count(distinct a.serial_no) rc, 4 round(sum(b.real_pay), 2) ylfyze, 5 round(sum(case 6 when b.fund_id in ('001') then 7 b.real_pay 8 else 9 0 10 end), 11 2) tczc, 12 round(sum(case 13 when b.fund_id in ('201') then 14 b.real_pay 15 else 16 0 17 end), 18 2) zffy, 19 round(sum(case 20 when b.fund_id in ('003', '999') then 21 b.real_pay 22 else 23 0 24 end), 25 2) yyzf 26 from mt_biz_fin a, mt_pay_record_fin b, bs_hospital c, bs_disease d 27 where a.hospital_id = b.hospital_id 28 and a.serial_no = b.serial_no 29 and a.hospital_id = c.hospital_id 30 and a.fin_disease = d.icd 31 and d.center_id = a.center_id 32 and a.valid_flag = 1 33 and b.valid_flag = 1 34 and a.biz_type = 12 35 and a.pers_type in (1, 2) 36 and (d.disease like '%傷%' or d.disease like '%骨折%') 37 and a.center_id = '430740' 38 and a.fin_date between to_date('20140101','yyyymmdd') and to_date('20141231','yyyymmdd') 39 group by c.hospital_id, c.hospital_name 40 order by c.hospital_id 41 ; Elapsed: 00:00:01.02 Execution Plan ---------------------------------------------------------- Plan hash value: 1467084556 --------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 17 | 2516 | 1529 (15)| 00:00:02 | | 1 | SORT GROUP BY | | 17 | 2516 | 1529 (15)| 00:00:02 | |* 2 | TABLE ACCESS BY INDEX ROWID | MT_PAY_RECORD_FIN | 1 | 31 | 1 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 17 | 2516 | 1528 (15)| 00:00:02 | | 4 | NESTED LOOPS | | 33 | 3861 | 1521 (15)| 00:00:02 | | 5 | NESTED LOOPS | | 354 | 29736 | 1450 (16)| 00:00:02 | | 6 | INDEX FULL SCAN | IDX_BS_HOSPITAL_NAME | 1227 | 39264 | 2 (0)| 00:00:01 | |* 7 | TABLE ACCESS BY INDEX ROWID| MT_BIZ_FIN | 1 | 52 | 1 (0)| 00:00:01 | |* 8 | INDEX RANGE SCAN | INDI_MT_BIZ_FIN_F_H | 1 | | 1 (0)| 00:00:01 | |* 9 | TABLE ACCESS BY INDEX ROWID | BS_DISEASE | 1 | 33 | 1 (0)| 00:00:01 | |* 10 | INDEX RANGE SCAN | INX_BS_DISEASE_01 | 1 | | 1 (0)| 00:00:01 | |* 11 | INDEX RANGE SCAN | I_MT_PAY_RECORD_FIN_1| 1 | | 1 (0)| 00:00:01 | --------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(TO_NUMBER("B"."VALID_FLAG")=1) 7 - filter(TO_NUMBER("A"."VALID_FLAG")=1 AND (TO_NUMBER("A"."PERS_TYPE")=1 OR TO_NUMBER("A"."PERS_TYPE")=2)) 8 - access("A"."HOSPITAL_ID"="C"."HOSPITAL_ID" AND "A"."FIN_DATE">=TO_DATE(' 2014-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A"."CENTER_ID"='430740' AND "A"."FIN_DATE"< =TO_DATE(' 2014-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) filter("A"."CENTER_ID"='430740' AND TO_NUMBER("A"."BIZ_TYPE")=12) 9 - filter("D"."DISEASE" LIKE '%傷%' OR "D"."DISEASE" LIKE '%骨折%') 10 - access("D"."CENTER_ID"='430740' AND "A"."FIN_DISEASE"="D"."ICD") 11 - access("A"."HOSPITAL_ID"="B"."HOSPITAL_ID" AND "A"."SERIAL_NO"="B"."SERIAL_NO") Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 71411 consistent gets 0 physical reads 0 redo size 1197 bytes sent via SQL*Net to client 492 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 5 rows processed
第二種謂詞條件的資料型別隱式轉換無法使用索引的情況,其原始SQL語句如下所示,查詢一個醫療機構的費用支出情況
select a.hospital_id, count(distinct a.serial_no) rc, round(sum(b.real_pay), 2) ylfyze, round(sum(case when b.fund_id in ('001') then b.real_pay else 0 end), 2) tczc, round(sum(case when b.fund_id in ('201') then b.real_pay else 0 end), 2) zffy, round(sum(case when b.fund_id in ('003', '999') then b.real_pay else 0 end), 2) yyzf from mt_biz_fin a, mt_pay_record_fin b where a.hospital_id = b.hospital_id and a.serial_no = b.serial_no and a.valid_flag = '1' and b.valid_flag = '1' and a.biz_type = '12' and a.pers_type in ('1', '2') and b.hospital_id=4307000231 group by a.hospital_id
該SQL的執行計劃如下所示,執行了1分22秒:
SQL> set autotrace traceonly SQL> select a.hospital_id, 2 count(distinct a.serial_no) rc, 3 round(sum(b.real_pay), 2) ylfyze, 4 round(sum(case 5 when b.fund_id in ('001') then 6 b.real_pay 7 else 8 0 9 end), 10 2) tczc, 11 round(sum(case 12 when b.fund_id in ('201') then 13 b.real_pay 14 else 15 0 16 end), 17 2) zffy, 18 round(sum(case 19 when b.fund_id in ('003', '999') then 20 b.real_pay 21 else 22 0 23 end), 24 2) yyzf 25 from mt_biz_fin a, mt_pay_record_fin b 26 where a.hospital_id = b.hospital_id 27 and a.serial_no = b.serial_no 28 and a.valid_flag = ‘1’ 29 and b.valid_flag = ‘1’ 30 and a.biz_type = ‘12’ 31 and a.pers_type in ('1', '2') 32 and b.hospital_id=4307000231 33 group by a.hospital_id 34 ; no rows selected Elapsed: 00:01:22.20 Execution Plan ---------------------------------------------------------- Plan hash value: 3673479381 -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 61 | 127K (16)| 00:01:56 | | 1 | SORT GROUP BY | | 1 | 61 | 127K (16)| 00:01:56 | |* 2 | TABLE ACCESS BY INDEX ROWID| MT_BIZ_FIN | 1 | 30 | 1 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 45 | 2745 | 127K (16)| 00:01:56 | |* 4 | TABLE ACCESS FULL | MT_PAY_RECORD_FIN | 8327 | 252K| 123K (16)| 00:01:53 | |* 5 | INDEX RANGE SCAN | PK_MT_BIZ_FIN | 1 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("A"."BIZ_TYPE"='12’ AND "A"."VALID_FLAG"='1’ AND ("A"."PERS_TYPE"='1’ OR "A"."PERS_TYPE"='2’) 4 - filter(TO_NUMBER("B"."HOSPITAL_ID")=4307000231 AND "B"."VALID_FLAG"='1') 5 - access("A"."HOSPITAL_ID"="B"."HOSPITAL_ID" AND "A"."SERIAL_NO"="B"."SERIAL_NO") Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 572386 consistent gets 383935 physical reads 0 redo size 638 bytes sent via SQL*Net to client 481 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 0 rows processed
從執行計劃中可以看到在訪問表MT_PAY_RECORD_FIN時使用的全表掃描,而在表MT_PAY_RECORD_FIN上存在索引PK_MT_PAY_RECORD_FIN(HOSPITAL_ID, SERIAL_NO)為什麼沒有使用該索引了,查詢條件中的謂詞條件是b.hospital_id=4307000231而從Predicate Information資訊中的4 - filter(TO_NUMBER("B"."HOSPITAL_ID")=4307000231
可知hospital_id在表中是字元型,而在書寫查詢條件時使用的是數字型別,這裡CBO進行資料型別的隱式轉換。所以使用不了索引。我們需要寫成b.hospital_id='4307000231',修改後的SQL如下所示:
select a.hospital_id, count(distinct a.serial_no) rc, round(sum(b.real_pay), 2) ylfyze, round(sum(case when b.fund_id in ('001') then b.real_pay else 0 end), 2) tczc, round(sum(case when b.fund_id in ('201') then b.real_pay else 0 end), 2) zffy, round(sum(case when b.fund_id in ('003', '999') then b.real_pay else 0 end), 2) yyzf from mt_biz_fin a, mt_pay_record_fin b where a.hospital_id = b.hospital_id and a.serial_no = b.serial_no and a.valid_flag = '1' and b.valid_flag = '1' and a.biz_type = '12' and a.pers_type in ('1', '2') and b.hospital_id='4307000231' group by a.hospital_id
來真實執行一次,現在能使用索引之後執行時間只要0.1秒
SQL> select a.hospital_id, 2 count(distinct a.serial_no) rc, 3 round(sum(b.real_pay), 2) ylfyze, 4 round(sum(case 5 when b.fund_id in ('001') then 6 b.real_pay 7 else 8 0 9 end), 10 2) tczc, 11 round(sum(case 12 when b.fund_id in ('201') then 13 b.real_pay 14 else 15 0 16 end), 17 2) zffy, 18 round(sum(case 19 when b.fund_id in ('003', '999') then 20 b.real_pay 21 else 22 0 23 end), 24 2) yyzf 25 from mt_biz_fin a, mt_pay_record_fin b 26 where a.hospital_id = b.hospital_id 27 and a.serial_no = b.serial_no 28 and a.valid_flag = '1' 29 and b.valid_flag = '1' 30 and a.biz_type = '12' 31 and a.pers_type in ('1', '2') 32 and b.hospital_id='4307000231' 33 group by a.hospital_id 34 ; no rows selected Elapsed: 00:00:00.01 Execution Plan ---------------------------------------------------------- Plan hash value: 3142857175 ------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 61 | 115 (1)| 00:00:01 | | 1 | SORT GROUP BY | | 1 | 61 | 115 (1)| 00:00:01 | |* 2 | TABLE ACCESS BY INDEX ROWID | MT_PAY_RECORD_FIN | 1 | 31 | 1 (0)| 00:00:01 | | 3 | NESTED LOOPS | | 139 | 8479 | 115 (1)| 00:00:01 | |* 4 | TABLE ACCESS BY INDEX ROWID| MT_BIZ_FIN | 139 | 4170 | 87 (2)| 00:00:01 | |* 5 | INDEX RANGE SCAN | INDI_MT_BIZ_FIN_H_F | 371 | | 19 (6)| 00:00:01 | |* 6 | INDEX RANGE SCAN | PK_MT_PAY_RECORD_FIN| 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("B"."VALID_FLAG"='1') 4 - filter("A"."VALID_FLAG"='1' AND ("A"."PERS_TYPE"='1' OR A"."PERS_TYPE"='2')) 5 - access("A"."HOSPITAL_ID"='4307000231') filter("A"."BIZ_TYPE"='12') 6 - access("B"."HOSPITAL_ID"='4307000231' AND "A"."SERIAL_NO"="B"."SERIAL_NO") Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 203 consistent gets 0 physical reads 0 redo size 638 bytes sent via SQL*Net to client 481 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 0 rows processed
從上面的執行計劃可以看到現在訪問表MT_PAY_RECORD_FIN能正確使用索引PK_MT_PAY_RECORD_FIN,但這裡CBO並不是先訪問表MT_PAY_RECORD_FIN,這裡執行了謂詞傳遞,從Predicate Information 中的 5 - access("A"."HOSPITAL_ID"='4307000231')可知是先對索引INDI_MT_BIZ_FIN_H_F執行索引範圍,但是在查詢條件中並沒有寫a.hospital_id='4307000231'這個條件,這就是謂詞傳遞的結果,因為有b.hospital_id='4307000231' and a.hospital_id=b.hospital_id,所以CBO推匯出a.hospital_id='4307000231'。
在最佳化這個系統時發現好多類似這兩種情況的SQL,都是因為在書寫SQL語句時根本就沒有注意欄位的型別,不同的開發人員書寫的SQL語句,有的人謂詞資料型別書寫正確,有的人謂詞資料型別書寫不正確。希望開發人員在書寫SQL謂詞條件時注意資料型別,一定要書寫正確。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25723371/viewspace-1397985/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 軟體效能的設計(三)資料型別對軟體效能的影響 (轉)資料型別
- 謂詞條件是is null走索引嗎?Null索引
- oracle 謂詞表示式對基數的影響(及11G改進)Oracle
- 磁碟排序對Oracle資料庫效能的影響排序Oracle資料庫
- 【開發篇sql】 條件和表示式(一) 資料型別SQL資料型別
- SQL 改寫系列七:謂詞移動SQL
- SQL 改寫系列六:謂詞推導SQL
- 磁碟排序對Oracle資料庫效能的影響PT排序Oracle資料庫
- 容器化對資料庫的效能有影響嗎?資料庫
- 條件型別型別
- [zt] 影響SQL效能的原因SQL
- 32. 基本資料型別、約束條件資料型別
- WHRER條件裡的資料型別必須和欄位資料型別一致資料型別
- 關於資料庫開啟大頁對效能的影響資料庫
- 【開發篇sql】 條件和表示式(二) 資料型別的比較規則SQL資料型別
- 資料庫聚簇索引——not null條件對唯一鍵索引成為聚簇索引的影響資料庫索引Null
- “一般資料保護條例”對資料分析及挖掘的影響
- MyBatis 基本資料型別條件判斷問題MyBatis資料型別
- 資料型別為date作為查詢條件資料型別
- RAID的概念和RAID對於SQL效能的影響AISQL
- SQL中on條件與where條件的區別[轉]SQL
- 載入資料順序對HASH SORT CLUSTER效能影響
- Oracle Lob型別相關引數以及效能影響Oracle型別
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- ORM框架和資料庫對系統效能影響的比較ORM框架資料庫
- 大資料SQL中的Join謂詞下推,真的那麼難懂?大資料SQL
- 新增欄位對SQL的影響SQL
- SQL Server效能影響的重要結論SQLServer
- 轉:RAID的概念及RAID對於SQL效能的影響AISQL
- 【SQL】SQL資料型別SQL資料型別
- 對我影響最大的圖靈書圖靈
- MySql和SQL Server資料型別 對比MySqlServer資料型別
- SQL Server 2005 資料型別和.Net資料型別的對應關係SQLServer資料型別
- JAVA 異常對於效能的影響Java
- 一條SQL語句的書寫SQL
- 隨意寫寫
- SQL 資料型別SQL資料型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-有限制的子型別SQL資料型別