FetchMode.JOIN FetchMode.SELECT FetchMode.SUBSELECT 的区别
- 格式:docx
- 大小:14.71 KB
- 文档页数:1
PDO配置及使⽤⽅法■PDO为何物?POD(PHP Data Object)扩展在PHP5中加⼊,PHP6中将默认识⽤PDO连接数据库,所有⾮PDO扩展将会在PHP6被从扩展中移除。
该扩展提供PHP内置类 PDO来对数据库进⾏访问,不同数据库使⽤相同的⽅法名,解决数据库连接不统⼀的问题。
我是配置在windows下做开发⽤的。
■PDO的⽬标提供⼀种轻型、清晰、⽅便的 API统⼀各种不同 RDBMS 库的共有特性,但不排除更⾼级的特性。
通过 PHP 脚本提供可选的较⼤程度的抽象/兼容性。
■PDO的特点:性能。
PDO 从⼀开始就吸取了现有数据库扩展成功和失败的经验教训。
因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利⽤ PHP 5 的最新特性。
能⼒。
PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的⽅便访问。
简单。
PDO 旨在使您能够轻松使⽤数据库。
API 不会强⾏介⼊您的代码,同时会清楚地表明每个函数调⽤的过程。
运⾏时可扩展。
PDO 扩展是模块化的,使您能够在运⾏时为您的数据库后端加载驱动程序,⽽不必重新编译或重新安装整个 PHP 程序。
例如,PDO_OCI 扩展会替代 PDO 扩展实现 Oracle 数据库 API。
还有⼀些⽤于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。
■安装PDO版本要求:php5.1以及以后版本的程序包⾥已经带了;php5.0.x则要到下载,放到你的扩展库,就是PHP所在的⽂件夹的ext⽂件夹下;⼿册上说5.0之前的版本不能运⾏PDO扩展。
配置(Windows):修改你的php.ini配置⽂件,使它⽀持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调⽤你的phpinfo()函数所显⽰的那个php.ini)把extension=php_pdo.dll前⾯的分号去掉,分毫是php配置⽂件注释符号,这个扩展是必须的。
python的mysql-connector和pymysql pip3 install pymysql# 导⼊pymysql模块import pymysql# 连接databaseconn = pymysql.connect(host=“你的数据库地址”,user=“⽤户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到⼀个可以执⾏SQL语句的光标对象cursor = conn.cursor() # 执⾏完毕返回的结果集默认以元组显⽰# 得到⼀个可以执⾏SQL语句并且将结果作为字典返回的游标#cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 定义要执⾏的SQL语句sql = """CREATE TABLE USER1 (id INT auto_increment PRIMARY KEY ,name CHAR(10) NOT NULL UNIQUE,age TINYINT NOT NULL)ENGINE=innodb DEFAULT CHARSET=utf8; #注意:charset='utf8' 不能写成utf-8"""# 执⾏SQL语句cursor.execute(sql)# 关闭光标对象cursor.close()# 关闭数据库连接conn.close()execute帮我们做字符串拼接# 将以下代码sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)res=cursor.execute(sql)# 改为sql="select * from userinfo where name=%s and password=%s"#%s需要去掉引号,pymysql会⾃动加上res=cursor.execute(sql,[user,pwd])import pymysqlconn = pymysql.connect(host='192.168.0.103',port=3306,user='root',password='123',database='xing',charset='utf8')# 获取⼀个光标cursor = conn.cursor()# 定义要执⾏的sql语句sql = 'insert into userinfo(user,pwd) values(%s,%s);' data = [('july', '147'),('june', '258'),('marin', '369')]# 拼接并执⾏sql语句cursor.executemany(sql, data)# 涉及写操作要注意提交mit()# 关闭连接cursor.close()conn.close()import pymysqlconn =pymysql.connect(host ='192.168.0.103',port = 3306,user = 'root',password ='123',database ='xing',charset ='utf8')cursor =conn.cursor() #获取⼀个光标sql ='insert into userinfo (user,pwd) values (%s,%s);' name = 'wuli'pwd = '123456789'cursor.execute(sql, [name, pwd])mit()cursor.close()conn.close()import pymysql# 建⽴连接conn = pymysql.connect(host="192.168.0.103",port=3306,user="root",password="123",database="xing",charset="utf8")# 获取⼀个光标cursor = conn.cursor()# 定义将要执⾏的SQL语句sql = "insert into userinfo (user, pwd) values (%s, %s);" name = "wuli"pwd = "123456789"# 并执⾏SQL语句cursor.execute(sql, [name, pwd])# 涉及写操作注意要提交mit()# 关闭连接# 获取最新的那⼀条数据的IDlast_id = strowidprint("最后⼀条数据的ID是:", last_id)cursor.close()conn.close()import pymysql# 建⽴连接conn = pymysql.connect(host="192.168.0.103",port=3306,user="root",password="123",database="xing",charset="utf8")# 获取⼀个光标cursor = conn.cursor()# 定义将要执⾏的SQL语句sql = "delete from userinfo where user=%s;"name = "june"# 拼接并执⾏SQL语句cursor.execute(sql, [name])# 涉及写操作注意要提交mit()# 关闭连接cursor.close()conn.close()import pymysql# 建⽴连接conn = pymysql.connect(host="192.168.0.103",port=3306,user="root",password="123",database="xing",charset="utf8")# 获取⼀个光标cursor = conn.cursor()# 定义将要执⾏的SQL语句sql = "update userinfo set pwd=%s where user=%s;" # 拼接并执⾏SQL语句cursor.execute(sql, ["july", "july"])# 涉及写操作注意要提交mit()# 关闭连接cursor.close ()conn.close ()import pymysqlconn = pymysql.connect (host='192.168.0.103',port=3306,user='root',password='123',database='xing',charset='utf8')# 获取⼀个光标cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 返回字典数据类型# 定义将要执⾏的sql语句sql = 'select user,pwd from userinfo;'# 拼接并执⾏sql语句cursor.execute(sql)# 取到查询结果ret1 = cursor.fetchone() # 取⼀条ret2 = cursor.fetchmany(3) # 取三条ret3 = cursor.fetchone() # 取⼀条cursor.close()conn.close()print(ret1)print(ret2)print(ret3) # 可以获取指定数量的数据cursor.fetchmany(3)# 光标按绝对位置移动1cursor.scroll(1, mode="absolute")# 光标按照相对位置(当前位置)移动1cursor.scroll(1, mode="relative")import pymysql# 建⽴连接conn = pymysql.connect(host="192.168.0.103",port=3306,user="root",password="123",database="xing",charset="utf8")# 获取⼀个光标cursor = conn.cursor()# 定义将要执⾏的SQL语句sql1 = "insert into userinfo (user, pwd) values (%s, %s);"sql2 = "insert into hobby (id, hobby) values (%s,%s);"user = "july1"pwd = "july1"id = "我是错误的id" #id = "3"hobby = "打游戏"try:# 拼接并执⾏SQL语句cursor.execute(sql1, [user, pwd])print(sql1)cursor.execute(sql2, [id, hobby]) # 报错的SQL语句# 涉及写操作注意要提交mit()except Exception as e:print(str(e))# 有异常就回滚conn.rollback()# 关闭连接cursor.close()conn.close()python -m pip install mysql-connector连接MySQL 主要是使⽤mysql.connector模块的connect函数,需要注意参数的名称。
oracle fetch用法Fetch语句是Oracle数据库中的一种关键字,用于从游标中检索数据行。
在编写存储过程或批处理操作时,Fetch语句可以帮助您一次处理一行数据,从而提高操作效率。
以下是Oracle Fetch用法的详细解释:语法Fetch语句的语法如下:FETCH {FIRST|NEXT} [n] {ROW|ROWS} ONLY;其中,FIRST和NEXT关键字表示您要检索的是第一行还是下一行数据。
n表示要检索的行数,ROW或ROWS关键字表示检索行的单位。
例子以下是一个简单的Fetch语句示例:DECLARECURSOR c1 IS SELECT empno, ename FROM emp;emp_rec c1%ROWTYPE;BEGINOPEN c1;FETCH c1 INTO emp_rec;WHILE c1%FOUND LOOPDBMS_OUTPUT.PUT_LINE(emp_rec.empno || ' ' ||emp_rec.ename);FETCH c1 INTO emp_rec;END LOOP;CLOSE c1;END;在此示例中,我们使用了一个名为c1的游标来选择emp表中的empno和ename列。
FETCH语句将选择的数据行存储在emp_rec变量中,然后使用WHILE循环逐个检索数据行,并在每个迭代中输出empno 和ename到控制台上。
最后,使用CLOSE语句关闭游标。
注意事项在使用Fetch语句时,请注意以下几点:1. 检查游标是否已打开,如果没有,则需要使用OPEN语句打开它。
2. 确保您已经为所选列中的每个数据行指定了足够的变量。
3. 如果您要检索的数据行数少于指定的行数,则Fetch语句将返回零行。
4. 如果您要检索的数据行数多于指定的行数,则Fetch语句将返回指定数目的行数,并将游标定位在下一行。
结论Fetch语句是一种在Oracle数据库中检索数据行的强大工具。
数据库fetch用法在数据库中,`fetch` 是一个用来检索数据的操作。
具体用法根据不同的数据库系统可能会有差别,下面是一般的用法。
在 SQL 中,`fetch` 是一个用来获取查询结果行的命令。
使用`fetch`命令通常需要搭配`SELECT`语句和`FROM`语句。
在查询结果集返回多行的情况下,可以使用 `fetch` 命令来逐行获取数据。
具体的语法是:```FETCH {FIRST | NEXT} [num] {ROW | ROWS} ONLY```其中,`FIRST` 和 `NEXT` 关键字用来指定获取的是第一行还是下一行数据;`num` 参数表示指定获取多少行数据;`ROW` 和 `ROWS` 关键字用来指定获取的是一行还是多行数据;`ONLY` 关键字用来指定只获取指定行数的数据。
示例:```FETCH FIRST 5 ROWS ONLY; -- 获取第一行到第五行数据FETCH NEXT 10 ROWS ONLY; -- 获取下一行到第十一行数据```需要注意的是,不同的数据库系统可能对 `fetch` 命令的语法有所差异,具体用法需要根据所用数据库系统的文档进行查阅。
在 Python 的数据库操作中,`fetch` 是一个用来从结果集中获取数据的方法。
具体的用法会根据使用的数据库库而有所差异。
一般来说,可以使用 `fetchone()` 方法获取一行数据,使用`fetchall()` 方法获取所有数据。
示例:```import sqlite3conn = sqlite3.connect('example.db')cursor = conn.cursor()cursor.execute('SELECT * FROM users')rows = cursor.fetchall()for row in rows:print(row)conn.close()```这个示例中,首先通过 `execute()` 方法执行了一个 `SELECT`查询,并使用 `fetchall()` 方法获取了所有的结果。
一般地,greenplum的每个segment节点对应一个网口NIC,一个物理CPU,一个磁盘控制器,以便同机器的多个segment之间互不影响。
greenplum的备份,提供了gp_dump做并行备份,master和segment节点同时执行备份操作,另外gp_crondump会定期执行备份操作;支持PostgreSQL的pg_dump和pg_dumpall命令,但是其将所有的数据写成一个文件保存在master上,使用受限。
(在白皮书的第21章节备份与恢复有详细描述)在master节点的$MASTER_DATA_DIRECTORY目录下,pg_hba.conf文件保存了主机远程访问策略;postgresql.conf文件配置了数据库运行的参数。
greenplum数据库的启动gpstart,关闭gpstop,重启gpstop -r,强制关闭gpstop -f ,修改参数后不重启DB加载参数gpstop -u ,仅启动mastergpstart -m;在master节点修改postgresql.conf文件,想所有segment同时修改postgresql.conf文件的操作是:gpssh -f ~/seg_hosts "echo 'parameter=value' | cat - >> /gpdata/p*/*/postgresql.conf"--------------------------------------------------------------------------------------------------------------用greenplum实现mapreduce:INPUT部分将输入拆分成(key,value)对儿,送给MAP部分;MAP部分将其生成新的(key,output_list)对儿,然后送给reduce部分;由reduce部分安照key分组运算得到结果。
mybatis fetchsize用法一、背景介绍MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
在 MyBatis 中,fetchsize 是一个非常重要的属性,它决定了数据库的批量取数大小。
在使用 MyBatis 进行数据库操作时,合理设置 fetchsize 属性能够显著提高查询效率。
二、基本概念1. Fetch 策略:MyBatis 中的 fetch 策略用于控制关联查询的使用方式。
MyBatis 支持 FetchType.DEFAULT、FetchType.JOIN 和FetchType.SELECT 的策略。
默认的 fetch 策略是FetchType.DEFAULT,它表示只有当父查询返回一条记录时,子查询才会执行。
如果需要多次执行子查询,需要设置 FetchType 为其他两种策略。
2. FetchSize:FetchSize 是 fetch 策略中的一个属性,它表示一次从数据库获取的数据记录数。
FetchSize 的值应该是一个大于零的正整数,通常建议设置为较小的数值,以避免内存溢出。
三、用法详解1. 在映射文件中设置:可以在 MyBatis 的映射文件中,通过`<resultMap>` 标签的 `fetchSize` 属性来设置。
例如:```xml<resultMap id="example" type="Example"><result property="data" column="data_column"fetchSize="10"/>```上面的配置表示每次从数据库获取的数据记录数为 10 条。
2. 在代码中设置:也可以在代码中通过 SqlSession 的配置来设置 fetchsize。
例如:```javaSession session = sessionFactory.openSession(connection);session.setFetchSize(10); // 设置 fetchsize 为 10```上面的代码将 fetchsize 设置为 10,表示每次从数据库获取的数据记录数为 10 条。
ansible-copyfetch模块使⽤⽅法应⽤1. copy模块将ansible主机上的⽂件拷贝到远程主机2. fetch模块将远程主机上的⽂件拉取到ansible主机参数src:指定拉取或拷贝的⽂件,适⽤于copy|fetchdest:指定存放的位置,适⽤于copy|fetchcontent:指定远程主机⽂件的内容,⽽不是拷贝⽂件到远程主机上,仅限copyforce:当远程主机已存在同名⽂件时,yes强制覆盖,no不会执⾏覆盖操作,默认yesbackup:当远程主机已存在同名⽂件时,yes先备份再拷贝owner:指定⽂件属主group:指定⽂件属组mode:指定⽂件权限⽰例copy模块:1. 将/opt/test⽂件拷贝到远程主机/opt/test⽬录下,若有同名⽂件则先备份,属主test,权限644]# ansible all -m copy -a 'src=/opt/test dest=/opt/test/ backup=yes owner=test mode=0644'2. 在远程主机/opt/test⽬录下⽣成test⽂件,内容是第⼀⾏1234,第⼆⾏5678]# ansible all -m copy -a 'content="1234\n5678" dest=/opt/test/test'fetch模块:1. 将远程主机192.168.153.130/opt/test/test⽂件拉取到ansible主机/opt⽬录下]# ansible 192.168.153.130 -m fetch -a 'src=/opt/test/test dest=/opt/'。
oracle fetch用法fetch是Oracle中用于从结果集中获取下一行记录的命令,主要用于游标的操作。
fetch命令可以用于游标的打开、定义、声明、使用等过程中,是一种非常重要的语句。
下面就让我们来详细了解一下Oracle的fetch用法吧。
1. fetch命令的基本语法fetch命令的基本语法如下:FETCH {[NEXT] | [PRIOR]} {[rownum] | [cursor_name]} INTO {variable_list};其中,fetch关键字表示获取下一行数据,next或prior关键字表示获取下一行或上一行的数据。
rownum或cursor_name表示指定获取的行数或游标名称。
variable_list表示指定获取数据的变量列表,可以是一个或多个变量,用逗号分隔。
2. 使用fetch命令获取数据fetch命令的使用非常灵活,可以在游标声明时就开始使用,也可以在游标打开后再使用。
下面我们就具体看一下fetch命令的应用。
2.1 在游标声明时使用fetch语法示例:DECLAREcursor_name CURSOR FOR SELECT column_list FROM table_name; variable1 datatype1;variable2 datatype2;BEGINOPEN cursor_name;FETCH cursor_name INTO variable1, variable2;CLOSE cursor_name;END;在游标声明时使用fetch,可以直接获取第一行数据。
在上面的示例中,我们先定义了一个名为cursor_name的游标,然后定义了一个变量列表,用于存储获取的数据。
在游标打开后,使用fetch命令获取第一行数据,并将数据存储到变量列表中。
如果需要获取多行数据,可以使用循环结构来实现。
2.2 在游标打开后使用fetch语法示例:DECLAREcursor_name CURSOR FOR SELECT column_list FROM table_name; variable1 datatype1;variable2 datatype2;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO variable1, variable2;EXIT WHEN cursor_name%NOTFOUND;-- process dataEND LOOP;CLOSE cursor_name;END;在游标打开后使用fetch,可以获取游标指向的下一行数据。
ecmall方法文档ecmall/eccore /ecmall.php常量:define('START_TIME', ecm_microtime());/* 判断请求方式*/define('IS_POST', (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST'));//判断请求方式是不是post传来的./* 判断请求方式*/define('IN_ECM', true);/* 定义PHP_SELF常量*/define('PHP_SELF', htmlentities(isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']-));/* 当前ECMall程序版本*/define('VERSION', '2.2 beta');/* 当前ECMall程序Release */define('RELEASE', '20091230');类ECMall方法startup(config = array())类object方法_error($msg,$obg = '')has_error()//检测是否存在错误get_error()//获取错误列表类Lang方法&get($key='')//获取指定键的语言项load($lang_file)//加载指定的语言至全局语言数据中fetch($lang_file)//获取一个语言文件的内容lang_file($file)类Conf方法load($conf)get($key = '')&v($is_new = false, $engine = 'default')//获取试图连接&m($model_name, $params = array(), $is_new = false)//获取一个模型&bm($model_name, $params = array(), $is_new = false)//获取一个业务模型c(&$app)//获取当前控制器实例&cc()import()//导入一个类strtokey($str,$owner = '')//将default.abc类的字符串转为$default['abc'];trace($var)//跟踪调试dump($arr)//rdump的别名rdump($arr)//格式化显示出变量vdump(arr)//格式化并显示出变量类型&db()//创建MySQL数据库对象实例get_domain()//获得当前的域名size_url()//获得网站的URL地址sub_str($string, $length = 0, $append = true)//截取UTF-8编码下字符串的函数real_ip()//获得用户的真实IP地址is_email($user_email)//验证输入的邮件地址是否合法is_time($time)//检查是否为一个合法的时间格式gd_version()获得服务器上的GD 版本addslashes_deep($value)//递归方式的对变量中的特殊字符进行转义addslashes_deep_obj($obj)//将对象成员变量挥着输注的特殊字符进行转义stripslashes_deep($value)//递归方式的对变量中的特殊字符进行转义make_semiangle($str)//将一个字符中含有拳脚的数字字符/字母/空格或'%+-()'字符转换为响应半角字符format_fee($fee)//格式化费用:可以输入数字或百分比的地方compute_fee($amount,$rate,$type)//根据总金额和费率计算费用real_server_ip()//获取服务器的IPget_crlf()//获取用户操作系统的换行符;ecm_iconv($source_lang, $target_lang, $source_string = '')//编码转换函数ecm_json_encode($value)ecm_josn_decode($value,type = 0)get_object_vars_deep($obj)//返回由对象属性著称的关联数组file_ext($filename)db_create_in($item_list,$field_name = '')//创建像这样的查询:"IN('a','b')"ecm_mkdir($absolute_path, $mode = 0777)//创建目录(如果该目录的上级目录不存在,会先创建上级目录),依赖于ROOT_PATH 常量,且只能创建ROOT_PATH 目录下的目录目录分隔符必须是/ 不能是\ecm_rmdsir($dir)//删除目录,不支持目录中带..price_format($price, $price_format = NULL)ecm_setcookie($key, $value, $expire = 0, $cookie_path=COOKIE_PATH, $cookie_domain=COOKIE_DOMAIN)//设置cookieecm_getcookie($key = '')//获取COOKIE的值ecm_iconv_deep($source_lang,$target_lang,$value)//对数组转码ecm_fopen($url, $limit = 500000, $post = '', $cookie = '', $bysocket = false, $ip = '', $timeout = 15, $block = true)//fopen封装函数html_filter($html)//危险HTML 过滤器clean_cache()//清理系统所有编译器文件,缓存文件,模板结构数据trim_right($str)//去掉字符串右侧可能出现的乱码_at($fun)//通过该函数运行函数可以抑制错误outer_call($func, $params=null)//调用外部函数reset_error_handler()is_from_browser()//返回是否是通过浏览器访问的页面ecm_define($source)//从文件或数组中定义常量ecm_microtime()//获取当前的微秒数ecmall/eccore/model/model.base.php//除本基类文件外,所有的模型类的类名的构造规则应该是模型名(首字母大写)+model 组成,文件名必须是模型名+.model组成如有一个用户模型,模型名为user,则其文件名应为user.model.php,类名为UserModel类:BaseModel extends Obiect属性:var $db = null;/* 所映射的数据库表*/var $table = '';/* 主键*/var $prikey= '';/* 别名*/var $alias = '';/* 模型的名称*/var $_name = '';/* 表前缀*/var $_prefix = '';/* 数据验证规则*/var $_autov = array();/* 查询统计*/var $_last_query_count = -1;/* 临时保存已删除的数据*/var $_dropped_data = array();/* 关系(定义关系时,只有belongs_to以及has_and_belongs_to_many需要指定reversevar $_relation = array();方法:__construct($params,$db)BaseModel($params,$db)getName()//获取模型名称get($params)//获取单一一条记录get_unfo($id)//根据ID取得信息find($params = array())//根据一定条件找出相关数据(不连接其他模型,直接通过JOIN 语句来查询)findAll($params = array())//关联查找关于多对多关系的记录getRelatedDate($relation_name, $ids, $find_param = array())//获取一对多,多对多的关联数据add($data, $compatible = false)添加一条记录createRelation($relation_name, $id, $ids)//添加多对多关联的中间表关系数据updateRelation($relation_name, $id, $ids, $update_values)//更新多对多关系中的关系数据unlinkRelation($relation_name, $conditions, $ids = null)//去除多对多的关联连接_relationLink($action,$relation_name,$id,$ids,$update_values = array())//多对多关联表操作edit($conditions, $edit_data)//简化更显操作drop($conditions, $fields = '')简化删除记录操作dropDependentData($keys)//删除依赖数据_getExtLimit($ext_limit, $alias = null)//获取扩展限制getDroppedDate()//获取实时保存的已删除记录getCount()//获取统计数_saveDroppedDate($sql)//临时保存已删除的记录数据_updateLastQueryCount($sql)//更新查询统计数_getConditions($conditions,$if_add_alias = false)//获取条件语段_getSetFields($date)//获取设置字段getRealFields($src_fields_list)//获取查询时的字段列表_getFieldTable($owner)//解析字段所属_getInsertInfo($data)//获取插入的数据的sql_valid($data)//验证数据合法性,当时验证vrule中指定的字段,并且只当$date中这支了其值是才验证_initFindParams($params)_joinModel(&$table,$join)//按指定的方式LEFT,JOIN指定关系的表_getHoinString($relation_info)getRelation($relation_name = null)//获取关系信息getRelationByType($relation)assemble($relation_name,$assoc_date,$pri_date)dateEnough($date)getRequiredFields()//获取必须的字段列表* 用于统计*/function getOne($sql){return $this->db->getOne($sql);}function getRow($sql){return $this->db->getRow($sql);}function getCol($sql){return $this->db->getCol($sql);}function getAll($sql){return $this->db->getAll($sql);}ecmall/eccore/model/mysql.php类cls_mysql方法__construct($params,$db)cls_mysql()//db构造函数connect($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0)//连接数据库select_database($dbname)set_mysql_charset($charset)fetch_array($charset)query($sql,$type = '',$times=0)function prefix($sql){return preg_replace('/\s\`ecm_(.+?)\`([,|\s]?)/', ' ' .DB_PREFIX. '$1$2', $sql);}function affected_rows(){return mysql_affected_rows($this->_link_id);}function error(){return mysql_error($this->_link_id);}function errno(){return mysql_errno($this->_link_id);}function result($query, $row){return @mysql_result($query, $row); }function num_rows($query){return mysql_num_rows($query);}function num_fields($query){return mysql_num_fields($query);}function free_result($query){return mysql_free_result($query);}function insert_id(){return mysql_insert_id($this->_link_id); }function fetchRow($query){return mysql_fetch_assoc($query);}function fetch_fields($query){return mysql_fetch_field($query);}function version(){return $this->version;}function ping(){if (PHP_VERSION >= '4.3'){return mysql_ping($this->_link_id);}else{return false;}}function escape_string($unescaped_string){if (PHP_VERSION >= '4.3'){return mysql_real_escape_string($unescaped_string);}else{return mysql_escape_string($unescaped_string);}}function close(){return mysql_close($this->_link_id);}ErrorMsg($message = '',$sql = '')selectLimit($sql,$num,$start = 0)//仿真Adodb 函数getOne($sql,$limited = false)getOneCache($sql,$cached = 'FILEFIRST')getAll($sql)getAllWithIndex($sql_statement,$index_key)//以主键索引形式返回结果集getAllCached($sql, $cached = 'FILEFIRST')getRow($sql,$limited = false)getRowCached($sql,$cached = 'FILEFIRST')getCol($sql)getColCached($sql,$cached = 'FILEFIRST')autoExecute($table,$field_values,$mode = 'INSERT',$where = '',$querymode = '')autoReplace($table,$field_values,$update_values,$where = '',$querymode = '')setMaxCacheTime($second)getMaxCacheTime()getSqlCacheData($sql,$cached = '')//获取数据记录集缓存setSqlCacheData($result,$data)table_lastupdate($tables)//获取SQL 语句中最后更新的表的时间,有多个表的情况下,返回最新的表的时间get_table_name($query_item)set_disable_cache_tables($tables)//设置不允许缓存的表ecmall/eccore/model/template.php类ecsTemplate方法__constructecsTemplateassign($tpl_var,$value = '')display($filename,$cache_id = '')//显示页面函数display_cache()//显示缓存数据fetch($filename,$cache_id = '')//处理模板文件make_compiled($filename)//编译模板函数fetch_str($source)is_cached($filename,cache_id = '')select($tag)//处理()标签get_val($val)//处理smarty标签中的变量标签make_var($val)//处理去掉$的字符&get_tempalte_vars($name = null)_compile_if_tag($tag_args,$elseif = false)_compile_foreach_start($tag_args)push_vars($key,$val)//将foreach的key,item放入临时数组pop_vars()//弹出临时数组的最后一个_compile_smarty_ref(&$indexes)//处理smarty揩油的预定义变量Java_script($args)//脚本标签style($args)//样式标签smarty_prefilter_preCompile($source)//替换模板中图片路径url_rewrite($arr)// 返回URL重写后的字符串/* 处理动态模板*/insert_mod($name)//处理动态内容str_trim($str)//处理'a=b c=d k=f'类字符串,返回数组_eval($content)_require($filename)_html_options($arr)display_widgets($arr)html_radion($arr)html_checkbox($arr)html_page_links($arr)_init_page_param($arr)html_page_selector($arr)html_page_simple($arr)html_img_yesorno($arr)html_sort_link($arr)cycle($arr)image($arr)make_array($arr)smarty_create_pages($pagams)get_custom_model($id,$dir)//获取自定义模块get_lang($key)//编译时解析语言_sprintf($arr)//解析sprinf标签ecmall/eccore/model/template.php控制器基础类BaseApp extends Object方法_constructBaseAppdo_actionindexassign($k, $v = null)//给视图传递变量display($n)//显示视图_init_view()//初始化视图连接_config_view()//配置视图_run_action()//运行动作_init_session()//初始化Session_get_run_time($precision = 5)//获取程序运行时间destruct()//控制器结束运行后执行import_from_csv($filename,$header = true,$from_charset = '',$to_charset = '',$delimiter = ',')export_to_csv($data,$filename,$to_charset = '')//导出csv文件_replace_special_char($str,$replace = true)ecmall/eccore/model/message.base.php消息接收方法_trigger_message($arr)show_message($msg)show_warning($msg)_message($msg,$type)exception_handler($errno,$errstr,$errfile,$errline)put_log($err,$msg,$file,$line)//写入log文件类Message extends MessageBase方法_construct($str='',$errno=null)Message($str,$errno = null)handle_meassage($msg)report_link($err,$msg,$file,$line)//生成bug报告连接add_link($text,$href='javascript:history.back()')//添加一个连接到消息页面display()//显示消息页面。
ORACLE数据库查看执⾏计划基于ORACLE的应⽤系统很多性能问题,是由应⽤系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们⼀般通过查看该SQL的执⾏计划,本⽂就如何看懂执⾏计划,以及如何通过分析执⾏计划对SQL进⾏优化做相应说明。
⼀、什么是执⾏计划(explain plan)执⾏计划:⼀条查询语句在ORACLE中的执⾏过程或访问路径的描述。
⼆、如何查看执⾏计划1: 在PL/SQL下按F5查看执⾏计划。
第三⽅⼯具toad等。
很多⼈以为PL/SQL的执⾏计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL⼯具⾥⾯设置的。
可以看到很多其它信息,如下所⽰2: 在SQL*PLUS(PL/SQL的命令窗⼝和SQL窗⼝均可)下执⾏下⾯步骤SQL>EXPLAIN PLAN FORSELECT*FROM SCOTT.EMP; --要解析的SQL脚本SQL>SELECT*FROM TABLE(DBMS_XPLAN.DISPLAY);3: 在SQL*PLUS下(有些命令在PL/SQL下⽆效)执⾏如下命令:SQL>SET TIMING ON --控制显⽰执⾏时间统计数据SQL>SET AUTOTRACE ON EXPLAIN --这样设置包含执⾏计划、脚本数据输出,没有统计信息SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE OFF --不⽣成AUTOTRACE报告,这是缺省模式SQL>SET AUTOTRACE ON --这样设置包含执⾏计划、统计信息、以及脚本数据输出SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE OFFSQL>SET AUTOTRACE TRACEONLY --这样设置会有执⾏计划、统计信息,不会有脚本数据输出SQL>执⾏需要查看执⾏计划的SQL语句SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息SQL>执⾏需要查看执⾏计划的SQL语句SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]参考⽂档:SQLPlus User’s Guide and Reference Release 11.1注意:PL/SQL Developer ⼯具并不完全⽀持所有的SQL*Plus命令,像SET AUTOTRACE ON 就如此,在PL/SQL Developer⼯具下执⾏此命令会报错SQL> SET AUTOTRACE ON;Cannot SET AUTOTRACE4:SQL_TRACE可以作为参数在全局启⽤,也可以通过命令形式在具体SESSION启⽤4.1 在全局启⽤,在参数⽂件(pfile/spfile)中指定SQL_TRACE =true,在全局启⽤SQL_TRACE时会导致所有进程活动被跟踪,包括后台进程以及⽤户进程,通常会导致⽐较严重的性能问题,所以在⽣产环境要谨慎使⽤。