特殊SQL語句及最佳化原則

來源:互聯網
上載者:User

   1.按姓氏筆畫排序:

  Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as

  2.資料庫加密:

  select encrypt('原始密碼')

  select pwdencrypt('原始密碼')

  select pwdcompare('原始密碼','加密後密碼') = 1--相同;否則不相同 encrypt('原始密碼')

  select pwdencrypt('原始密碼')

  select pwdcompare('原始密碼','加密後密碼') = 1--相同;否則不相同

  3.取回表中欄位:

  declare @list varchar(1000),@sql nvarchar(1000)

  select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'

  set @sql='select '+right(@list,len(@list)-1)+' from 表A'

  exec (@sql)

  4.查看硬碟分區:

  EXEC master..xp_fixeddrives

  5.比較A,B表是否相等:

  if (select checksum_agg(binary_checksum(*)) from A)

  =

  (select checksum_agg(binary_checksum(*)) from B)

  print '相等'

  else

  print '不相等'

  6.殺掉所有的事件探察器進程:

  DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROMmaster.dbo.sysprocesses

  WHERE program_name IN('SQL profiler',N'SQL 事件探查器')

  EXEC sp_msforeach_worker '?'

  7.記錄搜尋:

  開頭到N條記錄

  Select Top N * From 表

  -------------------------------

  N到M條記錄(要有主索引ID)

  Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc

  ----------------------------------

  N到結尾記錄

  Select Top N * From 表 Order by ID Desc

  8.如何修改資料庫的名稱:

  sp_renamedb 'old_name', 'new_name'

  9:擷取當前資料庫中的所有使用者表

  select Name from sysobjects where xtype='u' and status>=0

  10:擷取某一個表的所有欄位

  select name from syscolumns where id=object_id('表名')

  11:查看與某一個表相關的視圖、預存程序、函數

  select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'

  12:查看當前資料庫中所有預存程序

  select name as 預存程序名稱 from sysobjects where xtype='P'

  13:查詢使用者建立的所有資料庫

  select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')

  或者

  select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

  14:查詢某一個表的欄位和資料類型

  select column_name,data_type from information_schema.columns

  where table_name = '表名'

  [n].[標題]:

  Select * From TableName Order By CustomerName

  [n].[標題]:

  Select * From TableName Order By CustomerName

  --------------------------------------------------------------------------------------

  Sql最佳化是一項複雜的工作,以下的一些基本原則是本人看書時所記錄下來的,很明確且沒什麼廢話:

  1. 索引的使用:

  (1).當插入的資料為資料表中的記錄數量的10%以上,首先需要刪除該表的索引來提高資料的插入效率,當資料插入後,再建立索引。

  (2).避免在索引列上使用函數或計算,在where子句中,如果索引是函數的一部分,最佳化器將不再使用索引而使用全表掃描。如:

  低效:select * from dept where sal*12 >2500;

  高效:select * from dept where sal>2500/12;

  (3).避免在索引列上使用not和 “!=”,索引只能告訴什麼存在於表中,而不能告訴什麼不存在於表中,當資料庫遇到not 和 “!=”時,就會停止使用索引而去執行全表掃描。

  (4).索引列上>=代替>

  低效:select * from emp where deptno > 3

  高效:select * from emp where deptno >=4

  兩者的區別在於,前者dbms將直接跳到第一個deptno等於4的記錄,而後者將首先定位到deptno等於3的記錄並且向前掃描到第一個deptno大於3的。

  (5).非要對一個使用函數的列啟用索引,基於函數的索引是一個較好的方案。

  2. 遊標的使用:

  當在海量的資料表中進行資料的刪除、更新、插入操作時,用遊標處理的效率是最慢的,但是遊標又是必不可少的,所以正確使用遊標十分重要:

  (1). 在資料幫浦的源表中使用時間戳,這樣每天的維表資料維護只針對更新日期為最新時間的資料來進行,大大減少需要維護的資料記錄數。

  (2). 在insert和update維表時都加上一個條件來過濾維表中已經存在的記錄,例如:

  insert into dim_customer select * from ods_customer where ods_customer.code not exists (dim_customer.code)

  ods_customer為資料來源表。dim_customer為維表。

  (3). 使用顯式的遊標,因為隱式的遊標將會執行兩次操作,第一次檢索記錄,第二次檢查too many rows這個exception,而顯式遊標不執行第二次操作。

  3. 據抽取和上傳時的sql最佳化:

  (1). Where 子句中的串連順序:

  oracle採用自下而上的順序解析where子句,根據這個原理,表之間的串連必須寫在其他where條件之前,那些可以過濾掉大量記錄的條件必須寫在where子句的末尾。如:

  低效:select * from emp e where sal>5000 and job = ‘manager’ and 25<(select count (*) from emp where mgr=e.empno);

  高效:select * from emp e where 25<(select count(*) from emp where mgr=e.empno) and sal>5000 and job=’manager’;

  (2). 刪除全表時,用truncate 替代 delete,同時注意truncate只能在刪除全表時適用,因為truncate是ddl而不是dml。

  (3). 盡量多使用commit

  只要有可能就在程式中對每個delete,insert,update操作盡量多使用commit,這樣系統效能會因為commit所釋放的資源而大大提高。

  (4). 用exists替代in ,可以提高查詢的效率。

  (5). 用not exists 替代 not in

  (6). 最佳化group by

  提高group by語句的效率,可以將不需要的記錄在group by之前過濾掉。如:

  低效:select job, avg(sal) from emp group by job having job = ‘president’ or job=’manager’;

  高效: select job, avg(sal) from emp having job=’president’ or job=’manager’ group by job;

  (7). 有條件的使用union-all 替代 union:這樣做排序就不必要了,效率會提高3到5倍。

  (8). 分離表和索引

  總是將你的表和索引建立在不同的資料表空間內,決不要將不屬於oracle內部系統的對象存放到system資料表空間內。同時確保資料資料表空間和索引資料表空間置於不同的硬碟控制卡控制的硬碟上。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。