随记2

本节内容: 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

相关文章
相关标签/搜索