本節內容: MySql的字符串函數html
ASCII(str) 返回字符串str的最左面字符的ASCII代碼值。若是str是空字符串,返回0。若是str是NULL,返回NULL。 java
複製代碼 代碼示例:mysql> select ASCII('2'); -> 50 mysql> select ASCII(2); -> 50 mysql> select ASCII('dx'); -> 100 也可參見ORD()函數。mysql
ORD(str) 若是字符串str最左面字符是一個多字節字符,經過以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代碼值來返回多字節字符代碼。若是最左面的字符不是一個多字節字符。返回與ASCII()函數返回的相同值。 linux
複製代碼 代碼示例:mysql> select ORD('2'); -> 50 CONV(N,from_base,to_base) 在不一樣的數字基之間變換數字。返回數字N的字符串數字,從from_base基變換爲to_base基,若是任何參數是NULL,返回NULL。參數N解釋爲一個整數,可是能夠指定爲一個整數或一個字符串。最小基是2且最大的基是36。若是to_base是一個負數,N被認爲是一個有符號數,不然,N被看成無符號數。 CONV以64位點精度工做。 android
複製代碼 代碼示例:mysql> select CONV("a",16,2); -> '1010' mysql> select CONV("6E",18,8); -> '172' mysql> select CONV(-17,10,-18); -> '-H' mysql> select CONV(10+"10"+'10'+0xa,10,10); -> '40' BIN(N) 返回二進制值N的一個字符串表示,在此N是一個長整數(BIGINT)數字,這等價於CONV(N,10,2)。若是N是NULL,返回NULL。 mysql> select BIN(12); -> '1100' OCT(N) 返回八進制值N的一個字符串的表示,在此N是一個長整型數字,這等價於CONV(N,10,8)。若是N是NULL,返回NULL。 mysql> select OCT(12); -> '14' HEX(N) 返回十六進制值N一個字符串的表示,在此N是一個長整型(BIGINT)數字,這等價於CONV(N,10,16)。若是N是NULL,返回NULL。 web
複製代碼 代碼示例:mysql> select HEX(255); -> 'FF' CHAR(N,...) CHAR()將參數解釋爲整數而且返回由這些整數的ASCII代碼字符組成的一個字符串。NULL值被跳過。 sql
複製代碼 代碼示例:mysql> select CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> select CHAR(77,77.3,'77.3'); -> 'MMM' CONCAT(str1,str2,...) 返回來自於參數連結的字符串。若是任何參數是NULL,返回NULL。能夠有超過2個的參數。一個數字參數被變換爲等價的字符串形式。 數據庫
複製代碼 代碼示例:mysql> select CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> select CONCAT('My', NULL, 'QL'); -> NULL mysql> select CONCAT(14.3); -> '14.3' LENGTH(str) OCTET_LENGTH(str) CHAR_LENGTH(str) CHARACTER_LENGTH(str) 返回字符串str的長度。 apache
複製代碼 代碼示例:mysql> select LENGTH('text'); -> 4 mysql> select OCTET_LENGTH('text'); -> 4 注意,對於多字節字符,其CHAR_LENGTH()僅計算一次。windows
LOCATE(substr,str) POSITION(substr IN str) 返回子串substr在字符串str第一個出現的位置,若是substr不是在str裏面,返回0.
複製代碼 代碼示例:mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0 該函數是多字節可靠的。 LOCATE(substr,str,pos) 返回子串substr在字符串str第一個出現的位置,從位置pos開始。若是substr不是在str裏面,返回0。
複製代碼 代碼示例:mysql> select LOCATE('bar', 'foobarbar',5); -> 7 這函數是多字節可靠的。
INSTR(str,substr) 返回子串substr在字符串str中的第一個出現的位置。這與有2個參數形式的LOCATE()相同,除了參數被顛倒。
複製代碼 代碼示例:mysql> select INSTR('foobarbar', 'bar'); -> 4 mysql> select INSTR('xbar', 'foobar'); -> 0 這函數是多字節可靠的。
LPAD(str,len,padstr) 返回字符串str,左面用字符串padstr填補直到str是len個字符長。
複製代碼 代碼示例:mysql> select LPAD('hi',4,'??'); -> '??hi' RPAD(str,len,padstr) 返回字符串str,右面用字符串padstr填補直到str是len個字符長。
複製代碼 代碼示例:mysql> select RPAD('hi',5,'?'); -> 'hi???' LEFT(str,len) 返回字符串str的最左面len個字符。
複製代碼 代碼示例:mysql> select LEFT('foobarbar', 5); -> 'fooba' 該函數是多字節可靠的。
RIGHT(str,len) 返回字符串str的最右面len個字符。
複製代碼 代碼示例:mysql> select RIGHT('foobarbar', 4); -> 'rbar' 該函數是多字節可靠的。
SUBSTRING(str,pos,len) SUBSTRING(str FROM pos FOR len) MID(str,pos,len) 從字符串str返回一個len個字符的子串,從位置pos開始。使用FROM的變種形式是ANSI SQL92語法。
複製代碼 代碼示例:mysql> select SUBSTRING('Quadratically',5,6); -> 'ratica' 該函數是多字節可靠的。
SUBSTRING(str,pos) SUBSTRING(str FROM pos) 從字符串str的起始位置pos返回一個子串。
複製代碼 代碼示例:mysql> select SUBSTRING('Quadratically',5); -> 'ratically' mysql> select SUBSTRING('foobarbar' FROM 4); -> 'barbar'
poi讀時間
用POI讀取Excel數據:(版本號:POI3.7) 一、讀取Excel private List<String[]> rosolveFile(InputStream is, String suffix, int startRow) throws IOException, FileNotFoundException { Workbook xssfWorkbook = null; if ("xls".equals(suffix)) { xssfWorkbook = new HSSFWorkbook(is); } else if ("xlsx".equals(suffix)) { xssfWorkbook = new XSSFWorkbook(is); } Sheet xssfSheet = xssfWorkbook.getSheetAt(0); if (xssfSheet == null) { return null; } ArrayList<String[]> list = new ArrayList<String[]>(); int lastRowNum = xssfSheet.getLastRowNum(); for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) { if (xssfSheet.getRow(rowNum) != null) { Row xssfRow = xssfSheet.getRow(rowNum); short firstCellNum = xssfRow.getFirstCellNum(); short lastCellNum = xssfRow.getLastCellNum(); if (firstCellNum != lastCellNum) { String[] values = new String[lastCellNum]; for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) { Cell xssfCell = xssfRow.getCell(cellNum); if (xssfCell == null) { values[cellNum] = ""; } else { values[cellNum] = parseExcel(xssfCell); } } list.add(values); } } } return list; }
二、Excel數據處理:
Excel存儲日期、時間均以數值類型進行存儲,讀取時POI先判斷是是不是數值類型,再進行判斷轉化
一、數值格式(CELL_TYPE_NUMERIC):
1.純數值格式:getNumericCellValue() 直接獲取數據
2.日期格式:處理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判斷是不是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
2).判斷是日期或者時間
cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
OR: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")
3.自定義日期格式:處理yyyy年m月d日,h時mm分,yyyy年m月等含文字的日期格式
判斷cell.getCellStyle().getDataFormat()值,解析數值格式
yyyy年m月d日----->31
m月d日---->58
h時mm分--->32
二、字符格式(CELL_TYPE_STRING):直接獲取內容 private String parseExcel(Cell cell) { 2. String result = new String(); 3. switch (cell.getCellType()) { 4. case HSSFCell.CELL_TYPE_NUMERIC:// 數字類型 5. if (HSSFDateUtil.isCellDateFormatted(cell)) {// 處理日期格式、時間格式 6. SimpleDateFormat sdf = null; 7. if (cell.getCellStyle().getDataFormat() == HSSFDataFormat 8. .getBuiltinFormat("h:mm")) { 9. sdf = new SimpleDateFormat("HH:mm"); 10. } else {// 日期 11. sdf = new SimpleDateFormat("yyyy-MM-dd"); 12. } 13. Date date = cell.getDateCellValue(); 14. result = sdf.format(date); 15. } else if (cell.getCellStyle().getDataFormat() == 58) { 16. // 處理自定義日期格式:m月d日(經過判斷單元格的格式id解決,id的值是58) 17. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 18. double value = cell.getNumericCellValue(); 19. Date date = org.apache.poi.ss.usermodel.DateUtil 20. .getJavaDate(value); 21. result = sdf.format(date); 22. } else { 23. double value = cell.getNumericCellValue(); 24. CellStyle style = cell.getCellStyle(); 25. DecimalFormat format = new DecimalFormat(); 26. String temp = style.getDataFormatString(); 27. // 單元格設置成常規 28. if (temp.equals("General")) { 29. format.applyPattern("#"); 30. } 31. result = format.format(value); 32. } 33. break; 34. case HSSFCell.CELL_TYPE_STRING:// String類型 35. result = cell.getRichStringCellValue().toString(); 36. break; 37. case HSSFCell.CELL_TYPE_BLANK: 38. result = ""; 39. default: 40. result = ""; 41. break; 42. } 43. return result; 44. }
*萬能處理方案:
全部日期格式均可以經過getDataFormat()值來判斷
yyyy-MM-dd----- 14
yyyy年m月d日--- 31
yyyy年m月------- 57
m月d日 ---------- 58
HH:mm----------- 20
h時mm分 ------- 32
//一、判斷是不是數值格式 2.if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){ 3. short format = cell.getCellStyle().getDataFormat(); 4. SimpleDateFormat sdf = null; 5. if(format == 14 || format == 31 || format == 57 || format == 58){ 6. //日期 7. sdf = new SimpleDateFormat("yyyy-MM-dd"); 8. }else if (format == 20 || format == 32) { 9. //時間 10. sdf = new SimpleDateFormat("HH:mm"); 11. } 12. double value = cell.getNumericCellValue(); 13. Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value); 14. result = sdf.format(date); 15.}
POI經過getDateCellValue讀取日期 在使用POI解析excel日期單元格時出現了一個問題,經過getDateCellValue獲取到的時間不對:都是1900年的日期,可筆者已經將日期單元格格式設置爲日期格式,爲何讀取時間不對呢?
最終發現是excel自身的問題,通過跟蹤獲取了該單元格如下數據:
<xml-fragment r="G6" s="3" t="s"xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <main:v>20</main:v> </xml-fragment>
正確的是:
<xml-fragment r="G3" s="3" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:x14="http://schemas.microsoft.com/office/spreadsheetml/2009/9/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:main="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> <main:v>42685</main:v> </xml-fragment>
相信你們能夠看到區別了:產生問題的根源在於雖然設置了該excel單元格爲日期格式,並且跟蹤調試,發現POI讀取該單元格的CellStyle調用getDataFormatString方法返回結果爲[$-17804]yyyy/m/d;@,可是最奇怪的地方在於經過getCellType獲取該單元格的格式倒是:HSSFCell.CELL_TYPE_STRING
謎底揭開:雖然咱們經過office設置該單元格爲日期格式,可是該單元格格式依然是HSSFCell.CELL_TYPE_STRING(字符串)格式,因此經過getDateCellValue獲取到的日期不對,筆者還發現:在日期單元格按下回車鍵後,該單元格由最初的左對齊(字符串默認對齊方式)變爲右對齊(日期默認對齊方式),變爲右對齊後再經過getDateCellValue就能獲取到正確的日期,這算是POI與EXcel兼容不太好的地方
另外, 用PageOffice也能夠獲取excel文件中的數據,獲取的日期是字符串類型的,再用java轉一下格式就ok, 相對來講,用PageOffice不須要針對xls和xlsx寫不一樣的代碼,在這點上比POI方便不少
linux 下調用Java AWT拋出java.awt.HeadlessException異常解決辦法
1、問題描述
一時興起,想寫一個手機遠程控制電腦的軟件程序,因而用Java寫了一個服務器端的程序,用android寫了客服端的程序,剛開始把服務器端在windows下運行,一切正常。但當把java服務器端的程序運行在linux下,問題出現了,因爲個人服務器端的程序須要截取電腦屏幕,要使用awt,但運行程序會拋出:
Exception in thread "main" java.awt.HeadlessException at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204) at java.awt.Window.<init>(Window.java:536) at java.awt.Frame.<init>(Frame.java:420)
at Test.main(Test.java:6)
這個異常, 因而上網搜索什麼是headless異常,終於在orancle的官網(http://www.oracle.com/technetwork/articles/javase/headless-136834.html)上找到了答案。
瞭解了無頭模式以後,我覺得我找到了問題的根源,個人linux用的是fedroa發行版,是有圖形界面、顯示屏、鼠標的,我是不須要使用Headless模式的,因而火燒眉毛的在程序的運行的首行添加System.setProperty("java.awt.headless", "false");運行程序發現依然拋出上面的那個異常。
這我就鬱悶了,按道理說應該沒問題了呀!我很不甘心,因而又設置成System.setProperty("java. awt.headless", "true");
此次程序又拋出了一個錯誤,只不過此次的錯誤有點不一樣:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) at java.lang.Runtime.load0(Runtime.java:809) at java.lang.System.load(System.java:1086) at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1842) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at java.awt.Toolkit$3.run(Toolkit.java:1640) at java.awt.Toolkit$3.run(Toolkit.java:1638) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Toolkit.loadLibraries(Toolkit.java:1637) at java.awt.Toolkit.<clinit>(Toolkit.java:1672) at java.awt.Component.<clinit>(Component.java:593) at Test.main(Test.java:6)
上面的錯誤代表/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/這個路徑下的ibawt_headless.so文件有問題,因而我cd 這個目錄下卻發現根本沒有這個文件。而後我就在openjdk的解壓縮文件夾的jre/lib/amd64/找到了這個文件,我把它複製到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/路徑下。再次運行程序,發現成功了,個人窗口、面板、控件一會兒都出如今眼前。而後我覺得問題解決了,就沒再深刻研究。
次日,我又在linux下用Java寫了一個awt程序,此次因爲粗心沒有在程序運行首行設置System.setProperty("java. awt.headless", "true");但我運行程序發現依然能夠調出窗口,控件。而後我加上這句代碼,依然運行成功,而後我有把模式設置成System.setProperty("java. awt.headless", "false"); 依然運行成功。而後我把/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/路徑下的ibawt_headless.so文件刪除,再次運行程序發現不設置setProperty或則System.setProperty("java. awt.headless", "false")時,程序運行正常。當System.setProperty("java. awt.headless", "ture")時,程序會拋出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so錯誤。
2、問題解決
咱們來總結一下上面的問題,咱們先約定"不設置"表明程序運行時沒有System.setProperty,「false」表明程序運行時System. setProperty("java.awt.headless", "false"),「true」表明程序運行時System.setProperty("java. awt.headless", "true");
首次調用openjdk的awt時:
不設置:拋出 java.awt.HeadlessException
false:拋出 java.awt.HeadlessException
true:拋出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk- 1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so錯誤
複製libawt_headless.so文件到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/下:
不設置:運行正常
false:運行正常
true: 運行正常
刪除libawt_headless.so文件運行:
不設置:運行正常
false:運行正常
true:拋出java.lang.UnsatisfiedLinkError: Can't load library: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/libawt_headless.so錯誤
而後我把libawt_headless.so複製到/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.60-14.b27.fc23.x86_64/jre/lib/amd64/下,如今我不管我是如何運行awt程序,都是正常的。但對於爲何我第一次調用openjdk的awt時一直拋出java.awt.HeadlessException這個異常我還沒弄清楚,我想了很久我軟件安裝應該是沒有問題的,應該是我安裝的openjdk開源的版本有問題,當時是在開源社區下的rpm包,不知道使用官方的軟件包是否有問題。
另見:http://dikar.iteye.com/blog/1417625
要提升SQL查詢效率where語句條件的前後次序應如何寫
咱們要作到不但會寫SQL,還要作到寫出性能優良的SQL語句。
(1)選擇最有效率的表名順序(只在基於規則的優化器中有效):
Oracle的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最早處理,在FROM子句中包含多個表的狀況下,你必須選擇記錄條數最少的表做爲基礎表。若是有3個以上的錶鏈接查詢, 那就須要選擇交叉表(intersection table)做爲基礎表, 交叉表是指那個被其餘表所引用的表。
(2)WHERE子句中的鏈接順序:
Oracle採用自下而上的順序解析WHERE子句,根據這個原理,表之間的鏈接必須寫在其餘WHERE條件以前, 那些能夠過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾。 中.國.站長站
(3)SELECT子句中避免使用‘*’:
Oracle在解析的過程當中, 會將‘*’依次轉換成全部的列名, 這個工做是經過查詢數據字典完成的, 這意味着將耗費更多的時間。
(4)減小訪問數據庫的次數:
Oracle在內部執行了許多工做: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數據塊等。
(5)在SQL*Plus , SQL*Forms和Pro*C中從新設置ARRAYSIZE參數, 能夠增長每次數據庫訪問的檢索數據量 ,建議值爲200。
(6)使用DECODE函數來減小處理時間:
使用DECODE函數能夠避免重複掃描相同記錄或重複鏈接相同的表。
(7)整合簡單,無關聯的數據庫訪問:
若是你有幾個簡單的數據庫查詢語句,你能夠把它們整合到一個查詢中(即便它們之間沒有關係)。
(8)刪除重複記錄:
最高效的刪除重複記錄方法 ( 由於使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
(9)用TRUNCATE替代DELETE:
當刪除表中的記錄時,在一般狀況下, 回滾段(rollback segments ) 用來存放能夠被恢復的信息. 若是你沒有COMMIT事務,ORACLE會將數據恢復到刪除以前的狀態(準確地說是恢復到執行刪除命令以前的情況) 而當運用TRUNCATE時, 回滾段再也不存聽任何可被恢復的信息。當命令運行後,數據不能被恢復.所以不多的資源被調用,執行時間也會很短。(TRUNCATE只在刪除全表適 用,TRUNCATE是DDL不是DML)。 Chinaz_com
(10)儘可能多使用COMMIT:
只要有可能,在程序中儘可能多使用COMMIT, 這樣程序的性能獲得提升,需求也會由於COMMIT所釋放的資源而減小,COMMIT所釋放的資源:
a. 回滾段上用於恢復數據的信息。
b. 被程序語句得到的鎖。
c. redo log buffer 中的空間。 Chinaz@com
d. Oracle爲管理上述3種資源中的內部花費。
(11)用Where子句替換HAVING子句:
避免使用HAVING子句,HAVING 只會在檢索出全部記錄以後纔對結果集進行過濾。這個處理須要排序,總計等操做。若是能經過WHERE子句限制記錄的數目,那就能減小這方面的開銷。(非 oracle中)on、where、having這三個均可以加條件的子句中,on是最早執行,where次之,having最後,由於on是先把不符合 條件的記錄過濾後才進行統計,它就能夠減小中間運算要處理的數據,按理說應該速度是最快的,where也應該比having快點的,由於它過濾數據後才進 行sum,在兩個表聯接時才用on的,因此在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的狀況下,若是要過濾的條件沒有涉及 到要計算字段,那它們的結果是同樣的,只是where可使用rushmore技術,而having就不能,在速度上後者要慢若是要涉及到計算的字段,就 表示在沒計算以前,這個字段的值是不肯定的,根據上篇寫的工做流程,where的做用時間是在計算以前就完成的,而having就是在計算後才起做用的, 因此在這種狀況下,二者的結果會不一樣。在多表聯接查詢時,on比where更早起做用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再 由where進行過濾,而後再計算,計算完後再由having進行過濾。因而可知,要想過濾條件起到正確的做用,首先要明白這個條件應該在何時起做 用,而後再決定放在那裏。
(12)減小對錶的查詢:
在含有子查詢的SQL語句中,要特別注意減小對錶的查詢。例子: Chinaz
SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECTTAB_NAME,DB_VER FROM TAB_COLUMNS WHERE VERSION = 604)
(13)經過內部函數提升SQL效率:
複雜的SQL每每犧牲了執行效率。可以掌握上面的運用函數解決問題的方法在實際工做中是很是有意義的。
(14)使用表的別名(Alias):
當在SQL語句中鏈接多個表時, 請使用表的別名並把別名前綴於每一個Column上。這樣一來,就能夠減小解析的時間並減小那些由Column歧義引發的語法錯誤。 Chinaz_com
(15)用EXISTS替代IN、用NOT EXISTS替代NOT IN:
在許多基於基礎表的查詢中,爲了知足一個條件,每每須要對另外一個表進行聯接。在這種狀況下,使用EXISTS(或NOT EXISTS)一般將提升查詢的效率。在子查詢中,NOT IN子句將執行一個內部的排序和合並。不管在哪一種狀況下,NOT IN都是最低效的 (由於它對子查詢中的表執行了一個全表遍歷)。爲了不使用NOT IN ,咱們能夠把它改寫成外鏈接(Outer Joins)或NOT EXISTS。
例子:
(高效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')(低效)SELECT * FROM EMP (基礎表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')
(16)識別‘低效執行’的SQL語句:
雖然目前各類關於SQL優化的圖形化工具層出不窮,可是寫出本身的SQL工具來解決問題始終是一個最好的方法:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS>0 AND BUFFER_GETS > 0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 ORDER BY 4 DESC;
索引是表的一個概念部分,用來提升檢索數據的效率,Oracle使用了一個複雜的自平衡B-tree結構。一般,經過索引查詢數據比全表掃描要快。當 Oracle找出執行查詢和Update語句的最佳路徑時, Oracle優化器將使用索引。一樣在聯結多個表時使用索引也能夠提升效率。另外一個使用索引的好處是,它提供了主鍵(primary key)的惟一性驗證。那些LONG或LONG RAW數據類型, 你能夠索引幾乎全部的列。一般, 在大型表中使用索引特別有效. 固然,你也會發現, 在掃描小表時,使用索引一樣能提升效率。雖然使用索引能獲得查詢效率的提升,可是咱們也必須注意到它的代價。索引須要空間來存儲,也須要按期維護, 每當有記錄在表中增減或索引列被修改時, 索引自己也會被修改。這意味着每條記錄的INSERT,DELETE , UPDATE將爲此多付出四、 5次的磁盤I/O 。由於索引須要額外的存儲空間和處理,那些沒必要要的索引反而會使查詢反應時間變慢。按期的重構索引是有必要的:
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
(18)用EXISTS替換DISTINCT:
當提交一個包含一對多表信息(好比部門表和僱員表)的查詢時,避免在SELECT子句中使用DISTINCT。通常能夠考慮用EXIST替換, EXISTS 使查詢更爲迅速,由於RDBMS核心模塊將在子查詢的條件一旦知足後,馬上返回結果。例子:
(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO = E.DEPT_NO (高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
(19)SQL語句用大寫的;由於Oracle老是先解析SQL語句,把小寫的字母轉換成大寫的再執行。
(20)在Java代碼中儘可能少用鏈接符「+」鏈接字符串。
(21)避免在索引列上使用NOT一般,咱們要避免在索引列上使用NOT, NOT會產生在和在索引列上使用函數相同的影響。當Oracle「遇到」NOT,他就會中止使用索引轉而執行全表掃描。
(22)避免在索引列上使用計算。WHERE子句中,若是索引列是函數的一部分。優化器將不使用索引而使用全表掃描。
低效: SELECT … FROM DEPT WHERE SAL * 12 > 25000; 高效: SELECT … FROM DEPT WHERE SAL > 25000/12;
(23)用>=替代>:
高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3
二者的區別在於,前者DBMS將直接跳到第一個DEPT等於4的記錄然後者將首先定位到DEPTNO=3的記錄而且向前掃描到第一個DEPT大於3的記 錄。
(24)用UNION替換OR (適用於索引列):
一般狀況下,用UNION替換WHERE子句中的OR將會起到較好的效果。對索引列使用OR將形成全表掃描。注意,以上規則只針對多個索引列有效。若是有 column沒有被索引,查詢效率可能會由於你沒有選擇OR而下降。在下面的例子中,LOC_ID 和REGION上都建有索引。
高效:SELECT LOC_ID 。 LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE REGION = 「MELBOURNE」
低效: SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = 「MELBOURNE」
(25)用IN來替換OR:
這是一條簡單易記的規則,可是實際的執行效果還須檢驗,在Oracle8i下,二者的執行路徑彷佛是相同的:
低效:
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效:
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);
(26)避免在索引列上使用IS NULL和IS NOT NULL:
避免在索引中使用任何能夠爲空的列,Oracle將沒法使用該索引。對於單列索引,若是列包含空值,索引中將不存在此記錄。對於複合索引,若是每一個列都爲 空,索引中一樣不存在此記錄。若是至少有一個列不爲空,則記錄存在於索引中。舉例:若是惟一性索引創建在表的A列和B列上,而且表中存在一條記錄的A,B 值爲(123,null), Oracle將不接受下一條具備相同A,B值(123,null)的記錄(插入)。 然而若是全部的索引列都爲空,Oracle將認爲整個鍵值爲空而空不等於空。所以你能夠插入1000 條具備相同鍵值的記錄,固然它們都是空! 由於空值不存在於索引列中,因此WHERE子句中對索引列進行空值比較將使ORACLE停用該索引。
低效: (索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效:(索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0; 站長.站
(27)老是使用索引的第一個列:
若是索引是創建在多個列上,只有在它的第一個列(leading column)被where子句引用時,優化器纔會選擇使用該索引。這也是一條簡單而重要的規則,當僅引用索引的第二個列時,優化器使用了全表掃描而忽略 了索引。
(28)用UNION-ALL 替換UNION ( 若是有可能的話):
當SQL語句須要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合併,而後在輸出最終結果前進行排序。若是用UNION ALL替代UNION,這樣排序就不是必要了。效率就會所以獲得提升。須要注意的是,UNION ALL 將重複輸出兩個結果集合中相同記錄。所以各位仍是要從業務需求分析使用UNION ALL的可行性。 UNION 將對結果集合排序,這個操做會使用到SORT_AREA_SIZE這塊內存。對於這塊內存的優化也是至關重要的。下面的SQL能夠用來查詢排序的消耗量: Www.Chinaz.com
低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95'
(29)用WHERE替代ORDER BY:
ORDER BY 子句只在兩種嚴格的條件下使用索引。
ORDER BY中全部的列必須包含在相同的索引中並保持在索引中的排列順序。
ORDER BY中全部的列必須定義爲非空。
WHERE子句使用的索引和ORDER BY子句中所使用的索引不能並列。
例如: 表DEPT包含如下列:
DEPT_CODE PK NOT NULL
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效: (索引不被使用)
SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE
高效: (使用索引)
SELECT DEPT_CODE FROM DEPT WHERE DEPT_TYPE > 0
(30)避免改變索引列的類型:
當比較不一樣數據類型的數據時, ORACLE自動對列進行簡單的類型轉換。 假設 EMPNO是一個數值類型的索引列:SELECT … FROM EMP WHERE EMPNO = ‘123'。 實際上,通過Oracle類型轉換, 語句轉化爲: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 。
幸運的是,類型轉換沒有發生在索引列上,索引的用途沒有被改變。如今,假設EMP_TYPE是一個字符類型的索引列:SELECT … FROM EMP WHERE EMP_TYPE = 123 。
這個語句被Oracle轉換爲: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123。由於內部發生的類型轉換, 這個索引將不會被用到! 爲了不Oracle對你的SQL進行隱式的類型轉換,最好把類型轉換用顯式表現出來。注意當字符和數值比較時,Oracle會優先轉換數值類型到字符類 型。
(31)須要小心的WHERE子句:
某些SELECT 語句中的WHERE子句不使用索引。這裏有一些例子:
(1)‘!=' 將不使用索引。記住, 索引只能告訴你什麼存在於表中, 而不能告訴你什麼不存在於表中。
(2)‘||'是字符鏈接函數。就象其餘函數那樣, 停用了索引。
(3)‘+'是數學函數。就象其餘數學函數那樣, 停用了索引。
(4)相同的索引列不能互相比較,這將會啓用全表掃描。
(32)a. 若是檢索數據量超過30%的表中記錄數,使用索引將沒有顯著的效率提升。
b. 在特定狀況下,使用索引也許會比全表掃描慢,但這是同一個數量級上的區別。而一般狀況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
(33)避免使用耗費資源的操做:
帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啓動SQL引擎執行耗費資源的排序(SORT)功能。DISTINCT須要一次排序操做,而其餘的至少須要執行兩次排序。一般,帶有 UNION, MINUS , INTERSECT的SQL語句均可以用其餘方式重寫。若是你的數據庫的SORT_AREA_SIZE調配得好。使用UNION , MINUS, INTERSECT也是能夠考慮的, 畢竟它們的可讀性很強。
(34)優化GROUP BY:
提升GROUP BY 語句的效率,能夠經過將不須要的記錄在GROUP BY 以前過濾掉。下面兩個查詢返回相同結果但第二個明顯就快了許多。
低效: SELECT JOB , AVG(SAL) FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' 高效: SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' GROUP JOB
一個值爲 true 或者 false 的表達式。若是須要,非 Boolean 表達式也能夠被轉換爲 Boolean 值,可是要遵循下列規則: •全部的對象都被看成 true。 •當且僅當字符串爲空時,該字符串被看成 false。 •null 和 undefined 被看成 false。 •當且僅當數字爲零時,該數字被看成 false。
jsp中import 和jsp:usebean引用java類 兩種都有引入JavaBean的做用。 第一種是僅僅引入JAVABEAN,不作操做。 <%@page import="com.OrderType"%> 第二種是引入之後,還要進行初始化!分配內存空間, <jsp:useBean id="type" scope="page" class="com.OrderType"></jsp:useBean> 至關於 com.OrderType type=new com.OrderType();
document.onclick不起做用: 禁用騰訊的一個加載項解決的。 這個加載項在「工具」——「Internet 選項」——「程序」下面的「管理加載項」中叫「AccountProtectBHO Class」,禁用了就能夠 禁用它或者把document.onclick 改爲document.body.onclick
Oracle 查看錶空間的大小及使用狀況sql語句
--一、查看錶空間的名稱及大小 SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.tablespace_name GROUP BY t.tablespace_name; --二、查看錶空間物理文件的名稱及大小 SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space FROM dba_data_files ORDER BY tablespace_name; --三、查看回滾段名稱及大小 SELECT segment_name, tablespace_name, r.status, (initial_extent / 1024) initialextent, (next_extent / 1024) nextextent, max_extents, v.curext curextent FROM dba_rollback_segs r, v$rollstat v WHERE r.segment_id = v.usn(+) ORDER BY segment_name; --四、查看控制文件 SELECT NAME FROM v$controlfile; --五、查看日誌文件 SELECT MEMBER FROM v$logfile; --六、查看錶空間的使用狀況 SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name FROM dba_free_space GROUP BY tablespace_name; SELECT a.tablespace_name, a.bytes total, b.bytes used, c.bytes free, (b.bytes * 100) / a.bytes "% USED ", (c.bytes * 100) / a.bytes "% FREE " FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = c.tablespace_name; --七、查看數據庫庫對象 SELECT owner, object_type, status, COUNT(*) count# FROM all_objects GROUP BY owner, object_type, status; --八、查看數據庫的版本 SELECT version FROM product_component_version WHERE substr(product, 1, 6) = 'Oracle'; --九、查看數據庫的建立日期和歸檔方式 SELECT created, log_mode, log_mode FROM v$database;
--1G=1024MB --1M=1024KB --1K=1024Bytes --1M=11048576Bytes --1G=1024*11048576Bytes=11313741824Bytes SELECT a.tablespace_name "表空間名", total "表空間大小", free "表空間剩餘大小", (total - free) "表空間使用大小", total / (1024 * 1024 * 1024) "表空間大小(G)", free / (1024 * 1024 * 1024) "表空間剩餘大小(G)", (total - free) / (1024 * 1024 * 1024) "表空間使用大小(G)", round((total - free) / total, 4) * 100 "使用率 %" FROM (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name
String path=request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
response.setContenttype("image/jpeg");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
try{
InputStream is=this.getServletContext().getResourceAsStream("image/1.jpg");
OutputStream os=response.getOutputStream();
byte[] data=new byte[0124];
int length=-1;
while((length=is.read(data))!=-1){
os.write(data,0,length);
}
os.flush();
os.close();
is.close();
}catch(exception e){
e.printStackTrace();
}
環境安裝:
1.eclipse-svn 插件 或 serena 的eclipse-dimensions插件
2.svn客戶端
3.
4.plsqldeveloper及instantclient(即時客戶端)安裝,配置環境變量
4.sqldeveloper
6.filezilla
7.secureCRT
7.BeyondCompare 及BCformats.bcpkg插件(對比.class)
9.everything
10.FastStone Capture
11.反編譯工具
web容器,web服務器,ejb容器
AS-IS: WEB:Oracle iPlanet Web Server WAS:WLS DB:ORALCE
TO_BE: WEB:Apache 2.2 WAS:Wildfly 10.1 DB:postgreSQL
postgreSQL uuid函數 http://www.cnblogs.com/xinyaping/archive/2011/04/26/2089080.html postgreSQL pgcrypto 加密 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763104297354505c1622bd7a7452189c65f931358454671e3cc767f4f19839b21321cee0f0facab676f310127b29fcd884fddb991282e882331761b834515d104bb8e1b65972fd20ffeae69b6fabb70d5f3&p=c06d8415d9c043ae07be9b7c594881&newp=9357841a86cc42ad59aec62d021488231610db2151d4d3136b82c825d7331b001c3bbfb423241503d2c6776c04af495aeaf13d71350523a3dda5c91d9fb4c57479cb75&user=baidu&fm=sc&query=pgcrypto&qid=db736c9e00021777&p1=1 PostgreSQL pgcrypto模塊加密解密函數 http://blog.csdn.net/baiyinqiqi/article/details/46548555