作者存档
201311 月20

新鲜出炉:百度电视云V3.2.2评测

电视型号:创维4K ,39E780U

分辨率:4096×2160

网络链接:有线链接,20M电信光纤

USB:外接2T移动硬盘

1、图片

打开速度很快,无bug,建议按时间倒序排序(或按菜单选择排序方式)。

2、音乐

网盘音乐:列表空白,什么也没有?网盘里明明有几百首。(已绑定帐号)

在线音乐:音乐不能播放。播放不了会自动跳转到下一首,自动跳了几首都不能播放后,按“返回”到歌曲界面,按任何键都没有反应,等半天只有强制关机。歌曲界面“播放”和按钮背景错位。

3、电影

网盘视频:和音乐一样,列表空白啥也木有。加载半天没任何反应,退不出界面,只有按“主页”强制退出。

电影:介绍界面上“收藏”按钮文字和背景错位。《金刚》电影不能播放,其他电影能播放但按“菜单”没有像其他客户端那样有清晰度选项,视频清晰度比其他TV客户端都低。播放比较流畅。按“返回”退出播放,弹出的确定或取消,“确定”文字不显示。

电视剧:介绍界面上的“选集”功能设计的不好,占用了这个屏幕,不像其他客户端那样合理方便。“收藏”按钮文字和背景错位。按“返回”退出播放,弹出的确定或取消,“确定”文字不显示。看《我们结婚吧》半小时左右,中途毫无征兆的自动退出播放,到介绍界面去了。

视频播放:不知道连续长时间播放会不会出现其他TV客户端出现的短暂音画不同步的情况?按这么低的清晰度来说,应该不会出现吧,但队友4K电视来说,这些视频分辨率也太寒碜了。另外能增加电视直播功能、英雄联盟比赛直播等功能就太好了。

4、以下是运行截图

2013-11-20 185200
电视上已安装的软件。
2013-11-20 185221

百度电视云主界面。

 

2013-11-20 185250

设置界面。

 

2013-11-20 185456

照片,速度很快。

 

2013-11-20 185834

网盘音乐空白。

 

2013-11-20 185906

在线音乐按钮太小,错位。

 

2013-11-20 185932

 

在线音乐不能播放,返回后死机。

 

2013-11-20 190303

 

网盘视频空白。

 

2013-11-20 190549

 

在线视频界面。

 

2013-11-20 190605

 

电影介绍,收藏按钮有问题。

 

2013-11-20 190825

 

退出播放,按钮变形。

 

2013-11-20 191510

电视剧介绍界面选集覆盖了整个屏幕,设计不太合理。

 

201311 月20

SSH:id元素中的generator

<id>元素中的<generator>用来为该持久化类的实例生成唯一的标识,hibernate提供了很多内置的实现。

Increment:由hibernate自动递增生成标识符,用于为long, short或者int类型生成唯一标识。
identity :由底层数据库生成标识符(自动增长),返回的标识符是 long, short 或者int类型的。
sequence :hibernate根据底层数据库序列生成标识符,返回的标识符 是long, short或者 int类型的。

hilo     :使用一个高/低位算法来高效的生成long, short 或者int类型的标识符。
uuid.hex :用一个128-bit的UUID算法生成32位字符串类型的标识符。
native   :根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned :让应用程序在save()之前为对象分配一个标示符。
foreign :使用另外一个相关联的对象的标识符。和<one-to-one>联合一起使用。

201311 月19

Java 加Filter过滤器的时候一定记得设置编码格式

package web;

import web.sys.Globals;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

public class SqlFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
	req.setCharacterEncoding("GBK");
        res.setCharacterEncoding("GBK");
        //获得所有请求参数名
        Enumeration params = req.getParameterNames();

        String sql = "";
        while (params.hasMoreElements()) {
            //得到参数名
            String name = params.nextElement().toString();
            //得到参数对应值
            String[] value = req.getParameterValues(name);
            for (int i = 0; i < value.length; i++) {
                sql = sql + value[i];
            }
        }

        //有sql关键字,跳转到error.html
        if (sqlValidate(sql)) {
            res.sendRedirect("/"+Globals.APP_BASE_NAME+"/include/404error.html");
            //String ip = req.getRemoteAddr();
        } else {
            chain.doFilter(req, res);
        }
    }

    //效验
    protected static boolean sqlValidate(String str) {
        str = str.toLowerCase();//统一转为小写
        String badStr = "and|exec|execute|insert|create|drop|table|from|grant|use|" +
                "group_concat|column_name|information_schema.columns|table_schema|" +
                "where|select|delete|update|order|by|*|chr|char" +
                "|declare|;|--|+|,|%|#";//过滤掉的sql关键字,可以手动添加  qxmore000400010009
        String[] badStrs = badStr.split("\\|");

        for (int i = 0; i < badStrs.length; i++) {
            if (str.indexOf(badStrs[i]) != -1) {

                return true;
            }
        }
        return false;
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    public void destroy() {
        //throw new UnsupportedOperationException("Not supported yet.");
    }
}
201311 月7

JS+CSS 幻灯片下载效果非常好

QQ截图20131107163030

使用时候注意两处,
一是图片宽度、高度要固定,
二是如果图片宽度变了,那s.js也要改成一样的。

下载地址:

http://pan.baidu.com/s/1eiYiz

201311 月7

三星GT-P6200 4.0.4国行固件下载

文件名称:Samsung-Updates.com-GT-P6200-CHN-P6200ZCLPR-1363586771

国行Android 4.0.4 版本,,,逛了一圈论坛,要么收费(鄙视之),要么不能用会变砖,,自己从官网翻,墙下到的固件,分享一下。

 

http://yun.baidu.com/s/1h6JRR

 

 

 

201311 月4

创维4K电视 TV客户端使用体验及汇总下载

目前市面上的智能电视、4K电视,多采用Android 4.0以上版本系统,这给电视上安装各类应用提供了可能。

下面我来像大家介绍一下,截至目前各类软件的使用体验,当然软件是逐步升级完善的,文中提到的缺陷可能在下个版本解决。

以下介绍已通过楼主亲身体验测试,电视型号:创维39E780U  4K电视 Android 4.0系统。

Top 1 :优酷机顶盒客户端

下载地址:http://mobile.youku.com/index/wireless

推荐理由:运行稳定、支持各类电视遥控器、登陆后可与电脑手机同步观看记录、自动跳过片头片尾、自动播放到上一次观看时间点。运行稳定是最重要的一点,搜索功能强大,视频内容和网站同步。

缺点:可能是电视处理器和内存较低的原因,偶尔会出现音画不同步停顿几秒后就正常的情况。这个情况在我的电视上,不同的客户端软件都出现,应该是电视的原因。

Top 2 :转屏助手

下载地址:http://tt.showkey.tv/

推荐理由:非常方便,支持电驴、磁力链地址, BT种子上传,在线视频网站地址云端转码,无需下载。

缺点:播放种子视频和迅雷云播关联很大,要是迅雷云播服务器挂了(一般不会挂),就不能播放了。对有些视频支持不是太好,可能会自动退出播放。

Top 3 :电驴大全HD

下载地址:http://www.verycd.com/app/

推荐理由:运行稳定,集成各视频网站资源,做了比较合理的分类梳理,可以看海贼王。

Top 4 :PPTV聚力 HD

下载地址:http://yun.baidu.com/s/19rfzm

推荐理由:运行稳定,内容丰富。

缺点:菜单图标较大,浏览查找内容没优酷那么方便。官方不提供TV版本下载,说是集成在盒子里,所以需要提取软件。

Top 5:搜狐视频TV版

下载地址:http://yun.baidu.com/s/19rfzm

推荐理由:运行稳定。

缺点:切换菜单有点慢,视频内容较少。

Top 6 :MoreTV

下载地址:http://www.moretv.com.cn/plus/view.php?aid=22

推荐理由:视频资源丰富。

缺点:界面菜单没有优酷设计的那么合理。

Top 7:小鹰直播

下载地址:http://eagleapp.tv/

推荐理由:电视直播资源丰富,视频源可用率较高。

缺点:有些电视台清晰度较低,画质和卫星锅差不多。

Top 8:泰捷视频、阿狸直播

下载地址:泰捷视频  http://www.togic.com/livetv 阿狸直播 http://down.7po.com/alizhibo/1-1.html

推荐理由:电视直播资源丰富。

缺点:在我的电视上运行不太稳定,直播资源打不开的时候会导致电视死机重启。

其他运行稳定的视频软件:

1、BiliBili弹幕网客户端 http://www.bilibili.tv/

其他目前运行不稳定、还不成熟但具有潜力的视频软件:

1、迅雷云播:http://vip.xunlei.com/app/android/?dlxunlei

迅雷的资源丰富大家都很清楚,和转屏助手一样方便(转屏助手是基于迅雷云播的资源做的),官方没有出TV专用客户端。

2、百度云电视:http://tv.baidu.com/

百度的电视客户端,百度大家都知道,但百度云电视目前是小作坊产品,使用还不方便,BUG也很多。希望后期能发力,潜力巨大。

3、爱奇艺影视、PPTV等视频网站客户端,没有还没有针对电视的版本,待发展有,但是集成在盒子里布公开下载地址可恶啊,爱奇艺和创维搞创维盒子,PPTV被苏宁收购也搞集成,比起优酷来真是倒退。

4、乐视TV客户端,从乐视盒子中破解提取出,菜单和播放器不能自适应4K屏幕,首页视频不能播放的bug。

 

PS:2013-11-07 更新内容

 

从乐视盒子提取出的TV客户端不能自适应4K分辨率,还有bug。

搜狐的TV客户端做得比较稳定,但加载慢而且内容不丰富。

PPTV HD内容和速度都不错,但界面菜单似乎设计的不太好,不方便找内容。还是优酷给力。

以上三个客户端下载地址:

http://yun.baidu.com/s/19rfzm

 

 2013-11–11 更新:

终于找到一款更好的直播软件——VST全聚合,不用忍受泰捷视频的死机、小鹰直播的视频源无法打开等问题,还有几个高清频道,比如湖南卫视HD。问题是除了看电视还行,其他的功能都是鸡肋,迅雷云播获取不到列表、电影电视基本上打开就报错退出。。就不能有一款如优酷运行那么稳定的直播软件么。。。

201310 月29

电信光纤猫 中兴F660 超级密码破解方法

cmd
telnet 192.168.1.1
root
root
sendcmd 1 DB p UserInfo

看telecomadmin后面8位数,就是超级密码
201310 月24

Discuz! X2.5 修改管理员密码的方法

在网站根目录下的子目录uc_server/data中打开找到文件config.inc.php
以及 config/config_global.php、config/config_ucenter.php (这两个如果没有下面代码可以不用修改)
找到类似以下代码:
define(‘UC_FOUNDERPW’, ’256955f2e034sad74f0e2953572ea360′);
define(‘UC_FOUNDERSALT’, ’217804′);

然后用以下代码替换
define(‘UC_FOUNDERPW’, ’047099adb883dc19616dae0ef2adc5b6′);
define(‘UC_FOUNDERSALT’, ’311254′);

修改完后,Ucenter创始人的密码就变为: 123456789

201310 月24

创维4K电视:ROOT局域网远程安装软件教程

楼主电视型号:创维39E780U  4K电视

软件下载地址:

http://pan.baidu.com/s/1BZZAY

经过验证,优酷TV客户端、Bilibili 弹幕网客户端  最稳定,但后者列表字体过小。
MoreTV、小鹰直播、泰捷电视,大部分情况下可用,但如果视频打不开容易把电视搞死机。

百度云、迅雷云播,目前还不稳定,百度云不能播放,迅雷云很卡。
1 2 3

优酷TV客户端下载:

http://mobile.youku.com/index/wireless  优酷机顶盒客户端

使用教程:

1、将电视和路由器通过有线或者是无线连接到同一个路由器(路由的LAN 口IP建议使用默认如果不是默认请改为192.168.1.1 或192.168.0.1

2、电脑端运行安装工具 无标题-1.jpg ,该工具可以在广东分公司服务部技术联盟群下载。

3、双击打开工具

无标题-2.jpg

4、查看电视端获取到网络的IP 在光标闪烁处输入IP(电视IP 查看在电视的网络设置)回车键确认

无标题-3.jpg

5、输入1 回车注意提示如果显示unable to 就表示没有连接上电视需要检查一下网络连接如果没有问题可以再重新连接一次

无标题-4.jpg

6、如果连接成功会出现下图所示connected to 输入1 回车键确认

无标题-5.jpg

7、如果连接正常程序会自动调出APK 安装器,点击设备管理,选中你的电视。

无标题-6.jpg

8、将下载好的APK 文件拖入APK 安装器如果安装到机身内存请去掉优先安装到SD 卡上。建议外接优盘或SD 卡安装到外挂存储。

无标题-7.jpg

9、安装过程中

无标题-8.jpg

10、安装完成就可以在电视我的应用里面出现刚才安装的应用程序也可以点击APK 安装器的立即运行电视端运行应用建议使用鼠标操作电视。左键确定右键退出。

无标题-9.jpg

11、建议电视安装一个安卓市场TV版,或者乐视TV 应用然后就可以在应用商场里面管理应用下载海量应用。

12、由于CPU 架构的不同和机器配置的差异。和应用的繁杂不保证所有程序都可以在电视上运行,ARM 架构的CPU 兼容的程序较多,同时安装的应用大多都是针对手机开发的。是否可以正常运行需要实践安装检验。

201310 月9

Java 数字图形验证码源码

package web.common.util;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author Wizzer.cn
 * @time   2012-9-13 上午10:54:04
 *
 */
public class ImageUtil extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private static final String CONTENT_TYPE = "image/jpeg;charset=GB2312";
	private static final String allcode[] = { "0", "1", "2", "3", "4", "5",
			"6", "7", "8", "9" };

	private static final Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体

	public static Font IFont = new Font("宋体", Font.PLAIN, 18);// 设置字体

	public static int x = 10; // 坐标
	public static int y = 10;

	public void init() throws ServletException {
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType(CONTENT_TYPE);
		ServletOutputStream out = response.getOutputStream();
		getImage(out, request, response);
		out.close();
	}

	private void getImage(ServletOutputStream out, HttpServletRequest request,
			HttpServletResponse response) {
		try {

			HttpSession session = request.getSession(true);

			response.setContentType("image/gif");
			response.setHeader("Pragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache");
			response.setDateHeader("Expires", 0);
			int width = 60, height = 20;

			BufferedImage image = new BufferedImage(width, height,
					BufferedImage.TYPE_INT_RGB); // 设置图片大小的
			Graphics gra = image.getGraphics();
			Random random = new Random();

			gra.setColor(getRandColor(200, 250)); // 设置背景色
			gra.fillRect(0, 0, width, height);

			gra.setColor(Color.black); // 设置字体色
			gra.setFont(mFont);

			// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到

			for (int i = 0; i < 100; i++) {
				gra.setColor(getRandColor(120, 220));
				x = random.nextInt(width);
				y = random.nextInt(height);
				int xl = random.nextInt(12);
				int yl = random.nextInt(12);
				gra.drawLine(x, y, x + xl, y + yl);
			}

			// 取随机产生的认证码(4位)
			String sRand = "";
			for (int i = 0; i < 4; i++) {
				String rand = allcode[random.nextInt(10)];
				sRand += rand;
				// 将认证码显示到图象中
				gra.setColor(new Color(20 + random.nextInt(110), 20 + random
						.nextInt(110), 20 + random.nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
				gra.drawString(rand, 13 * i + 6, 12 + random.nextInt(5));
			}
			session.setAttribute("ValidateCode", sRand);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			encoder.encode(image);
			out.close();

		} catch (Exception e) {
			e.printStackTrace();

		}
	}

	static Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色

		Random random = new Random();
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	public static Font getIFont() {
		return IFont;
	}

	public static void setIFont(Font IFont) {
		ImageUtil.IFont = IFont;
	}

	public static int getY() {
		return y;
	}

	public static void setY(int y) {
		ImageUtil.y = y;
	}

	public static int getX() {
		return x;
	}

	public static void setX(int x) {
		ImageUtil.x = x;
	}

}

若提示找不到包:

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

则做如下修改即可:

Eclipse 默认把这些受访问限制的API设成了ERROR。

只要把 Deprecated and restricted API中的Forbidden references(access rules) 选为Warning 就可以编译通过。

QQ截图20131009111758

201310 月8

自定义EditText实现信纸效果

自定义EditText实现信纸效果

作者:wtmdbf 

一、引言

用户在提交表单的时候,我们可能会希望展示一个美观的输入框,以提升用户体验。

二、效果

图片说明文字

三、实现细节

读者可以看到就是给EditText设置一个黄色的背景,然后给每一行添加一个下划线。为了看出不同,我们这里拿android提供的notepad这个demo的效果来做下比较,下面是notepad的截图
图片说明文字

从从上可以看出,notepad的下划线是在产生新的行以后才绘制出来的,为了读者阅读的方便,我把notepad的源码贴出来如下:

public static class LinedEditText extends EditText {
        private Rect mRect;
        private Paint mPaint;

        // This constructor is used by LayoutInflater
        public LinedEditText(Context context, AttributeSet attrs) {
            super(context, attrs);

            // Creates a Rect and a Paint object, and sets the style and color of the Paint object.
            mRect = new Rect();
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(0x800000FF);
        }

        /**
         * This is called to draw the LinedEditText object
         * @param canvas The canvas on which the background is drawn.
         */
        @Override
        protected void onDraw(Canvas canvas) {

            // Gets the number of lines of text in the View.
            int count = getLineCount();

            // Gets the global Rect and Paint objects
            Rect r = mRect;
            Paint paint = mPaint;

            /*
             * Draws one line in the rectangle for every line of text in the EditText
             */
            for (int i = 0; i < count; i++) {

                // Gets the baseline coordinates for the current line of text
                int baseline = getLineBounds(i, r);

                /*
                 * Draws a line in the background from the left of the rectangle to the right,
                 * at a vertical position one dip below the baseline, using the "paint" object
                 * for details.
                 */
                canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
            }

            // Finishes up by calling the parent method
            super.onDraw(canvas);
        }
    }

那是如何实现我所说的一开始就绘制好下划线的效果呢,在此之前,你需要了解如何在android中获得字体的高度,网上有很多,为了方便大家阅读特摘录如下,先看图:
图片说明文字
然后我们可以通过下面的代码获得字体大高度

Paint p = new Paint();  
p.setTextSize(50);  
p.setAntiAlias(true);  
FontMetrics fm = p.getFontMetrics();  
int textHeight = (int) (Math.ceil(fm.descent - fm.ascent) + 2);

读者了解了上面的知识点以后就可以,在看我是如何实现的。

基本思想是根据字体的高度,在view的对应位置上绘制好每条line,代码如下:

package com.example.customedittext;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.EditText;

public class CustomEditText extends EditText {

    private Paint mPaint;
    private int lines = 0;
    private float fontHeight = 0;
    private float leading = 0;

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initPaint();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
    }

    public CustomEditText(Context context) {
        super(context);
        initPaint();
    }

    private void initPaint() {
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.parseColor("#CDDCD5"));
        mPaint.setAntiAlias(true);
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        int lineHeight = getLineHeight();
        int viewHeight = getHeight();
        lines = viewHeight / lineHeight;
        setGravity(Gravity.TOP);
        float textSize = getTextSize();
        Paint paint = new Paint();
        paint.setTextSize(textSize);
        FontMetrics fontMetrics = paint.getFontMetrics();
        fontHeight = fontMetrics.descent - fontMetrics.ascent;
        leading = fontMetrics.leading;// leading == 0
        setBackgroundColor(Color.parseColor("#F8F6DF"));
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int count = getLineCount();
        if (count <= lines) {
            for (int i = 1; i < lines; i++) {

                canvas.drawLine(0, fontHeight * i + leading * i, getWidth(),
                        fontHeight * i + leading * i, mPaint);
            }
        } else {
            for (int i = 1; i < count; i++) {
                canvas.drawLine(0, fontHeight * i + leading * i, getWidth(),
                        fontHeight * i + leading * i, mPaint);
            }
        }
    }

}

四、存在的问题和遗留点

虽然最主要的效果已经实现了,但还有一些问题

  • 如何定义一个只能输入固定行数的EditText?
  • 细心的朋友会发现当输入的行数过多的时候会发现字体与横线的距离会发生偏差,原因是画出来的线不精确,如果按照android notepad那样绘制出来的线是精确的,但达不到我们一开始想要的那种效果,如何让我们的绘制更加精确,**热心的朋友如果知道或者有更好的方法的话,欢迎分享**?

原文作者: wtmdbf

原文地址: http://my.eoe.cn/readonly/archive/15757.html

20139 月24

Weblogic 数据入库时间晚8个小时

替换Weblogic 下 时区配置文件即可。

20138 月12

一直很安静……

 

忙着装修  忙着置办家当

新家暂时不能接宽带

于是  许久没更新网站了……

20137 月26

怪兽大学.HD.1024×548.中文字幕

磁力链地址:

 

magnet:?xt=urn:btih:9e3f26c45a4da68c7983dfa6cc126521073f5be8&dn=%E6%80%AA%E5%85%BD%E5%A4%A7%E5%AD%A6.HD.1024×548.%E4%B8%AD%E6%96%87%E5%AD%97%E5%B9%95

20136 月18

Oracle SQL 性能优化

Oracle 优化 说到底还是SQL语句的优化,你看人家用MYSQL照样跑千万级数据,一个小应用系统并发量还不及人家的万分之一,那为什么卡甚至程序down掉?转一篇文章来贴一下。

 

(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)
(10) 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
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语句中,要特别注意减少对表的查询.例子:
SELECT  TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT
TAB_NAME,DB_VER FROM  TAB_COLUMNS  WHERE  VERSION = 604)
(13) 通过内部函数提高SQL效率.:
复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的
(14) 使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
(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;

 

(17) 用索引提高效率:
索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 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”
如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.
(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可以用来查询排序的消耗量
低效:
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

 

 

转自:

http://www.cnblogs.com/rootq/archive/2008/11/17/1334727.html

 

20136 月14

《我叫MT》8区邀请ID :351107620

《我叫MT》online   8区邀请ID :351107620

 

悲催的是手机重刷固件,原来快满级的数据都没了,重新玩。。- –

 

20136 月8

逆光飞翔.BD.1280×720.国语中字 BT种子下载

《逆光飞翔》是张荣吉以《天黑》获得台北电影奖最佳剧情短片后,花两年时间重新打造的全新剧本,改编自真人真事,描述一名全盲钢琴家与梦想成为舞者的女孩,一段好友互相鼓励勇敢逐梦的历程。男女主角分别由台北电影节亚太影展双料影后张榕容、及故事主角黄裕翔真人演出,两人延续前作的绝佳默契,动人的化学变化揉合成一页温柔诗篇。

磁力链粘贴到迅雷下载:

magnet:?xt=urn:btih:26d9adc950d8d3ce66c26a792c5028b61d7813cd&dn=%E9%80%86%E5%85%89%E9%A3%9E%E7%BF%94.BD.1280×720.%E5%9B%BD%E8%AF%AD%E4%B8%AD%E5%AD%97

20136 月7

人体课

美院正在上人体课。 一女生画着画着,突然把笔扔在地上! 女生对男模怒斥道:“一会大一会小的,还TM让不让人画了!”

20136 月7

买辆兰博基尼

比尔盖茨要存钱买辆兰博基尼,1秒,2秒,3秒,4秒,5秒,哈哈存够了。 李嘉诚要存钱买辆博兰基尼,1小时,2小时,3小时,4小时,5小时,哈哈存够了。 当地首富要存钱买辆博兰基尼,1个月,2个月,3个月,4个月,5个月,存够了。 屌丝要存钱买辆博兰基尼,1辈子,2辈子,3辈子。。

20135 月27

高中晚自习逃课

高中晚自习逃课去校外广场打篮球,实在搞不过那些民间老大哥的肘击与腿拌。无奈退场却发现广场老年舞着实是个活动筋骨、延年益寿的好运动!于是每天都逃课去跳,也许我的舞蹈天赋过高,也许我的运动细胞过盛!不出两周我已然是前排的领舞人员。直到,我看到了我们教导主任被我妩媚妖娆的舞姿震惊的眼神,还有第二天全校间操时间对我批斗的言语!

“我们学校有人逃课去网吧,有人逃课去打球,这我们还可以接受,毕竟情有可原!可是!竟然有男同学逃课去跟老头老太太去跳老年舞的!来!有请二班体委XX谈谈他是怎么成为广场舞领舞人员的!”

场下沸腾了!我火了。。。