特殊sql语句及优化原则
1.按姓氏笔画排序:
select * From TableName Order By CustomerName Collate Chinese _ PRC _ Stroke _ ci _ as
2.数据库加密:
选择加密(“原始密码”)
选择pwdencrypt(“原始密码”)
Select pwdcompare('原始密码','加密密码')= 1-相同;否则,不同的加密(“原始密码”)
选择pwdencrypt(“原始密码”)
Select pwdcompare('原始密码','加密密码')= 1-相同;否则就不一样了。
3.检索表中的字段:
声明@list varchar(1000),@sql nvarchar(1000)
Select @ list = @ list+','+b.name from sysobjects a,sys columns b where a . id = b . id and a . name = ' table a '
Set @ SQL =' select'+right (@ list,len (@ list)-1)+'from table a '
exec (@sql)
4.检查硬盘分区:
执行主机..xp _固定驱动程序
5.比较表A和表B是否相等:
if(从A中选择checksum_agg(binary_checksum(*))
=
(从B中选择checksum_agg(binary_checksum(*))
打印“相等”
其他
打印“不相等”
6.终止所有事件浏览器进程:
从master.dbo.sysprocesses为SELECT 'kill '+RTRIM(spid)声明hcforeach游标全局
Where _ name in ('SQL事件探查器',n' SQL事件探查器')
' EXEC sp_msforeach_worker '?'
7.记录搜索:
从n条记录开始
从表中选择n *
-
n到M条记录(带有主索引ID)
Select Top M-N * From table Where ID in(Select Top M ID From table)Order by ID desc
-
n到记录的末尾
select Top N * From table Order by ID desc
8。如何修改数据库的名称:
sp_renamedb '旧名称','新名称'
9:获取当前数据库中的所有用户表
从系统对象中选择名称,其中xtype='u '且状态> =0
10:获取某个表的所有字段。
从syscolumns中选择,其中id = object _ id('表名')
11:查看与某个表相关的视图、存储过程和函数。
Select a. * from sysobjects a,syscomments b where a. id = b.id和b.textlike'% table name% '
12:查看当前数据库中的所有存储过程
从sysobjects中选择name作为存储过程名,其中xtype='P '
13:查询用户创建的所有数据库。
select * from master..sid不在的sysdatabases D(从master中选择sid..syslogins,其中name='sa ')
或者
select dbid,name AS DB_NAME from master..sid 0x01所在的sysdatabases
14:查询某个表的字段和数据类型。
从information_schema.columns选择column_name,data_type
其中表名= '表名'
[n]。[标题]:
select * From TableName Order By CustomerName
[n]。[标题]:
select * From TableName Order By CustomerName
-
Sql优化是一项复杂的工作。以下基本原理是我自己看书时记录下来的。他们很清楚,没有废话:
1。索引的使用:
(1)当插入的数据超过数据表中记录的10%时,需要先删除表的索引以提高数据插入效率,插入数据后再建立索引。
(2).避免对索引列使用函数或计算。在where子句中,如果索引是函数的一部分,优化器将不再使用索引,而是使用全表扫描。比如:
效率低:select * from部门sal * 12 > 2500
高效:select * from sal > 2500/12的部门;
(3).避免使用not和"!=”,索引只能告诉表中存在什么,不能告诉不存在什么。当数据库遇到not和"!= ",索引将停止,并执行全表扫描。
(4) > =代替>
效率低下:在deptno > 3的情况下从emp中选择*
高效:从部门编号> =4的emp中选择*
两者的区别在于,前者dbms会直接跳转到deptno等于4的第一条记录,而后者会先定位deptno等于3的记录,再向前扫描到deptno大于3的第一条记录。
(5).有必要为使用函数的列启用索引。基于函数的索引是一个更好的方案。
2.光标的使用:
在海量数据表中删除、更新、插入数据时,用游标处理效率最慢,但游标必不可少,所以正确使用游标非常重要:
(1)在数据抽取的源表中使用时间戳,使得维度表数据的日常维护只针对更新日期最近的数据,大大减少了需要维护的数据记录数量。
(2).添加一个条件,在插入和更新维度表时过滤维度表中的现有记录,例如:
插入到dim _ customer select * from ODS _ customer,其中ods_customer.code不存在(dim_customer.code)
Ods_customer是数据源表。Dim_customer是一个维度表。
(3).使用显式游标,因为隐式游标会执行两个操作,第一次是检索记录,第二次是检查行太多的异常,而显式游标不会执行第二个操作。
3.数据提取和上传期间的sql优化:
(1).where子句中的连接顺序:
Oracle以自下而上的顺序解析where子句。根据这个原则,表与表之间的连接必须写在其他where条件之前,那些可以筛选出大量记录的条件必须写在where子句的末尾。比如:
低效率:select * from EMP e where sal > 5000 and job = ' manager ' and 25高效率:select * from EMP e where 255000 and job = ' manager ';
(2).删除整个表时,用truncate替换delete。同时注意truncate只能在删除整个表时应用,因为truncate是ddl而不是dml。
(3)尽可能使用commit。
只要有可能,对程序中的每一个删除、插入、更新更新操作都使用commit,这样系统性能会因为commit释放的资源而大大提高。
(4).用exists代替in可以提高查询效率。
(5).将不在替换为不存在
(6)优化分组方式
为了提高group by语句的效率,可以在group by之前过滤掉不必要的记录。比如:
低效率:从EMP组中选择job,avg(sal)by job = ' president '或job = ' manager
高效:选择职务,avg (sal)从empliving job =' president '或job = ' manager ' group by job
(7).有条件地使用union-all而不是union:这将使排序变得不必要,并将效率提高3到5倍。
(8).单独的表和索引
始终在不同的tables 空中构建您的表和索引,绝不在system table 空中存储不属于oracle内部系统的对象。同时确保数据表空和索引表空放在硬盘控制卡控制的不同硬盘上。
位律师回复
0条评论