1、數據庫基礎
- --1.建庫
- create database wc
- on primary
- ( name = wc_data,
- filename ='d:\wc_data.mdf',
- size =3MB,
- maxsize = unlimited,
- filegrowth = 1MB),
- filegroup wc_fg1
- ( name = wc_fg1,
- filename ='d:\wc_fg1.ndf',
- size =3MB,
- maxsize =1GB,
- filegrowth = 100KB),
- filegroup wc_fg2
- ( name = wc_fg2,
- filename ='d:\wc_fg2.ndf',
- size =3MB,
- maxsize = 100MB,
- filegrowth = 1MB)
- LOG on
- ( name = wc_log,
- filename = 'd:\wc_log.ldf',
- size =3MB,
- maxsize = 200MB,
- filegrowth = 20%
- )
- --2.1數據庫屬性
- select * from sys.databases
- --2.2數據庫大小、屬性、兼容級別,文件屬性
- exec sp_helpdb 'wc'
- --3.1只允許一個用戶訪問數據庫
- alter database wc
- set single_user
- with rollback after 10 seconds --指定多少秒后回滾事務
- --3.2只有sysadmin,dbcreator,db_owner角色的成員可以訪問數據庫
- alter database wc
- set restricted_user
- with rollback immediate --立即回滾事務
- --3.3不等待立即改變用戶訪問,如不能立即完成,那么會導致執行錯誤
- alter database wc
- set multi_user
- with no_wait
- --4.1改為單用戶模式
- alter database wc
- set single_user
- with rollback immediate
- --4.2刪除數據庫,無法刪除數據庫 "wc",因為該數據庫當前正在使用。
- drop database wc
- --5.1分離數據庫
- use master
- go
- alter database wc
- set single_user
- with rollback immediate
- exec sp_detach_db
- @dbname ='wc',
- @skipchecks = 'true' --true:在分離數據庫前不會更新統計信息
- --false:會更新統計信息,默認選項
- --5.2.1附加數據庫:第一種方法,將在后續版本中刪除該功能
- exec sp_attach_db
- @dbname ='wc',
- @filename1 = 'd:\wc_data.mdf' --最多指定16個文件名
- --5.2.2附加數據庫:第二種方法
- create database wc
- on (name = wc_data,
- filename = 'd:\wc_data.mdf')
- for attach
- create database wc
- on (name = wc_data,
- filename = 'd:\wc_data.mdf')
- for attach_rebuild_log --附加的同時重建日志文件
- `
- --6.1數據庫重命名
- ALTER DATABASE WC
- MODIFY NAME = WC_NEW
- --6.2刪除數據庫
- DROP DATABASE WC_NEW
2、數據庫選項
- --1.1.1只允許一個用戶訪問數據庫
- alter database wc
- set single_user
- with rollback after 10 seconds --指定多少秒后回滾事務
- --1.1.2只有sysadmin,dbcreator,db_owner角色的成員可以訪問數據庫
- alter database wc
- set restricted_user
- with rollback immediate --立即回滾事務
- --1.1.3不等待立即改變用戶訪問,如不能立即完成,那么會導致執行錯誤
- alter database wc
- set multi_user
- with no_wait
- --1.2.1設置數據庫為在線狀態
- ALTER DATABASE WC
- SET ONLINE
- --1.2.2設置數據庫為脫機狀態
- ALTER DATABASE WC
- SET OFFLINE
- --1.2.3設置數據庫為緊急狀態
- --如果數據庫損壞,將數據庫置為緊急狀態可以允許sysadmin服務器角色到數據庫的只讀訪問
- ALTER DATABASE WC
- SET EMERGENCY
- --1.3.1數據庫只讀
- ALTER DATABASE WC
- SET READ_ONLY
- --1.3.2數據庫可讀寫
- ALTER DATABASE WC
- SET RAD_WRITE
- --2.配置自動選項
- --2.1當數據庫還有最后一個用戶連接且所有操作已經完成,會關閉數據庫且釋放資源
- alter database wc
- SET AUTO_CLOSE OFF
- --2.2自動生成關於列中值的分布的統計信息
- ALTER DATABASE WC
- SET AUTO_CREATE_STATISTICS ON
- --2.3自動更新已經為表創建的統計信息
- ALTER DATABASE WC
- SET AUTO_UPDATE_STATISTICS ON
- --2.4當統計信息過期時,查詢在編譯前不會等待統計信息的更新
- ALTER DATABASE WC
- SET AUTO_UPDATE_STATISTICS_ASYNC OFF
- --2.5當文件的未使用空間超過25%時自動收縮數據和日志文件
- --不過收縮后的文件,不小於文件創建時的大小
- ALTER DATABASE WC
- SET AUTO_SHRINK OFF
- --ANSI SQL選項
- --3.1設置為ON:指定未顯式定義列為NULL
- --默認為OFF:列定義為NOT NULL
- ALTER DATABASE WC
- SET ANSI_NULL_DEFAULT OFF
- --3.2設置為ON:與NULL的值的比較將返回UNKNOWN
- --默認為OFF:兩個NULL比較返回TRUE
- ALTER DATABASE WC
- SET ANSI_NULLS OFF
- --3.3設置為ON:字符串與NULL連接會返回NULL
- --默認為OFF:會把NULL當成空串
- ALTER DATABASE WC
- SET CONCAT_NULL_YIELDS_NULL OFF
- --3.4設為ON:對varchar或nvarchar字符串填充到相同的長度
- --默認為OFF:不會填充
- ALTER DATABASE WC
- SET ANSI_PADDING OFF
- --3.5設為ON:標識符可以用雙引號分隔,字符串可以用單引號分隔
- --默認值是OFF
- ALTER DATABASE WC
- SET QUOTED_IDENTIFIER OFF
- --3.6設為ON:在聚合函數中使用任何NULL值、除數為0、算術溢出錯誤,會報錯
- --默認OFF:不會報錯
- ALTER DATABASE WC
- SET ANSI_WARNINGS OFF
- --3.7當發生溢出、除數為0時查詢會報錯,事務被回滾
- --默認OFF:不會報錯,只是引發警告
- ALTER DATABASE WC
- SET ARITHABORT OFF
- --3.8設置ON:表達式中有精度損失時會報錯,
- --OFF:不會報錯,但會根據精度四舍五入
- ALTER DATABASE WC
- SET NUMERIC_ROUNDABORT OFF
- --3.9遞歸觸發器
- ALTER DATABASE WC
- SET RECURSIVE_TRIGGERS OFF
- --4.1默認值為OFF,on表示在架構相同下,
- --可以跨數據庫引用對象,不會檢查對象安全
- ALTER DATABASE WC
- SET DB_CHAINING ON
- --4.2默認值為OFF,
- --on表示允許加載unsafe、external_access的CLR程序集
- alter DATABASE WC
- SET TRUSTWORTHY OFF
- --5.1數據庫的排序規則
- CREATE DATABASE WCC
- COLLATE UKRAINIAN_CI_AI
- --5.2修改排序規則
- alter database wcc
- collate Chinese_PRC_CI_AS
- --6.1默認是OFF,ON表示在事務提交后自動關閉T-SQL游標
- ALTER DATABASE WC
- SET CURSOR_CLOSE_ON_COMMIT OFF
- --6.2設置為local表示創建的游標默認為本地訪問,global表示全局訪問
- ALTER DATABASE WC
- SET CURSOR_DEFAULT LOCAL
- --7.1啟用日期相關性優化時,SQL Server收集額外的統計信息
- --當兩個表通過datetime類型的外鍵列的關聯時,有助於提高性能
- ALTER DATABASE WC
- SET DATE_CORRELATION_OPTIMIZATION OFF
- --7.2.1啟用快照隔離
- ALTER DATABASE WC
- SET ALLOW_SNAPSHOT_ISOLATION OFF
- --7.2.2啟用讀已提交快照
- ALTER DATABASE WC
- SET READ_COMMITTED_SNAPSHOT OFF
- --7.3數據庫參數化
- --simple表示簡單參數化,
- --forced表示增加查詢的參數化,使查詢計划可以重用,提升查詢性能
- ALTER DATABASE WC
- SET PARAMETERIZATION SIMPLE
- --8.1.1完全恢復
- ALTER database WC
- SET RECOVERY FULL
- --8.1.2大容量加載模式
- ALTER database WC
- SET RECOVERY BULK_LOGGED
- --8.1.3簡單恢復模式
- ALTER database WC
- SET RECOVERY SIMPLE
- --8.2.1默認設置,基於整個數據頁的內容產生校驗和,寫入數據頁頭
- ALTER DATABASE WC
- SET PAGE_VERIFY CHECKSUM
- --8.2.2通過對每個數據頁的512字節扇區的反轉位,檢測數據頁問題
- ALTER DATABASE WC
- SET PAGE_VERIFY TORN_PAGE_DETECTION
- --8.2.3不采用任何校驗
- ALTER DATABASE WC
- SET PAGE_VERIFY NONE
3、數據庫的擁有者
- create database wc
- use wc
- go
- --創建登錄
- create login newwc with password = 'newc'
- --改變數據庫的擁有者
- exec sp_changedbowner
- @loginame = 'newwc'
- --查看數據庫的擁有者
- select sp.name
- from sys.databases d
- inner join sys.server_principals sp
- on sp.sid = d.owner_sid
- where d.name = 'wc'
4、數據庫文件、文件組
- --1.1添加文件組
- ALTER DATABASE WC
- ADD FILEGROUP WC_FG8
- --2.1添加數據文件
- ALTER DATABASE WC
- ADD FILE
- (
- NAME = WC_FG8,
- FILENAME = 'D:\WC_FG8.ndf',
- SIZE = 1mb,
- MAXSIZE = 10mb,
- FILEGROWTH = 1mb
- )
- TO FILEGROUP WC_FG8
- --2.2添加日志文件
- ALTER DATABASE WC
- ADD LOG FILE
- (
- NAME = WC_LOG3,
- FILENAME = 'D:\WC_FG3.LDF',
- SIZE = 1MB,
- MAXSIZE = 10MB,
- FILEGROWTH = 100KB
- )
- --3.1移動數據文件,由於在SQL Server中文件組,文件不能離線
- --所以必須把整個數據庫設置為離線
- ALTER DATABASE WC
- SET OFFLINE
- ALTER DATABASE WC
- MODIFY FILE
- (
- NAME = WC_fg8,
- FILENAME = 'D:\WC\WC_FG8.NDF'
- )
- ALTER DATABASE WC
- SET ONLINE
- --3.2修改數據文件的大小,增長大小,最大大小
- ALTER DATABASE WC
- MODIFY FILE
- (
- NAME = 'WC_FG8',
- SIZE = 2MB, --必須大於之前的大小,否則報錯
- MAXSIZE= 8MB,
- FILEGROWTH = 10%
- )
- --3.3修改數據文件或日志文件的邏輯名稱
- ALTER DATABASE WC
- MODIFY FILE
- (
- NAME = WC_LOG3,
- NEWNAME = WC_FG33
- )
- --3.4刪除日志文件
- ALTER DATABASE WC
- REMOVE FILE WC_FG33
- --3.5刪除數據文件
- --把表新建在文件組wc_fg8上
- CREATE TABLE T(NAME VARCHAr(1000))
- on [wc_fg8]
- INSERT INTO T
- SELECT NAME FROM SYS.objects
- /*===================================================
- 1.要刪除數據文件,那么這個文件必須是空的
- 2.那么通過shrinkfile來清空文件
- 3.而要清空文件必須把文件的內容移到其他文件中
- 4.所以又要確保wc_fg8文件組中還有其他的文件
- 5.增加一個文件,這樣文件wc_fg8中的內容就會移動到新的文件中
- =====================================================*/
- ALTER DATABASE WC
- ADD FILE
- (
- NAME = 'WC_FG18',
- FILENAME = 'D:\WC_FG18.NDF',
- SIZE = 2MB, --必須大於之前的大小,否則報錯
- MAXSIZE= 8MB,
- FILEGROWTH = 10%
- )
- TO FILEGROUP WC_FG8
- --清空wc_fg8文件的內容
- DBCC SHRINKFILE(WC_FG8,EMPTYFILE)
- --移除文件,同時也在文件系統中刪除底層文件
- ALTER DATABASE WC
- REMOVE FILE WC_FG8
- --4.1設置默認文件組
- ALTER DATABASE WC
- MODIFY FILEGROUP WC_FG8 DEFAULT
- --4.2設為只讀文件組
- --如果文件已經是某個屬性,不能再次設置相同屬性
- ALTER DATABASE WC
- MODIFY FILEGROUP WC_FG8 READ_WRITE
- --4.3刪除文件組
- --先必須刪除所有對象
- DROP TABLE T
- --再刪除文件組中的所有文件
- ALTER DATABASE WC
- REMOVE FILE WC_FG88
- --最后刪除文件組
- ALTER DATABASE WC
- REMOVE FILEGROUP WC_FG8
5、管理數據庫空間
把數據雖然刪除了,但是這些被刪除的數據的空間,並沒有釋放,那么在查詢數據的時候,如果你的這個表一共占用了100頁的數據,如果采用表掃描,那么還是得掃描100,如果收縮了,也就是把數據都重新排列,去掉了很多空着的空間,那么可能就剩下30頁了,同樣掃描,只掃描30頁,就必然會快。
就像你看書資料一樣,有100頁的資料,然后你發現很多資料都沒用了,每一頁都有三分之二沒用的資料,划掉了,也就是一頁只有三分之一的資料是有用的。
這個時候,把這些資料,重新錄入一遍,從100頁減少到了33頁,那么你同樣看這么多的資料,所需要翻閱的頁數就少了很多,速度就自然快了。
收縮數據庫影響性能,是有2個方面:
1.在系統運行繁忙的時候,不要去收縮數據庫,因為這會阻塞其他的事務,導致這些操作變慢。
2.也沒有刪除數據,就直接收縮數據庫,這樣有可能把大量的空閑空間給收縮了,而你的情況有所不同,是因為你先刪除了數據,但是刪除數據后,這些空間,並沒有自動釋放,通過收縮數據庫,可以主動釋放這些被delete的數據占用的空間。
所以,是不一樣的。不過,雖然收縮數據庫后,查詢變快了,但確實不建議你去收縮數據庫。
因為收縮數據庫是一個全局的,會影響所有的表,而不是一個表,所以如果你在一個表中刪除了大量的數據,而你這個表又有聚集索引,那么可以通過rebuild 來重建這個表,這樣一樣能達到收縮的目的,而且不會影響其他的表 和整個數據庫。
- /*================================================
- 顯示數據庫的空間使用情況:
- 1.DATABASE_SIZE = RESERVED + UNALLOCATED SPACE(還沒有分配) + 日志空間
- 所以DATABASE_SIZE總是大於reserved + unallocated space之和
- 2.RESERVED = DATA + INDEX_SIZE + UNUSED(已經分配但還沒使用)
- 3.當delete或truncate一個大型對象后,sp_spaceused返回的值
- 可能不正確,這時可以用@updatesuage='true'來更新統計信息,
- 由於此操作可能會花費一些時間,所以只有確定這么做對其他進程沒有負面應影響時才使用.
- 在刪除或重新生成大型索引時,或者在刪除或截斷大型表時,
- 數據庫采用延遲操作,數據庫在事務提交后,才會釋放這些延遲操作所占資源。
- 此外,延遲的刪除操作不會立即釋放已分配的空間,
- 所以sp_spaceused不能准確顯示實際可用空間值.
- ==================================================*/
- --顯示當前數據庫的空間使用情況
- EXEC sp_spaceused
- --顯示表的空間使用
- exex sp_spaceused
- @objname = 'wcT',
- @updateusage = 'true'
- --顯示整個服務器中所有數據庫的日志使用情況
- DBCC SQLPERF(LOGSPACE)
- --收縮數據庫
- DBCC SHRINKDATABASE('WC', --要收縮的數據庫名稱或數據庫ID
- 10 --收縮后,數據庫文件中空間空間占用的百分比
- )
- DBCC SHRINKDATABASE('WC', --要收縮的數據庫名稱或數據庫ID
- 10, --收縮后,數據庫文件中空閑空間占用的百分比
- NOTRUNCATE --在收縮時,通過數據移動來騰出自由空間
- )
- DBCC SHRINKDATABASE('WC', --要收縮的數據庫名稱或數據庫ID
- 10, --收縮后,數據庫文件中空間空間占用的百分比
- TRUNCATEONLY --在收縮時,只是把文件尾部的空閑空間釋放
- )
- --收縮文件
- DBCC SHRINKFILE(wc_fg8, --要收縮的數據文件邏輯名稱
- 7 --要收縮的目標大小,以MB為單位
- )
- DBCC SHRINKFILE(wc_fg8, --要收縮的數據文件邏輯名稱
- EMPTYFILE --清空文件
- )
注意:這里特別需要注意,收縮文件時,特別是收縮日志文件時,收縮是否有效,決定於 日志的回復模式,如果是full模式,之前做過備份,那么收縮基本上是不會成功的,
所以需要先修改為simple模式,然后再收縮,在收縮后再修改為full模式,並做一次完全備份。