存储过程的索引
如果语句是你想要的,就把它放到存储过程里面
Use [数据库名称]
Go
DECLARE @DBCCString NVARCHAR(1000)
DECLARE @TableName VARCHAR(100)
DECLARE Cur_Index CURSOR
FOR
SELECT Name AS TblName
FROM sysobjects
WHERE xType='U'
ORDER BY TblName
FOR READ ONLY
OPEN Cur_Index
FETCH NEXT FROM Cur_Index
INTO @TableName
WHILE @@FETCH_STATUS=0
BEGIN
SET @DBCCString = 'DBCC DBREINDEX(@TblName,'''')WITH NO_INFOMSGS'
EXEC SP_EXECUTESQL @DBCCString,N'@TblName VARCHAR(100)', @TableName
PRINT '重建表' + @TableName +'的索引........OK!'
FETCH NEXT FROM Cur_Index INTO @TableName
END
CLOSE Cur_Index
DEALLOCATE Cur_Index
PRINT '操作完成!'
go
‘贰’ 全文索引的技术存储过程
目前全文索引技术正走向人工智能化,也是发展的方向。
MicroSoft SqlServer 2000/2005 中的全文索引是由一系列存储过程来完成的,这些存储过程按先后顺序罗列如下:
1、启动数据库的全文索引服务存储过程:sp_fulltext_service
2、初始化全文索引存储过程:sp_fulltext_database
3、建立全文索引目录存储过程:sp_fulltext_catalog
4、在全文索引目录中添加删除表标记存储过程:sp_fulltext_table
5、在全文索引目录的表中添加或删除列标记存储过程:sp_fulltext_column
‘叁’ 如何使存储过程根据入参走不同的索引
入参很不固定,比如以上的例子中,
如果穿了EMP_NO或者EMP_NAME,走索引选择性非常好,性能是不错的,需要他走 IDX_EMP_EMPNO或者 IDX_EMP_EMPNAME的索引
但是如果传的是部门DEPT_NO,因为部门只有几个,想让其走FFS。。
从AWR中看到此SQL已经是TOP 5的位置了,应该是绑定变量的原因,执行计划一直走的是FFS。不知道有什么好法子,根据入参走合适的索引
‘肆’ 数据库包括基本表、视图、索引和存储过程等元素,什么是组成数据库的基本元素
说说自己不成熟的浅见:
1、基本表、视图、索引和存储过程等只是数据库的表现方式,不是数据库的基本元素。
2、数据库的基本元素是数据库的思维,即如何把现实事件中具体的事物(数据表格、图像等)抽象成数据存储到基本表中,之后通过存储过程、视图等对这些数据进行操作达到对现实事物的控制。
‘伍’ 怎么在存储过程中动态加入索引
create or replace procere sp_crt_stg_index( p_src_tbl_name varchar2,p_tgt_tbl_name varchar2,p_tx_date varchar2)
is
v_crt_ind_sql varchar2(4000) := '';
v_drop_ind_sql varchar2(4000) := '';
v_ind_name varchar2(100) := '';
v_tgt_ind_name varchar2(100) := '';
v_col_list varchar2(1000) := '';
v_col_name varchar2(100) := '';
i_ind_col_cnt number(2,0) := 0;
i_tbl_cnt number(2,0) := 0;
i_ind_cnt number(2,0) := 0;
v_step_no varchar2(3) :='';
begin
--step 1 检查索引定义是否存在
v_step_no :='1';
select count(1) into i_ind_col_cnt from all_ind_columns
where table_name = p_src_tbl_name;
if(i_ind_col_cnt = 0 ) then
sp_log('sp_crt_stg_index',v_step_no,'3',p_tx_date,p_src_tbl_name||'不存在索引定义');
return;
end if;
--step 2 检查目标表是否存在
v_step_no :='2';
select count(1) into i_tbl_cnt from tabs
where table_name = p_tgt_tbl_name;
if(i_tbl_cnt = 0 ) then
sp_log('sp_crt_stg_index',v_step_no,'3',p_tx_date,p_src_tbl_name||'不存在');
return;
end if;
--step 3 创建索引
v_step_no :='3';
for cur_ind in (select index_name from all_indexes where table_name = p_src_tbl_name) loop
v_ind_name := cur_ind.index_name;
v_col_name := '';
v_col_list := '(';
for cur_ind_col in (select column_name from all_ind_columns where index_name = v_ind_name order by column_position) loop
v_col_name := cur_ind_col.column_name;
v_col_list := v_col_list||v_col_name||',';
end loop;
v_col_list := v_col_list||')';
v_col_list := replace(v_col_list,',)',')');
v_tgt_ind_name :=replace(v_ind_name,p_src_tbl_name,p_tgt_tbl_name);
v_tgt_ind_name := v_tgt_ind_name||substr(p_tx_date,7,21);
select count(1) into i_ind_cnt from all_indexes where index_name = v_tgt_ind_name;
if(i_ind_cnt > 0) then
v_drop_ind_sql := 'drop index '||v_tgt_ind_name;
execute immediate v_drop_ind_sql;
end if;
sp_log('sp_crt_stg_index',v_step_no,'1',p_tx_date,v_tgt_ind_name||'创建开始');
v_crt_ind_sql := 'create index '||v_tgt_ind_name||' on '||p_tgt_tbl_name||v_col_list||' nologging';
if(v_crt_ind_sql is not null) then
execute immediate v_crt_ind_sql;
end if;
sp_log('sp_crt_stg_index',v_step_no,'1',p_tx_date,v_tgt_ind_name||'创建结束');
end loop;
exception
when others then
sp_log('sp_crt_stg_index',v_step_no,'3',p_tx_date,v_tgt_ind_name||'创建异常:'||SQLERRM);
end;
#########################
---- 日期类型转换
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS');
----Oracle检查分区
select count(1)
from ALL_TAB_PARTITIONS
where table_name = p_tgt_tbl_name
and PARTITION_NAME = v_prt_name;
----码表
Select * From ict_s_dic Where opttype = 'ID_TYPE';
decode 内部字段拼接
decode(Date_Nextvisit,'','下次跟进时间:['||Date_Nextvisit||']') RMK1,
----拼接字段,删除表
SELECT 'DROP TABLE '||TABLE_NAME||';' FROM TABS WHERE TABLE_NAME LIKE 'M_ICT%';
Select * From tabs ;
----交换分区,分区交换后数据是否交换?
'ALTER TABLE '|| p_tgt_tbl_name ||' EXCHANGE PARTITION '||v_prt_name||' WITH TABLE '||p_src_tbl_name;
----查询某表是否存在
select count(1) from tabs
where table_name = p_src_tbl_name;
----重建索引
ALTER index ind_id_idx rebuild
----创建索引nologging
create index I_ICT_CUST_INFO__0 on ICT_CUST_INFO_20141222 (CUST_NO)
nologging;
----查询分区内数据
select count(1) from stg_ict_trade_info partition(ICT_PRT_2014005);
Select * From User_Ind_Partitions;
Select * From User_Part_Indexes;
-----查询索引
select index_name from ALL_INDEXES WHERE TABLE_NAME=p_src_tbl_name;
-----查询分区
select * from ALL_TAB_PARTITIONS
where table_name = p_tgt_tbl_name and PARTITION_NAME = v_prt_name;
-----查询表名
select * from tabs where table_name = p_tgt_tbl_name;
-----清空表分区数据
'ALTER TABLE '||p_tgt_tbl_name||' TRUNCATE PARTITION ' || v_prt_name;
-----增加表分区
'ALTER TABLE '||p_tgt_tbl_name||' ADD PARTITION ' || v_prt_name||' VALUES LESS THAN (''' ||v_monthend||''') TABLESPACE ICLIENT_O_DATA01 ';
-----重建索引
'ALTER INDEX '||cur_ind.index_name|| ' REBUILD PARALLEL 128 COMPUTE STATISTICS NOLOGGING';
-----交换分区
'ALTER TABLE '|| p_tgt_tbl_name ||' EXCHANGE PARTITION '||v_prt_name||' WITH TABLE '||p_src_tbl_name||' INCLUDING INDEXES';
-----oralce创建同义词------------
create or replace public SYNONYM ICT_ORG_BPH for iclientodata.ICT_ORG_BPH;
-----oracle 赋权限
grant select, insert, update, delete on ICT_ORG_BPH to ICLIENTOOPR; --赋权限
---------------DBA查看表空间------------
select a.tablespace_name,
a.bytes / 1024 / 1024 / 1024 "Sum G",
(a.bytes - b.bytes) / 1024 / 1024 / 1024 "used G",
b.bytes / 1024 / 1024 / 1024 "free G",
round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "percent_used"
from (select tablespace_name, sum(bytes) bytes
from dba_data_files
group by tablespace_name) a,
(select tablespace_name, sum(bytes) bytes, max(bytes) largest
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name
order by ((a.bytes - b.bytes) / a.bytes) desc
-------------------------------------------------------------------------------------
--oracle 生成删表语句,
SELECT 'DROP TABLE '||TABLE_NAME||';' FROM TABS WHERE TABLE_NAME LIKE 'M_ICT%'
--查询oracle 中ICT开头的
SELECT * FROM tabs WHERE TABLE_NAME LIKE 'ICT%'
----oracle 表分析语句
'ANALYZE TABLE ' || v_ana_tbl_name || ' estimate system statistics';
例如:ANALYZE TABLE ICT_SUM_AST_DBT_CUST ESTIMATE SYSTEM STATISTICS;
-----------查看锁定对象及会话
SELECT OBJECT_NAME,MACHINE,S.SID,S.SERIAL#
FROM GV$LOCKED_OBJECT I,DBA_OBJECTS O,GV$SESSION S
WHERE I.OBJECT_ID=O.OBJECT_ID AND I.SESSION_ID=S.SID;
----------oralce解锁
ALTER SYSTEM KILL SESSION '280,219';
授权脚本生成方法:
select 'grant select on table dmccrm.'||tbl_name||' to public,ex_sdbods; ' from t_ict_tbl_type where tbl_type in('ALL','GP') and ETL_DIR IN( 'GP->ORACLE','无需同步');
-----------oracle批量生成同义词
SELECT 'create or replace public synonym '||table_name ||' for iclientodata.'||table_name FROM tabs WHERE table_name like 'ICT_%'
-----------oracle批量生成修改表字段的长度
select 'ALTER TABLE '||TABLE_NAME||' MODIFY '||COLUMN_NAME||' NUMBER(30,8);' from cols t
where t.DATA_TYPE = 'NUMBER'
AND T.DATA_SCALE >0 AND SUBSTR(TABLE_NAME,-8,8)<>'20140531'
---------oracle 批量创建同义词
select 'create or replace public synonym '||table_name||' for iclientodata.'||table_name||';' from user_tables WHERE table_name LIKE 'ICT_%' AND table_name NOT LIKE '%20140531';
-----------oracle 交换分区语句
ALTER TABLE ICT_CUST_LEVEL_HIS ADD PARTITION ICT_PRT_20140531 VALUES LESS THAN ('2014-06-01')
--------MERGE使用方法
MERGE INTO ICT_CUST_INFO_ALL a
USING
(
SELECT t.CUST_MNG_UM_NO ,t.CUST_NO
FROM ict_cust_mnger_rel t
WHERE t.CUST_NO IN
('600021562650', '600037441214', '600036874754', '600038507516',
'600020226746', '600038089420', '600041030403', '600038952992',
'600039468303')
)b
ON( a.cust_no= b.cust_no)
WHEN MATCHED THEN
UPDATE SET a.MAX_ASSET_INTRO_NO=b.CUST_MNG_UM_NO;
-------------oracle 树形查询,查询机构编号为‘9902’的和其下级子机构
select org_id,org_name,org_level from (
SELECT rownum rn, ioi.org_id , ioi.org_name,ioi.org_level
FROM ict_org_info ioi
START WITH ioi.org_id ='9902'
CONNECT BY PRIOR ioi.org_id = ioi.parent_org_id_b
order by ioi.org_level desc
) where rn=1
-------------oracle 树形查询,查询机构编号为‘9902’的和上级机构
select org_id,org_name,org_level from (
SELECT rownum rn, ioi.org_id , ioi.org_name,ioi.org_level
FROM ict_org_info ioi
START WITH ioi.org_id ='9902'
CONNECT BY ioi.org_id = PRIOR ioi.parent_org_id_b
order by ioi.org_level desc
) where rn=1
-------------oracle 树形查询,查询机构编号为‘9902’的上级机构
select org_id,org_name,org_level from (
SELECT rownum rn, ioi.org_id , ioi.org_name,ioi.org_level
FROM ict_org_info ioi
START WITH ioi.org_id ='9902'
CONNECT BY ioi.org_id = PRIOR ioi.parent_org_id_b
order by ioi.org_level desc
) where rn=1
----------查看表名与表空间
Select * From user_tables Where table_name = 'ICT_RMT_APPO';
Select * From User_Tablespaces;
----------查询SQL 预估时间
SELECT SE.SID,
OPNAME,
TRUNC(SOFAR / TOTALWORK * 100, 2) || '%' AS PCT_WORK,
ELAPSED_SECONDS ELAPSED,
ROUND(ELAPSED_SECONDS * (TOTALWORK - SOFAR) / SOFAR) REMAIN_TIME,
SQL_TEXT
FROM V$SESSION_LONGOPS SL, V$SQLAREA SA, V$SESSION SE
WHERE SL.SQL_HASH_VALUE = SA.HASH_VALUE
AND SL.SID = SE.SID
AND SOFAR != TOTALWORK
ORDER BY START_TIME;
------TYPE opty_cur IS REF CURSOR;
整体的意思是“创建一个类型变量cur,它引用游标”,除了cur外,其余全是关键字。
TYPE cur:定义类型变量 ,is ref cursor:相当于数据类型,不过是引用游标的数据类型。
这种变量通常用于存储过程和函数返回结果集时使用,
因为PL/SQL不允许存储过程或函数直接返回结果集,
但可以返回类型变量,于是引用游标的类型变量作为输出参数或返回值就应运而生了。
----查杀进程
SELECT dob.OBJECT_NAME Table_Name,
lo.LOCKED_MODE,
lo.SESSION_ID,
vss.SERIAL#,
vps.spid,
vss.action Action,
vss.osuser OSUSER,
vss.process AP_PID,
VPS.SPID DB_PID,
'alter system kill session ' || '''' || lo.SESSION_ID || ',' ||
vss.SERIAL# || ''';' kill_command
from v$locked_object lo, dba_objects dob, v$session vss, V$PROCESS VPS
where lo.OBJECT_ID = dob.OBJECT_ID
and lo.SESSION_ID = vss.SID
AND VSS.paddr = VPS.addr
order by 2, 3, DOB.object_name;
‘陆’ Sqlserver中什么是存储过程,索引,游标,分别解释解释
你应该找本数据库方面的书看看,一个简单的描述很难让你知道其中的意思。
存储过程相当于一个方法,可以定义传进去的值,返回的值,可以返回多个值或者不返回值。
然后根据业务逻辑写一些处理代码,对表进行增删改查,甚至 建表 删表,改表也可以,根据你的业务来。
索引就是针对表的某一个字段来建立的,增加查询速度或者约束,索引也分很多种,有简单的查询索引,主键索引,外键索引,唯一索引等等。
游标一般在存储过程或函数中实用,有点类似代码中的for循环,一个接一个的读。
打这么多字累死了,问题根本不能完全描述这些名称,你还是看看书吧。
‘柒’ SQL SERVER 中存储过程、视图、索引是什么概念
储存过程:简单说就是SQL代码的集合,和C语言里的函数类似,
储存过程把SQL语句写在一起,
调用储存过程时
SQLserver执行 这些语句。
它有参数,有返回值。
优点:
1.模块化设计
像其他程序语言的函数一样,单独出来,可以调用它n次,
并且可以独立于源代码,单独修改储存过程。
2.更快执行如果执行大量SQL代码或重复执行,储存过程比SQL批代码执行要快。
3.减少网络流量
一条SQL语句就可以执行上千条SQL代码,肯定视图:顾名思意,可以看的图形。
用图形来表示数据库中表,或表之间的关系
是虚拟表,是来自其一个表,或多个表的行或列 的子集。
临时表是暂时存在的,而视图是以文件存储的,只要不人为删除,
是永久存储的,所以视图不是临时表。
索引:举一个列子,你在学校要找一年级三班教室,但是你不知具体位置,
你只能按照顺序,一间教室一间教室的找,
但如果,你看学校地图(假设的),上面写有一年级三班教室在XX单元XX楼左边XX间,那你就可以直接到教室去了,
这里地图就相当于索引,指明具体地址,使查询更加的快捷。
SQL里就是这样,要查询某个数据,根据索引查找,比一个一个挨着查,更加的快捷。
‘捌’ 存储过程、索引、视图、触发器 的区别
视图:只是一种预先把语句编写好的一种快照,在使用中,真正执行的还是这个语句问题;
索引:主要是考虑到操作性能的优化
存储过程:是数据库的逻辑块处理
触发器:主要考虑连带性;
这4个种功能都不一样;没有什么好比较的
‘玖’ sql存储过程是不是就是索引
索引是用来提高查询机制的,可以理解为对数据库的优化
存储过程是把很多个sql语句放到一起,类似批处理一样
‘拾’ 如何查看存储过程中select语句使用索引的情况
也是习惯了SQL Server的存储过程中直接可以使用select语句输出结果集,但这个在Oracle中就行不通了。 如果你仅仅是想看到存储过程中语句所影响的记录内容,那么可以考虑使用游标,然后循环游标用dbms_output将内容输出,从而可以在dbms的输出中