sql预编译生存时间
1. 有个sql,在pl/sql上执行第一次要40来秒,后面执行就只要1秒不到,怎么样才能让第一次执行就很快呢
先告诉下你oracle中sql处理机制吧
像你说的这个情况,就是oracle中的预编译sql过程,它会将你运行过的sql当做一个模板存在内存里,当你下次运行结构与这个sql一样的语句时,然后就直接使用之前的那个sql的缓存,然后换一下where条件的参数值,跳过了后面的很多处理过程,所以你会发现后面再运行类似的sql,处理效率会高很多。
根据我上面的推断,想让sql第一次执行快,只能是让查出来的结果集尽可能的少,但又不能改变它的sql结构,否则就错了。。
2. 预编译SQL语句的使用问题
void setString(int parameterIndex,
String x)
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。
2、传递 IN 参数
在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。
如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。
利用 pstmt(前面创建的 PreparedStatement 对象),以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述,为做到这一点,数据库不能关闭 pstmt。在该示例中,第一个参数被设置为 "Hi"并保持为常数。在 for 循环中,每次都将第二个参数设置为不同的值:从 0 开始,到 9 结束。
pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}
3. MS sql如何使用存储过程
一、存储过程的概念
T-SQl和C语言一样 ,是一门结构化的语言。
什么是存储过程?
存储过程是SQL查询语句与控制流程语句的预编译集合,并以特定的名称保存在数据库中。存储过程也是数据库对象
分类:
系统存储过程: 以sp_或xp_打头
用户自定义 :以proc_打头
存储过程的优点:
执行速度快 效率高
模块式编程
减少网络流量
提高安全性
二、系统存储过程
SQl server 的系统存储过程保存在master数据库中,且所有命名的系统存储过程命名以“Sp_”开头。在master数据库中,
系统存储过程数量如下:
代码如下 复制代码
select count([name])as '系统存储数量' from sysobjects
where [name] like 'sp_%'
EXECUTE 用来表示调用存储过程,也可以缩写为EXEC,
调用存储的语法如下:
EXECUTE ‘存储过程名’ ‘参数’ ---如果没有参数则省略参数
常用的系统存储过程
EXEC sp_databases 列出当前系统中的数据库
EXEC sp_renamedb 'Northwind','Northwind1' 修改数据库的名称(单用户访问)
USE stuDB GO EXEC sp_tables 返回某个表列的信息
EXEC sp_columns 查看指定列的信息
EXEC sp_help 查看某个表的所有信息
EXEC sp_helpconstraint '表名' 查看某个表的约束
EXEC sp_helpdb '数据库名' 或 EXEC sp_helpdb 查看指定数据库或所有数据库信息
EXEC sp_helptext '对象名称' 显示数据库对象(存储过程、触发器、试图)的定义文本
EXEC sp_helpindex '表名' 查看指定表的索引信息
EXEC sp_renamedb '原名称','新名称' 更改数据库名称
EXEC sp_stored_proceres 列出当前环境可用的所有存储过程
除了系统存储过程,SQL Server 还提供以Xp_开头的扩展存储过程,如可以调用DOS命名的,XP_cmdshell 存储过程
用法如下:
代码如下 复制代码
EXEC Xp_cmdshell DOS 命名 [NO_OUTPUT]
NO_OUTPUT 为可选参数,表示是否输入存储过程返回的信息
三、用户自定义存储过程
1、语法
代码如下 复制代码
create procere 存储过程名
@参数1名 数据类型 [=默认值] [参数类型(输入/输出)]
... ...
@参数n名 数据类型 [=默认值] [参数类型(输入/输出)]
as
begin
sql语句
end;
go
参数类型分为输入参数和输出参数,默认为输入参数,使用OUTPUT表示输出参数。创建存储过程最好以proc开头
2、创建不带参数的存储过程
代码如下 复制代码
--判断存储过程是否存在
if object_id('proc_student','procere') is not null
drop procere proc_student
go
create procere proc_student
as
begin
select pcid as '电脑编号',
case pcuse
when 0 then '空闲'
when 1 then '忙碌'
end as '使用状态' from pc
end;
--调用存储过程
execute proc_student select * from pc
go
3、创建带输入参数的存储过程
语法:
代码如下 复制代码
create procere 存储过程名
@参数1名 数据类型 [=默认值]
....
@参数2名 数据类型[=默认值]
as
SQl与语句
...
go
--例如
--创建带输入参数的存储过程
代码如下 复制代码
if object_id('proc_stu','procere') is not null
drop procere proc_stu
go
create procere proc_stu
@pcuse int
as
begin
select pcid as '电脑编号',
case pcuse
when 0 then '空闲'
when 1 then '忙碌'
end as '使用状态' from pc where pcuse=@pcuse end;
--调用存储过程
execute proc_stu @pcuse=1
4、创建带输出参数的存储过程
代码如下 复制代码
--创建带输出参数的存储过程
if OBJECT_ID('proc_s','procere') is not null
drop procere proc_s
go
create procere proc_s
@pcid int,
@pcus int output
as
begin
select @pcus=pcuse from pc where pcid=@pcid end;
--调用存储过程
declare @pcus int execute proc_s 5,@pcus output
四、处理错误信息
当存储过程的语句十分复杂时,可以在存储过程中加入错误语言。SQL Server中可以使用RAISERROR 返回用户自定义的错误信息。
RAISERROR 语法如下:
RAISERROR (自定义的错误信息,错误的严重级别,错误状态)
自定义错误信息:表示输出信息:表示输出的错误提示文本
错误的严重级别:表示用户自定义错误的严重性级别。(0-18极)
错误的状态:表示自定义错误的状态,值的范围在1-127
4. sql中带有like时如何使用预编译
like语句实际上就是模糊的字段查询,通常与“%”(一个或多个)结合使用。
举例说明:
sql:SELECT * FROM tablename T WHERE T.name LIKE '%zhang%';
解释:以上语句就就是查询出tablename表中name字段带有“zhang”的所有记录。
备注:存储过程中用"||"表示连接符,用单引号(“'”)表示字符连接。
SELECT * FROM tablename T WHERE T.name LIKE '%'||'zhang'||'%'.
5. sql 存储过程 概念
枯燥杂乱的网文不给你转了,用我自己的词汇给你组织一下这个概念吧:
你可以把存储过程当做:把一系列语句合并到一起的这么一个整体
我觉得举例说明比较好,给你个例子:
先将【表1】中ID号为50—2000的记录删除、
再将【表2】中的这些记录的状态(STATUS)改为“已解除”:
delete 表1 where ID > 50 and ID < 2000
update 表2 set STATUS = '已解除' where ID > 50 and ID < 2000
正常情况下,以上两条语句分步执行就可以了,如果要用存储过程呢?
先建立存储过程(以下的语法为Sybase数据库的,其他数据库类同):
create procere PRC_TEST (@start_ID int, @end_ID int)
as
begin
delete 表1 where ID > @start_ID and ID < @end_ID
update 表2 set STATUS = '已解除' where ID > @start_ID and ID < @end_ID
end
好了,执行这个语句,就将存储过程PRC_TEST提交到数据库里了,它有两个参数:start_ID int 和 end_ID,代表起始和终止ID号,类型为整数型int
怎么用这个存储过程呢? 这样执行:exc PRC_TEST 50, 2000
执行时,它先得到了两个参数,50、2000,分别赋值给start_ID int 和 end_ID,然后按照这两个参数分步执行封装在存储过程里的那两条语句了。
如果你这样执行:exc PRC_TEST 220, 8660
就是处理两个表中ID介于220—8660之间的记录了。
----------------------------------------------------------------------------
你也许会问了,既然可以分步执行的几句SQL,为什么要费力的写成存储过程啊?
主要是(我的经验和认识):
1、使数据处理参数化,对经常使用的一系列SQL进行封装,使其成为一个存储过程的整体,在每次执行时只要更换执行参数即可,不用去改里面每句SQL的where子句
2、★★这个很重要★★,假设你要循环处理某些数据,例如需要使用“游标”、“Do...while...语句”…………时,就要用到存储过程(或触发器)
=====================================================================
最后给你转一个短文吧,这是书面上的概念:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
那么存储过程与一般的SQL语句有什么区别呢?
存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.系统存储过程:以prc_(或sp_)开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程