1. Oracle索引

    oracle的索引陷阱 一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle的索引限制造成的。 oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。 下面是一些常见的索引限制问题。   使用不等于操作符(<>, !=) 下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描 select * from dept where staff_num <> 1000; 但是开发中的确需要这样的查询,难道没有解决问题的办法了吗? 有! 通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。 select * from dept shere staff_num < 1000 or dept_id > 1000;   使用 is null 或 is not null 使用 is null 或is not null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。 解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null)   使用函数 如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引: select * from staff where trunc(birthdate) = '01-MAY-82'; 但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。 select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);   比较不匹配的数据类型 比较不匹配的数据类型也是难于发现的性能问题之一。 下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。 select * from dept where dept_id = 900198; 这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。 把SQL语句改为如下形式就可以使用索引 select * from dept where dept_id = '900198';      各种索引使用场合及建议   B*Tree索引 常规索引,多用于oltp系统,快速定位行,应建立于高cardinality列(即列的唯一值除以行数为一个很大的值,存在很少的相同值)。   Create index indexname on tablename(columnname[columnname...]) 反向索引。 B*Tree的衍生产物,应用于特殊场合,在ops环境加序列增加的列上建立,不适合做区域扫描。  Create index indexname on tablename(columnname[columnname...]) reverse 降序索引。 B*Tree的衍生产物,应用于有降序排列的搜索语句中,索引中储存了降序排列的索引码,提供了快速的降序搜索。   Create index indexname on tablename(columnname DESC[columnname...]) 位图索引。 位图方式管理的索引,适用于OLAP(在线分析)和DSS(决策处理)系统,应建立于低cardinality列, 适合集中读取,不适合插入和修改,提供比B*Tree索引更节省的空间。  Create BITMAP index indexname on tablename(columnname[columnname...]) 在实际应用中,如果某个字段的值需要频繁更新,那么就不适合在它上面创建位图索引。 在位图索引中,如果你更新或插入其中一条数值为N的记录, 那么相应表中数值为N的记录(可能成百上千条)全部被Oracle锁定, 这就意味着其它用户不能同时更新这些数值为N的记录,其它用户必须要等第一个用户提交后, 才能获得锁,更新或插入数据,bitmap index它主要用于决策支持系统或静态数据。 函数索引。 B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况, 索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。 索引创建策略 导入数据后再创建索引 不需要为很小的表创建索引 对于取值范围很小的字段(比如性别字段)应当建立位图索引 限制表中的索引的数目 为索引设置合适的PCTFREE值 存储索引的表空间最好单独设定 唯一索引和不唯一索引都只是针对B树索引而言. Oracle最多允许包含32个字段的复合索引 由此估计出一个查询如果使用某个索引会需要读入的数据块块数。 需要读入的数据块越多,则 cost 越大,Oracle 也就越有可能不选择使用 index   能用唯一索引,一定用唯一索引 能加非空,就加非空约束 一定要统计表的信息,索引的信息,柱状图的信息。 联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面 只有做到以上几点,数据库才会正确的选择执行计划。

    2017/02/12 iteye

  2. JDK小知识

    java文件编译时可以通过指定 -source 1.4选择用JDK 1.4编译源文件。这在系统只装了JDK5或者6时比较有用。

    2017/02/12 iteye

  3. Javascript中的undefined 和 null

    undefined undefined 在Javascript中是数据类型也是值 有两种情况下变量的类型是undefined,即通过typeof 变量名查看。 未声明的变量 声明过了未赋值的变量     null null在Javascript中是数据类型也是值,但如果用 typeof null 看类新的话看到的是 object。null值不是系统默认赋值的,而是programmer手工在代码中赋值的。

    2017/02/12 iteye

  4. windows下有用命令

    perfMon 图形显示CPU,内存,磁盘/网络 I/O使用情况 类似于Linux平台下的ps/top命令        

    2017/02/12 iteye

  5. 如何避免两个对象的相互引用引起的堆栈溢出

    两个对象相互引用,并且这种引用关系定义在构造函数中时,初始化这种对象会引起堆栈溢出。因为对象1的初始化调用了对象2的初始化,反之亦然。这样会构成死循环。解决方法是用一个无参数的构造函数代替。对象的引用依赖关系通过Set方法在对象初始化之后设置进去。当然一个缺点是需要注意无参数构造函数生成的对象是一个不完整的对象。

    2017/02/12 iteye

  6. 基于Web 的Service接口

    目前网络上有一些基于Web发布的Service接口,此处不一定特指基于SOAP的Web Service接口。大多时候我更喜欢暴露出一个URL,开发者传入查询参数返回XML或者jason数据的接口。比如:   Wiki接口   http://en.wiktionary.org/w/api.php?action=query&prop=revisions&titles=%s&rvprop=content&format=json   此处titles参数可以是任何Word,一个特殊的格式返回某天的特定单词是 Wiktionary:Word of the day/October 26 需要注意的是调用是需要通过Javascript的encodeURI或者encodeURLComponent进行编码。Wiktionary:Word of the day/October 26编码成以下两种都可以 encodeURL: Wiktionary:Word%20of%20the%20day/October%2021 encodeURLComponent: Wiktionary%3AWord+of+the+day%2FOctober+21     Google 天气   http://www.google.com/ig/api?weather=%s&hl=zh-cn 中国地区,weather参数可以是城市的拼音。如上海未来三天的天气预报: http://www.google.com/ig/api?weather=shanghai&hl=zh-cn     Yahoo 财经(股票数据) 返回的是CSV格式的。http://download.finance.yahoo.com/d/quotes.csv?f=sl1d1t1ohgv&e=.csv&s=IBM,NOK,HMC   Wikipedia   需要解析返回的网页文件(右侧的信息框,是一些三元组),不是直接的Web service接口 http://en.wikipedia.org/wiki/Nokia返回的是网页,三元组形式http://dbpedia.org/page/Nokia   Google Reader RSS export   https://www.google.com/reader/atom/feed/http://echohfut.iteye.com/rss?n=150  URL 中feed后面可以是其他RSS URL

    2017/02/12 iteye

  7. escape() encodeURI() encodeURIComponent

    这是Javascript中的三个对URL进行编码的方法,区别如下:   escape() 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / + encodeURL       把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '. 比如Wiktionary:Word of the day/October 21          会被编码成:Wiktionary:Word%20of%20the%20day/October%2021.这也是网络上基于Web的service接口(不一定是SOAP Web Service接口)所要求的调用接口,比如: http://en.wiktionary.org/w/api.php?action=query&prop=revisions&titles=Wiktionary:Word%20of%20the%20day/October%2021&rvprop=content&format=xml encodeURLComponent       把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) 

    2017/02/12 iteye

  8. Java正则表达式

    转自:http://hi.baidu.com/xu_yunan/blog/item/7ce5d93bb279d22c96ddd843.html 各种正则表达式实例 用户名 ^[a-z0-9_-]{3,15}$ ^ # 行开始 [a-z0-9_-] # 匹配列表中的字符,a-z,0–9,下划线,连字符 {3,15} # 长度至少3个字符,最大长度为15 $ # 行结束 密码 ((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20}) ( # 组开始 (?=.*\d) # 必须包含一个数字 0-9 (?=.*[a-z]) # 必须包含一个小写字符 (?=.*[A-Z]) # 必须包含一个大写字符 (?=.*[@#$%]) # 必须包含一个列表中的特殊字符"@#$%" . # 检查所有字符串与前面的条件的匹配 {6,20} # 长度至少为6个字符,最大长度为20 ) # 组结束 16进制颜色 ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$ ^ # 行开始 # # 必须包含一个"#"符号 ( # 组#1开始 [A-Fa-f0-9]{6} # 列表中的任意字符串,长度为6 | # 或者 [A-Fa-f0-9]{3} # 列表中的任意字符串,长度为3 ) # 组#1结束 $ # 行结束 Email ^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ ^ # 行开始 [_A-Za-z0-9-]+ # 必须以中括号中的字符为起始字符[],必须包含一个或多个(+) ( # 组#1开始 \\.[_A-Za-z0-9-]+ # 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+) )* # 组#1结束, 这个组是可选的(*) @ # 必须包含一个"@"符号 [A-Za-z0-9]+ # 接下来是中括号内的字符[],必须包含一个或者多个(+) ( # 组 #2开始 – 一级TLD检查 \\.[A-Za-z0-9]+ # 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+) )* # 组#2结束,这个组是可选的(*) ( # 组#3开始 – 二级TLD检查 \\.[A-Za-z]{2,} # 接下来是一个点"."和中括号内的字符[], 最小长度为2 ) # 组#3结束 $ # 行结束 图像文件 ([^\s]+(\.(?i)(jpg|png|gif|bmp))$) ( # 组#1开始 [^\s]+ # 必须包含一个或更多的任意字符(除了空格) ( # 组#2开始 \. # 接下来是一个点"." (?i) # 忽略后边字符的大小写检查 ( # 组#3开始 jpg # 包含字符"jpg" | # ..或者 png # 包含字符"png" | # .. 或者 gif # 包含字符"gif" | # .. 或者 bmp # 包含字符"bmp" ) # 组#3结束 ) # 组#2结束 $ # 字符串的结束 ) # 组#1结束 补充一个:[\\s\\S]*?([^\\/]*?\\.jpg) IP地址 ^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$ ^ # 行开始 ( # 组#1开始 [01]?\\d\\d? # 可以是1到2个数字. 如果出现3个数字, 必须以0或者1开始 # 例如 ([0-9], [0-9][0-9],[0-1][0-9][0-9]) | # ...或者 2[0-4]\\d # 以2开始, 紧跟着是0-4,并且以任意数字结尾(2[0-4][0-9]) | # ...或者 25[0-5] # 以2开始, 紧跟着是5,并且以0-5结尾 (25[0-5]) ) # 组#1结束 \. # 接下来是点"." .... # 重复3次 (3x) $ # 行结束 12-小时制时间 (1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm) ( # 组#1开始 1[012] # 以10, 11, 12开始 | # 或者 [1-9] # 以1,2,...9开始 ) # 组#1结束 : # 接下来是一个冒号 (:) [0-5][0-9] # 接下来是0..5和0..9,意思是00到59 (\\s)? # 接下来是一个空格(可选) (?i) # 下面的检查不区分大小写 (am|pm) # 接下来是AM或者PM 24小时制时间正则表达式模式 ([01]?[0-9]|2[0-3]):[0-5][0-9] ( # 组#1开始 [01]?[0-9] # 以0-9,1-9,00-09,10-19开始 | # 或者 2[0-3] # 以20-23开始 ) # 组#1结束 : # 接下来是一个冒号(:) [0-5][0-9] # 接下来是0..5和0..9,意思是00到59 日期格式 (dd/mm/yyyy) 正则表达式模式 (0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d) ( # 组#1开始 0?[1-9] # 01-09或者1-9 | # ..或者 [12][0-9] # 10-19或者20-29 | # ..或者 3[01] # 30, 31 ) # 组#1结束 / # 接下来是一个"/" ( # 组#2开始 0?[1-9] # 01-09或者1-9 | # ..或者 1[012] # 10,11,12 ) # 组#2结束 / # 接下来是一个"/" ( # 组#3开始 (19|20)\\d\\d # 19[0-9][0-9]或者20[0-9][0-9] ) # 组#3结束 HTML标签 <("[^"]*"|'[^']*'|[^'">])*> < # 以"<"标签开始 ( # 组#1开始 "[^"]*" # 只允许两个双引号成对出现-"string" | # ..或者 '[^']*' # 只允许两个单引号成对出现- 'string' | # ..或者 [^'">] # 不能出现单独的双引号、单引号和">" ) # 组#1结束 * # 0次或多次 > # 以结束标签">"结束 HTML中的A标签正则表达式模式 (?i)<a([^>]+)>(.+?) (              # 组#1开始 ?i            #   所有的检查区分大小写 )              # 组#1结束 <a             # 以"<a"开始 (            # 组#2开始 [^>]+       # 除了(">")之外的任意字符,至少一个字符 )            # 组#2结束 >            #     接下来是">" (.+?)       #       匹配所有 </a>   #         以"</a>结束 提取HTML链接正则表达式模式 \s*(?i)href\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+)); \s*                          # 可以以空格开始 (?i)                       #   所有的检查是区分大小写的 href                    #     接下来是一个"href"字 \s*=\s*              #       等号两边都允许空格, (              #         组#1开始 "([^"]*")     #           只允许2个双引号成对出现 - "string" |             #           ..或者 '[^']*'       #           只允许2个单引号成对出现 - 'string' |             #           ..或者 ([^'">]+) #           或者不允许出现单独的单引号、双引号和">" )             #         组#1结束

    2017/02/12 iteye