mssql收縮資料庫
本主題介紹如何使用
SQL
Server
Management
Studio
中的對象資源管理器收縮資料庫。收縮後的資料庫不能小於資料庫的最小大小。最小大小是在資料庫最初創建時指定的大小,或是上一次使用文件大小更改操作(如
DBCC
SHRINKFILE)設置的顯式大小。例如,如果資料庫最初創建時的大小為
10
MB,後來增長到
100
MB,則該資料庫最小隻能收縮到
10
MB,即使已經刪除資料庫的所有數據也是如此。
收縮資料庫
在對象資源管理器中,連接到
SQL
Server
資料庫引擎實例,然後展開該實例。
展開「資料庫」,再右鍵單擊要收縮的資料庫。
指向「任務」,指向「收縮」,然後單擊「資料庫」。
根據需要,可以選中「在釋放未使用的空間前重新組織文件」復選框。如果選中該復選框,必須為「收縮後文件中的最大可用空間」指定值。
選中該選項的作用與執行
DBCC
SHRINKDATABASE
時指定
target_percent
值相同。清除該選項的作用與使用
TRUNCATEONLY
選項執行
DBCC
SHRINKDATABASE
相同。TRUNCATEONLY
將文件收縮到最後分配的區。這將減小文件的大小,但不移動任何數據。默認情況下,該選項為清除狀態。
輸入收縮資料庫後資料庫文件中剩下的最大可用空間百分比。允許的值介於
0
和
99
之間。該選項僅在選中「在釋放未使用的空間前重新組織文件」時可用。
單擊「確定」。
收縮資料庫
當
資料庫中的資料庫文件過於龐大或者存在未使用頁時,可以使用收縮資料庫方法來實現對資料庫的收縮,同樣,事務日誌文件也可以收縮。資料庫文件可以作為組或
單獨地進行手工收縮,也可設置為按指定的時間間隔自動收縮。收縮資料庫的活動是在後台進行,並不影響資料庫內的用戶活動。
操作步驟如下:
(1)打開SQL
Server企業管理器。雙擊打開「資料庫」節點,在要收縮的資料庫名稱上,單擊滑鼠右鍵,在彈出的快捷菜單中選擇「所有任務」→「收縮資料庫」命令,彈出「收縮資料庫」對話框,如圖1所示。
圖1
收縮資料庫
(2)指定資料庫的收縮量,可以從以下選項中選擇。
在「收縮後文件中的最大可用空間」文本框中輸入收縮後資料庫中剩餘的可用空間量。以「資料庫大小,可用空間」值作為依據。如最大可用空間是「25%」,則在該選項中設置小於該數值的百分比,如「12%」。
選擇「在收縮前將頁移到文件起始位置」復選框,使釋放的文件空間保留在資料庫文件中,並使包含數據的頁移到資料庫文件的起始位置。
(3)在「調度」選項框中,選擇是否自動定期執行資料庫壓縮操作。選中「根據本調度來收縮資料庫」復選框,單擊「更改」按鈕,創建或更改自動收縮資料庫的頻率和時間。
(4)最後單擊「確定」按鈕完成操作。
⑵ 怎樣壓縮MSSQL資料庫
分類: 電腦/網路 >> 程序設計 >> 其他編程語言
問題描述:
怎樣壓縮MSSQL資料庫,我的資料庫文件顯示佔用空間120M,可用空間105M,其實正直有用的也只有幾十M,怎樣壓縮呢?請哪位朋友提供解決方法!
解析:
資料庫在使用一段時間後,時常會出現因數據刪除而造成資料庫中空閑空間太多的情況,這時就需要減少分配給資料庫文件和事務日誌文件的磁碟空間,以免浪費磁碟空間。當資料庫中沒有數據時,可以修改資料庫文件屬性直接改變其佔用空間,但當資料庫中有數據時,這樣做會破壞資料庫中的數據,因此需要使用壓縮的方式來縮減資料庫空間。可以在資料庫屬性選項中選擇「Auto shrink」選項,讓系統自動壓縮資料庫,也可以用人工的方法來壓縮。人工壓縮資料庫有以下兩種方式:
1、用Enterprise Manager 壓縮資料庫
在Enterprise Manager 中在所要壓縮的資料庫上單擊右鍵,從快捷菜單中的「所有任務(All Tasks)」中選擇「Shrink Database(壓縮資料庫)」選項
、用Transact-SQL 命令壓縮資料庫
可以使用DBCC SHRINKDATABASE 和DBCC SHRINKFILE 命令來壓縮資料庫。其中DBCC SHRINKDATABASE 命令對資料庫進行壓縮,DBCC SHRINKFILE 命令對資料庫中指定的文件進行壓縮。
(1) DBCC SHRINKDATABASE
DBCC SHRINKDATABASE 命令語法如下:
DBCC SHRINKDATABASE (database_name [, target_percent]
[, {NOTRUNCATE | TRUNCATEONLY}] )
各參數說明如下:
target_percent 指定將資料庫壓縮後,未使用的空間占資料庫大小的百分之幾。如果指定的百分比過大,超過了壓縮前未使用空間所佔的比例,則資料庫不會被壓縮。並且壓縮後的資料庫不能比資料庫初始設定的容量小。
NOTRUECATE
將資料庫縮減後剩餘的空間保留在資料庫,中不返還給操作系統。如果不選擇此選項,則剩餘的空間返還給操作系統。
TRUNCATEONLY
將資料庫縮減後剩餘的空間返還給操作系統。使用此命令時SQL Server 將文件縮減到最後一個文件分配,區域但不移動任何數據文件。選擇此項後,target_percent 選項就無效了。
壓縮資料庫mytest 的未使用空間為資料庫大小的20%。
dbcc shrinkdatabase (mytest, 20)
運行結果如下:
DBCC execution pleted. If DBCC printed error messages, contact your system administrator.
(2) DBCC SHRINKFILE
DBCC SHRINKFILE 命令壓縮當前資料庫中的文件。其語法如下:
DBCC SHRINKFILE ( {file_name | file_id }
{ [, target_size] |
[, {EMPTYFILE | NOTRUNCATE | TRUNCATEONLY}] } )
各參數說明如下:
file_id
指定要壓縮的文件的鑒別號(Identification number, 即ID)。文件的ID 號可以通過 FILE_ID()函數或如本章前面所講述的Sp_helpdb 系統存儲過程來得到。
target_size
指定文件壓縮後的大小。以MB 為單位。如果不指定此選項,SQL Server 就會盡最大可能地縮減文件。
EMPTYFILE
指明此文件不再使用,將移動所有在此文件中的數據到同一文件組中的其它文件中去。執行帶此參數的命令後,此文件就可以用ALTER DATABASE 命令來刪除了。
其餘參數NOTRUNCATE 和TRUNCATEONLY 與DBCC SHRINKDATABASE 命令中的含義相同。
例6-15: 壓縮資料庫mydb 中的資料庫文件mydb_data2 的大小到1MB。 use mydb dbcc shrinkfile (mydb_data2, 1)
⑶ 如何收縮 SQL Server 中的 Tempdb 資料庫
Tempdb 信息
tempdb 是一個臨時工作區。除其他用途外,SQL Server 還將 tempdb 用於:
•
顯式創建的臨時表的存儲。
•
保存在查詢處理和排序過程中創建的中間結果的工作表。
•
具體化的靜態游標。
SQL Server 在 tempdb 事務日誌中記錄的信息只足夠用於回滾事務,而不足以用於在資料庫故障恢復過程中重新執行事務。這一特點提高了
tempdb 中 INSERT 語句的性能。另外,由於每次重新啟動 SQL Server 時都會重新創建
tempdb,無需記錄用於重新執行任何事務的信息。因此,沒有任何要前滾或回滾的事務。當 SQL Server 啟動時,通過使用 model
資料庫的副本重新創建 tempdb,並將其重置為上次配置的大小。
默認情況下,tempdb
資料庫配置為根據需要自動增長;因此,此資料庫可能最終增長到大於所需的大小。簡單地重新啟動 SQL Server 會將 tempdb
的大小重置為上次配置的大小。配置的大小是用文件大小更改操作(如帶有 MODIFY FILE 選項的 ALTER DATABASE 或者 DBCC
SHRINKFILE 語句)設置的上次顯式大小。本文說明您可以用來將 tempdb 收縮到小於其配置的大小的三種方法。
收縮 Tempdb 的方法 1
此方法要求您重新啟動 SQL Server。
1.
停止 SQL Server。打開命令提示符,然後鍵入以下命令啟動 SQL Server:
sqlservr -c -f
-c 和 -f 參數使 SQL Server 以最小配置模式啟動,讓數據文件的 tempdb 大小為 1 MB,日誌文件的 tempdb 為 0.5 MB。
注意:如果使用 SQL Server 命名實例,必須切換到適當的文件夾 (Program Files/Microsoft SQL Server/MSSQL$instance name/Binn),並使用 -s 開關 (-s%instance_name%)。
2.
用查詢分析器連接到 SQL Server,然後運行下列 Transact-SQL 命令:
ALTER DATABASE tempdb MODIFY FILE
(NAME = 'tempdev', SIZE = target_size_in_MB)
--Desired target size for the data file
ALTER DATABASE tempdb MODIFY FILE
(NAME = 'templog', SIZE = target_size_in_MB)
--Desired target size for the log file
3.
通過在命令提示符窗口中按 Ctrl-C 停止 SQL Server,將 SQL Server 作為服務重新啟動,然後驗證 Tempdb.mdf 和 Templog.ldf 文件的大小。
此方法的局限是它只能對默認的 tempdb 邏輯文件 tempdev 和 templog 進行操作。如果將其他文件添加到了 tempdb,您可以在將 SQL Server 作為服務重新啟動後收縮它們。在啟動過程中將重新創建所有 tempdb 文件;因此,它們是空的並可刪除。要刪除 tempdb 中的其他文件,請使用帶有 REMOVE FILE 選項的 ALTER DATABASE 命令。
收縮 Tempdb 的方法 2
使用 DBCC SHRINKDATABASE 命令將 tempdb 資料庫作為整體收縮。DBCC SHRINKDATABASE 接收參數 target_percent,該參數是資料庫收縮後資料庫文件中剩餘可用空間的所需百分比。如果使用 DBCC SHRINKDATABASE,可能必須重新啟動 SQL Server。
重要說明:如果運行 DBCC SHRINKDATABASE,則 tempdb 資料庫不能正在發生其他活動。要確保在運行 DBCC SHRINKDATABASE 時其他進程無法使用 tempdb,必須以單用戶模式啟動 SQL Server。有關更多信息,請參考本文的在使用 Tempdb 時執行 DBCC SHRINKDATABASE 或 DBCCSHRINKFILE 的結果 一節。
1.
通過使用 sp_spaceused 存儲過程確定 tempdb 中當前使用的空間。然後,計算剩餘可用空間的百分比,它將用作 DBCC SHRINKDATABASE 的參數;該計算是基於所需資料庫大小進行的。
注意:在某些情況下,您可能必須執行 sp_spaceused @updateusage=true 來重新計算使用的空間和獲得更新的報告。有關 sp_spaceused 存儲過程的更多信息,請參考 SQL Server 聯機叢書。
請考慮以下示例:
假定 tempdb 有兩個文件:主數據文件 (Tempdb.mdf) 和日誌文件 (Tempdb.ldf),其大小分別為 100 MB 和 30 MB。假定 sp_spaceused 報告主數據文件包含 60 MB 的數據。還假定您要將主數據文件收縮到 80 MB。計算收縮後剩餘可用空間的所需百分比,即 80 MB - 60 MB = 20 MB。現在,用 20 MB 除以 80 MB = 25%,這就是您的 target_percent。事務日誌文件將據此進行收縮,從而在資料庫收縮後剩下 25% 即 20 MB 的可用空間。
2.
用查詢分析器連接到 SQL Server,然後運行下列 Transact-SQL 命令:
dbcc shrinkdatabase (tempdb, 'target percent')
-- This command shrinks the tempdb database as a whole
對 tempdb 資料庫使用 DBCC SHRINKDATABASE
命令具有局限性。數據文件和日誌文件的目標大小不能小於創建資料庫時指定的大小,也不能小於用文件大小更改操作(如帶有 MODIFY FILE 選項的
ALTER DATABASE 命令或 DBCC SHRINKFILE 命令)顯式設置的上次大小。DBCC SHRINKDATABASE
的另一個限制是 target_percentage 參數的計算和它對當前使用的空間的依賴。
收縮 Tempdb 的方法 3
使用命令 DBCC SHRINKFILE 收縮單個 tempdb 文件。DBCC SHRINKFILE 比 DBCC SHRINKDATABASE 提供更多的靈活性,因為您可以對單個資料庫文件使用它而不必影響屬於同一資料庫的其他文件。DBCC SHRINKFILE 接收 target size 參數,這是所需的資料庫文件的最終大小。
重要說明:必須在 tempdb 資料庫不發生任何活動時運行 DBCC SHRINKFILE 命令。要確保在執行 DBCC SHRINKFILE 時其他進程不能使用 tempdb,必須以單用戶模式重新啟動 SQL Server。有關 DBCC SHRINKFILE 的更多信息,請參見本文中在使用 Tempdb 時執行 DBCC SHRINKDATABASE 或 DBCCSHRINKFILE 的結果 一節。
1.
確定主數據文件 (tempdb.mdf)、日誌文件 (templog.ldf) 和/或添加到 tempdb 的其他文件的所需大小。確保在這些文件中使用的空間小於或等於所需的目標大小。
2.
用查詢分析器連接到 SQL Server,然後為需要收縮的特定資料庫運行下列 Transact-SQL 命令:
use tempdb
go
dbcc shrinkfile (tempdev, 'target size in MB')
go
-- this command shrinks the primary data file
dbcc shrinkfile (templog, 'target size in MB')
go
-- this command shrinks the log file, look at the last paragraph.
DBCC SHRINKFILE 的一個優點是它可以將文件大小減小到小於其原始大小。您可以對任何數據文件或日誌文件執行 DBCC SHRINKFILE。DBCC SHRINKFILE 的一個局限是您無法使資料庫小於 model 資料庫的大小。
在 SQL Server 7.0 中,事務日誌收縮是一個推遲操作,您必須執行日誌截斷和備份,以幫助進行資料庫中的收縮操作。但是,默認情況下,tempdb 將 trunc log on chkpt 選項設置為「打開」(ON);這樣,您就無需為該資料庫執行日誌截斷。有關如何在 SQL Server 7.0 中收縮資料庫事務日誌的其他信息,請單擊下面的文章編號,以查看 Microsoft 知識庫中相應的文章:
256650 (http://support.microsoft.com/kb/256650/) INF:如何收縮 SQL Server 7.0 事務日誌
在使用 Tempdb 時執行 DBCC SHRINKDATABASE 或 DBCCSHRINKFILE 的結果
當正在使用 tempdb 時,如果您嘗試通過使用 DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 命令收縮它,可能會收到與以下類型相似的多個一致性錯誤,並且收縮操作可能失敗:
Server:Msg 2501, Level 16, State 1, Line 1 Could not find table named '1525580473'.Check sysobjects.
- 或 -
Server:Msg 8909, Level 16, State 1, Line 0 Table
Corrupt:Object ID 1, index ID 0, page ID %S_PGID.The PageId in the page
header = %S_PGID.
盡管錯誤 2501 可能不表示 tempdb 中的任何損壞,但它會導致收縮操作失敗。與其不同,錯誤 8909 可能表示 tempdb 資料庫中的損壞。應重新啟動 SQL Server 來重新創建 tempdb 並清除一致性錯誤。但是,請記住像錯誤 8909 這樣的物理數據損壞可能有其他原因,這包括輸入/輸出子系統問題。
⑷ SQL資料庫如何壓縮
具體方法有3種。
方法一:
第一步:
backup
log
database_name
with
no_log
或者
backup
log
database_name
with
truncate_only
--
no_log和truncate_only是在這里衡中是同義的,隨便執行哪一句都可以。
第二步:
1.收縮特定資料庫的所有數據和日誌文件,執行:
dbcc
shrinkdatabase
(database_name,[,target_percent])
--
database_name是謹譽要收縮的資料庫名稱;target_percent是資料庫收縮後的資料庫文件中所要的剩餘可用空間百分比。
2.收縮一次一個特定資料庫中的數據或日誌文件,執行
dbcc
shrinkfile(file_id,[,target_size])
--
file_id是要收縮的文件的標識
(id)
號,若要獲得文件
id,請使用
file_id
函數或在當前資料庫中搜索
sysfiles;target_size是用兆位元組表示的所要的文件大小(用整數表示)。如果沒有指定,dbcc
shrinkfile
將文件大小減少到默認文件大小。兩個dbcc都可以帶上參數notruncate或truncateonly,具體意思查看聯機幫助.
方法二:
第一步:
先備份整個資料庫以備不測
。
第二步:
備份結束後,在query
analyzer中執行如下的語句:
exec
sp_detach_db
yourdbname,true
--卸除這個db在mssql中的注冊信息
第三步:
到日誌的物理文件所在的目錄中去刪除該日誌文件或者將該日誌文件移出該目錄
第四步:
在query
analyzer中執行如下的語句:
exec
sp_attach_single_file_db
yourdbname,'
d:\mssql\data\yourdbname_data.mdf
'
--以單文件的方式注冊該db,如果成功則mssql將自動為這個db生成一個500k的日誌文件。
方法三:
1.
進入企業管理器,選中資料庫,比如demo
2.
所有任務->分離資料庫
3.
到資料庫文件的存放目錄,將muonline_log.ldf文件刪除,以防萬一,你可以拷出去
4.
企業管理器->附加資料庫,選muonline,這個時候你會看見日誌文件這項是一個叉,不要緊,繼續,此時資料庫就會提示你該資料庫無日誌是否創建一個新的,確定就是了。
5.
記得資料庫重新附加後用戶要重新設置一下。
如果以後,不祥攔段想要它變大:
sql2000下使用:
在資料庫上點右鍵->屬性->選項->故障恢復-模型-選擇-簡單模型。
或用sql語句:
alter
database
資料庫名
set
recovery
simple
⑸ SQLServer資料庫收縮相關知識
SQL Server 資料庫採取預先分配空間的方法來建立資料庫的數據文件或者日誌文件,比如數據文件的空間分配了300MB,而實際上只佔用了20MB空間,這樣就會造成磁碟存儲空間的浪費。可以通過資料庫收縮技術對資料庫中的每個文件進行收縮,刪除已經分配但沒有使用的頁。從而節省伺服器的存儲的成本。
官方解釋:收縮數據文件通過將數據頁從文件末尾移動到更靠近文件開頭的未佔用的空間來恢復空間。在文件末尾創建足夠的可用空間後,可以取消對文件末尾的數據頁的分配並將它們返回給文件系統。
收縮後的資料庫不能小於資料庫最初創建時指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)設置的顯式大小。
比如:如果資料庫最初創建時的大小為 10 MB,後來增長到 100 MB,則該資料庫最小隻能收縮到 10 MB,即使已經刪除資料庫的所有數據也是如此。
不能在備份資料庫時收縮資料庫。 反之,也不能在資料庫執行收縮操作時備份資料庫。
介紹:收縮指定資料庫中的數據文件大小。
語法格式:
參數說明:
介紹:收縮當前資料庫的指定數據或日誌文件的大小,或通過將數據從指定的文件移動到相同文件組中的其他文件來清空文件,以允許從資料庫中刪除該文件。文件大小可以收縮到比創建該文件時所指定的大小更小。這樣會將最小文件大小重置為新值。
語法格式:
參數說明:
例如,如果創建一個10MB 的文件,然後在文件仍然為空的時候將文件收縮為2 MB,默認文件大小將設置為2 MB。這只適用於永遠不會包含數據的空文件。
另附SqlServer常見問題解答
1)管理器不會主動刷新,需要手工刷新一下才能看到最新狀態(性能方面的考慮)
2)很少情況下,恢復進程被掛起了。這個時候假設你要恢復並且回到可訪問狀態,要執行:
RESTORE database dbname with recovery
這使得恢復過程能完全結束。
3)如果你要不斷恢復後面的日誌文件,的確需要使資料庫處於「正在還原狀態」,
這通常是執行下面命令:
RESTORE database dbname with norecovery
原來SQL Server對伺服器內存的使用策略是用多少內存就佔用多少內存,只用在伺服器內存不足時,才會釋放一點佔用的內存,所以SQL Server 伺服器內存往往會佔用很高。我們可以通過DBCC MemoryStatus來查看內存狀態。
SQL SERVER運行時會執行兩種緩存:
1. 數據緩存:執行個查詢語句,SQL SERVER會將相關的數據頁(SQL SERVER操作的數據都是以頁為單位的)載入到內存中來, 下一次如果再次請求此頁的數據的時候,就無需讀取磁碟了,大大提高了速度。
2.執行命令緩存:在執行存儲過程,自定函數時,SQL SERVER需要先二進制編譯再運行,編譯後的結果也會緩存起來, 再次調用時就無需再次編譯。
可以調用以下幾個DBCC管理命令來清理這些緩存:
但是,這幾個命令雖然會清除掉現有緩存,為新的緩存騰地方,但是Sql server並不會因此釋放掉已經佔用的內存。SQL SERVER並沒有提供任何命令允許我們釋放不用到的內存。因此我們只能通過動態調整SQL SERVER可用的物理內存設置來強迫它釋放內存。
解決SQLSERVER內存佔用過高的方法:
1、清除所有緩存DBCC DROPLEANBUFFERS
2、調整SQLSERVER可使用的最大伺服器內存。
在SQL管理器,右擊實例名稱
在屬性實例屬性裡面找到內存選項
把最大內存改成合適的內存,確定後內存就會被強制釋放,然後重啟實例。再看看任務管理器,內存使用率就降下來啦。
1、查看連接對象
USE master
GO
--如果要指定資料庫就把注釋去掉
SELECT * FROM sys.[sysprocesses] WHERE [spid]>50 --AND DB_NAME([dbid])='gposdb'
當前連接對象有67個其中『WINAME』的主機名,『jTDS』的進程名不屬於已知常用軟體,找到這台主機並解決連接問題。在360流量防火牆中查看有哪個軟體連接了伺服器IP,除之。
2、然後使用下面語句看一下各項指標是否正常,是否有阻塞,正常情況下搜索結果應該為空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC
查看是哪些SQL語句佔用較大可以使用下面代碼
--在SSMS里選擇以文本格式顯示結果
SELECT TOP 10
dest.[text] AS 'sql語句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC
3、如果SQLSERVER存在要等待的資源,那麼執行下面語句就會顯示出會話中有多少個worker在等待
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '開始時間',
[status] AS '狀態',
[command] AS '命令',
dest.[text] AS 'sql語句',
DB_NAME([database_id]) AS '資料庫名',
[blocking_session_id] AS '正在阻塞其他會話的會話ID',
der.[wait_type] AS '等待資源類型',
[wait_time] AS '等待時間',
[wait_resource] AS '等待的資源',
[dows].[waiting_tasks_count] AS '當前正在進行等待的任務數',
[reads] AS '物理讀次數',
[writes] AS '寫次數',
[logical_reads] AS '邏輯讀次數',
[row_count] AS '返回結果行數'
FROM sys.[dm_exec_requests] AS der
INNER JOIN [sys].[dm_os_wait_stats] AS dows
ON der.[wait_type]=[dows].[wait_type]
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC;
4、查詢CPU佔用最高的SQL語句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_offset/2 + 1,
(CASE WHEN statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
END - statement_start_offset)/2)
FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC;
5、索引缺失查詢
SELECT
DatabaseName = DB_NAME(database_id)
,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;
找到索引缺失的表,根據查詢結果中的關鍵次逐一建立索引。
⑹ 教你如何收縮MSSQL資料庫
收縮MSSQL資料庫之一:清空日誌DUMP TRANSACTION 庫名 WITH NO_LOG 收縮MSSQL資料庫之二:截斷事務日誌:BACKUP LOG 資料庫名 WITH NO_LOG收縮MSSQL資料庫之三:收縮資料庫文件(如果不壓縮,資料庫的文件不會減小企業管理器--右鍵你要壓縮的資料庫--所有任務--收縮資料庫--收縮文件--選擇日誌文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了--選擇數據文件--在收縮方式里選擇收縮至XXM,這里會給出一個允許收縮到的最小M數,直接輸入這個數,確定就可以了也可以用SQL語句來完成--收縮資料庫DBCC SHRINKDATABASE(客戶資料)--收縮指定數據文件,1是文件號,可以通過這個語句查詢到:select * from sysfilesDBCC SHRINKFILE(1)收縮MSSQL資料庫之四:為了最大化的縮小日誌文件(如果是sql 7.0,這步只能在查詢分析器中進行)a.分離資料庫:企業管理器--伺服器--資料庫--右鍵--分離資料庫b.在我的電腦中刪除LOG文件c.附加資料庫:企業管理器--伺服器--資料庫--右鍵--附加資料庫此法將生成新的LOG,大小隻有500多K或用代碼:下面的示例分離 pubs,然後將 pubs 中的一個文件附加到當前伺服器。a.分離E X E C sp_detach_db @dbname = 'pubs'b.刪除日誌文件c.再附加E X E C sp_attach_single_file_db @dbname = 'pubs',@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'收縮MSSQL資料庫之五:為了以後能自動收縮,做如下設置:企業管理器--伺服器--右鍵資料庫--屬性--選項--選擇"自動收縮"--SQL語句設置方式:E X E C sp_dboption '資料庫名', 'autoshrink', 'TRUE'6.如果想以後不讓它日誌增長得太大企業管理器--伺服器--右鍵資料庫--屬性--事務日誌--將文件增長限制為xM(x是你允許的最大數據文件大小)--SQL語句的設置方式:alter database 資料庫名 modify file(name=邏輯文件名,maxsize=20)收縮MSSQL資料庫之特別注意:請按步驟進行,未進行前面的步驟,請不要做後面的步驟否則可能損壞你的資料庫.一般不建議做第4,6兩步第4步不安全,有可能損壞資料庫或丟失數據第6步如果日誌達到上限,則以後的資料庫處理會失敗,在清理日誌後才能恢復.另外提供一種更簡單的方法,本人屢試不爽,建議大家使用。收縮MSSQL資料庫之更簡單的方法:1。右建資料庫屬性窗口--故障還原模型--設為簡單2。右建資料庫所有任務--收縮資料庫3。右建資料庫屬性窗口--故障還原模型--設為大容量日誌記錄以上就是對如何讓收縮MSSQL資料庫的簡單介紹。卑錟憬舛寥患指慈砑
⑺ 如何減小SqlServer資料庫文件大小
收縮資料庫
一般情況下,SQL資料庫的收縮並不能很大程度上減小資料庫大小,其主要作用是收縮日誌大小,應當定期進行此操作以免資料庫日誌過大
1、設置資料庫模式為簡單模式:打開SQL企業管理器,在控制台根目錄中依次點開Microsoft SQL Server-->SQL Server組-->雙擊打開你的伺服器-->雙擊打開資料庫目錄-->選擇你的資料庫名稱(如論壇資料庫Forum)-->然後點擊右鍵選擇屬性-->選擇選項-->在故障還原的模式中選擇「簡單」,然後按確定保存
2、在當前資料庫上點右鍵,看所有任務中的收縮資料庫,一般裡面的默認設置不用調整,直接點確定
3、收縮資料庫完成後,建議將您的資料庫屬性重新設置為標准模式,操作方法同第一點,因為日誌在一些異常情況下往往是恢復資料庫的重要依據
⑻ SQL Server資料庫的收縮一直在執行
刪除表給資料庫縮小空間時:執行如下操作老是存在執行了5,6個小時,還是一直沒有執行完成。
在開啟自動收縮選項的情況下,SQLServer定期會檢查文件使用情況。如果空閑空間大於25%,SQLServer就會自動運行自動收縮資料庫文件的動作。
⑼ MSSQL 清空日誌 刪除日誌文件
最近的項目主要做數據的歸檔 把數據從一個資料庫拉到另一個資料庫 造成新資料庫的日誌文件非常大 或者資料庫在使用過程中會使日誌文件不斷 增加 使得資料庫的性能下降 並且佔用大量的磁碟空間 於是想把日誌文件刪除 最簡單就是先分離資料庫 》刪除日誌文件 》最後附加數據 我這里需要在 SSIS中調用 所以已羨輪殲sql腳本為主
兩種簡單的清除日誌的方法
一分離附加法 首先把資料庫分離 分離資料庫之前一定要做好資料庫的全備份 選擇資料庫——右鍵——任務——分離 其中葯勾選刪除連接!
分離後在資料庫列表將看不到已分離的資料庫 刪除資料庫的LOG文件資料庫文件夾下的對應資料庫的 ldf文件 附加資料庫 附加的時候會提醒找不到log文件 到時附加上後會自動創建一個新的日誌文件 從而達到清理資料庫的目的
二 sql語句清除mssql日誌 DUMP TRANSACTION TestDB WITH NO_LOG 清除日誌 DBCC SHRINKFILE ( TestDB_log ) 收縮資料庫文件 BACKUP LOG TestDB WITH NO_LOG 截兄沖斷事務日誌 該命令在SQL Server 也桐滑是不支持 在SQL Server 和 可以使用
首先我們需要獲取資料庫文件的路徑
declare @logfilename varchar( ) declare @datafilename varchar( ) select @logfilename=physical_name from sys database_files where type= select @datafilename=physical_name from sys database_files where type=
然後切換到master下 分離資料庫
use master exec sp_detach_db @dbname= TestVFA ;
緊接下來就是刪除資料庫 日誌文件 Remove file DECLARE @Result int DECLARE @FSO_Token int EXEC @Result = sp_OACreate Scripting FileSystemObject @FSO_Token OUTPUT EXEC @Result = sp_OAMethod @FSO_Token DeleteFile NULL @logfilename EXEC @Result = sp_OADestroy @FSO_Token 最後就是附加資料庫 exec sp_attach_single_file_db @dbname= TestVFA @physname=@datafilename
注意 默認Ole Automation Proceres 是禁用的我們需要啟用它
lishixin/Article/program/MySQL/201311/29584