搜尋本站文章

2008-01-22

Oracle 買下 MySQL 所使用的 InnDB 資料庫引擎



MySQL 支援數種資料庫引擎,像是: MyISAM、InnDB、MERGE、DBD(BerkeleyDB)、Archive 與 NDB 等等。請參考下圖所示:

MyISAM 是預設的資料庫引擎,但是不支援 Transaction。支援 Transaction 的資料庫引擎有像是: InnDB、DBD(BerkeleyDB)等等。

InnDB 是採用 GNU GPL 證書的方式來授權。

但是 Oracle 在 2005/10/07 ,買下了 Innobase 這家公司,而 InnDB 正是他們公司所開發的資料庫引擎。

截至目前 InnDB 仍是採用 GNU GPL 證書的方式來授權;Oracle 買下 MySQL 所使用某一資料庫引擎,未來是會造成什麼影響,留待時間來驗證。

MySQL 雖然有自行研發下一代數據庫引擎 Falcon,並已經在 MySQL 6.0 上提供使用,但目前僅支援 32-bit Windows and 32-bit 或 64-bit Linux operating systems 。

參考資料:
Choosing a Storage Engine
http://dev.mysql.com/doc/refman/5.1/en/storage-engine-choosing.html

http://www.innodb.com/

http://www.innodb.com/company/

http://www.oracle.com/innodb/index.html

http://wiki.oracle.com/page/InnoDB?t=anon

The Falcon Storage Engine in MySQL Server 6.0
http://www.mysql.com/news-and-events/on-demand-webinars/display-od-86.html

MySQL Falcon - Getting Started Guide
http://www.mysql.com/why-mysql/white-papers/falcon-getting-started.php

Understanding the Falcon Transaction Storage Engine - Part 1
http://dev.mysql.com/tech-resources/articles/falcon-transactional-engine-part1.html

2008-01-17

初探 Expression Studio ; install Expression Studio



Expression Studio 分成為四項軟體:

  • Microsoft Expression Web

  • Microsoft Expression Blend™

  • Microsoft Expression Design

  • Microsoft Expression Media



Expression Web
Expression Web 是一個專業的設計工具,可用來建立現代感十足、且以標準為基礎的網站,讓您在 Web 上提供絕佳的品質。
Expression Web Designer 是針對專業網頁設計者提供的新產品,它將 FrontPage 和 Visual Studio 技術的最佳優點合併到一個專業的設計者使用者介面中,以建立 XHTML、CSS、XML、XSLT 和 ASP.NET 2.0。在合適的地方,網頁設計工具和 Visual Studio 的使用者介面和功能是相同的 (例如 ASP.NET 控制項屬性)。


Expression Blend
Expression Blend 是專業的設計工具,可在 Windows 上產生迷人、以 Web 連線的使用者經驗。先前名稱為 "Interactive Designer"。
透過 .NET Framework 3.0,設計師與開發人員可以協同合作來建立視覺上令人讚歎的 Windows 應用程式,以提供卓越的使用者經驗並提升使用者的產能和滿意度。.NET Framework 3.0 包括 Windows Presentation Foundation,它引進了 XAML (Extensible Application Markup Language),這是一種用以描述應用程式使用者介面、文件和媒體內容的標記語言。XAML 可做為往返通訊的格式,設計師和開發人員可用以直接交換和在使用 Expression Studio 和 Visual Studio 建立的應用程式上協同合作。

Expression Design
Expression Design 是一個專業的插圖和圖形設計工具,可讓您同時為 Web 和桌面應用程式使用者介面建立吸引人的項目。
先前名稱為 "Graphic Designer"。
匯入下列格式的檔案: .tif、.psd、.jpg、.bmp、.png、.gif 檔案。Expression Design 可以匯出下列格式的檔案:.tif、.psd、.jpg、.bmp、.png、.gif、.ai、.eps、.pdf、.xaml。此外,還支援複製/貼上 Microsoft® Office、匯出成 HTML 以整合到網站使用者介面、匯出成 XAML 加入至 Windows Vista。
此外,Expression Design 已經於 2007/11/2 發佈:Service Pack 1。

Expression Media
Expression Media 是一個專業的資產管理工具,可視覺化地分類與組織您所有的數位資產,讓您輕鬆地擷取與呈現。
想像一下,如果您可以找到任何您要的資料,將可增加多少產能。Expression Media 可以讓您輕鬆地管理數位資產 — 只要使用拖放功能, 即可匯入超過 100 種不同的媒體格式,包括了數位 RAW 檔。即使您的原始資料處於離線狀態,Expression Media 的視覺化目錄,仍可以讓您瀏覽、搜尋和標註您的資產。


利用 MSDN Subscription 提供的 Expression Studio 進行安裝時:

安裝時要一套一套慢慢裝,也就是說:若是您需要的 Expression Studio 整體的功能,就需要分別安裝四次,才能將 Expression Studio 安裝完成。

1. 安裝 Expression Web 時,輸入 MSDN Subscription 提供的 Expression Studio 序號,竟然會產生[金鑰不正確]的錯誤訊息。
改用 Expression Web 所使用的[大量授權識別碼]才能夠通過驗證。

安裝時,Expression Design、Microsoft Expression Blend 是不需要再度輸入序號的。

2. Expression Blend™ 與 Expression Design 安裝完成後,將會變成試用版本,可用 60 天。
點選[說明]\[輸入產品金鑰],輸入 MSDN Subscription 提供的 Expression Studio 的安裝金鑰即可變為正式版本。

3. 記得要再去安裝 Expression Design Service Pack 1
提醒:不會自動安裝更新的 [ 說明 ] 檔案。

如果要安裝更新的 [ 說明 ] 檔案, 請依照下列步驟執行:
1. 造訪下列 Microsoft Expression Design SP 1 [ 說明 ] 檔案的網頁:
http://go.microsoft.com/fwlink/?LinkId=101861
下載並解壓縮 .ZIP 壓縮套件以取得其中的 Design.chm 檔案。
2. 將該 Design.chm 檔案複製到 Expression Design 安裝目錄下的 "zh-CHT" 資料夾中。該資料夾的預設位置為:
%ProgramFiles%\Microsoft Expression\Design 1.0\zh-CHT

注意 在複製更新版的使用手冊 (CHM) 至 zh-CHT 資料夾前,請先備份該目錄下舊版的 Design.chm。

整體而言,安裝十分簡單,全程都有安裝精靈可以輔助我們平順完成安裝。

請參考以下的文章:
Microsoft 官方網址:
Microsoft® Expression®
http://www.microsoft.com/taiwan/products/expression/default.mspx
http://www.microsoft.com/expression/default.aspx

Microsoft Expression Design Service Pack 1
發佈日期: 2007/11/2
http://www.microsoft.com/downloads/details.aspx?FamilyId=937ADF32-0FEA-4BB7-B727-CBFBDF3FE032&displaylang=zh-tw

Microsoft Expression Design 使用者指南
http://www.microsoft.com/downloads/details.aspx?FamilyId=6956D2B5-B070-42A3-BD68-665A8C865216&displaylang=zh-tw

本次 MSDN Subscription Expression Studio 請先暫時壓著
http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1998.entry#comment

以下是安裝時的抓圖,各位可以做為參考:























2008-01-04

刪除所有連線; Kill All Connection



若是要刪除指定資料庫上的所有連線,可以使用以下方式:

SINGLE_USER 引數
指定每次只能有一位使用者存取資料庫。
如果指定了 SINGLE_USER,且沒有其他使用者連接到資料庫,就會封鎖 ALTER DATABASE 陳述式,直到所有使用者都中斷指定的資料庫為止。

資料庫會保留在 SINGLE_USER 模式中,即使是將選項記錄設為關閉的使用者也是如此。
此時其他使用者可以連接到這個資料庫,但只能有一位。

WITH ROLLBACK IMMEDIATE 引數
使用終止選項。所有未完成的交易都會回復,與指定資料庫的所有連接都會立即中斷。

若是要刪除指定資料庫上的所有連線,請參考以下的範例:


USE master
GO
ALTER DATABASE [資料庫名稱]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO


若是要刪除 SQL Server 上全部的連線,可以使用以下的範例,並且保留本身這條連線不會刪除。



以下是 SQL Server 2005 版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)

DECLARE spids_cr CURSOR FOR
SELECT session_id FROM sys.dm_exec_connections
WHERE session_id<>@@SPID
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr

GO

-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections

-- 刪除所有的處理序、連線、session
EXEC KillUserConnections

-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
SELECT * FROM sys.dm_exec_connections



以下是 SQL Server 2000 與 2005 通用的版本

USE master
GO
CREATE PROC KillUserConnections
AS
DECLARE @spid int, @SQLstr nvarchar(128)

DECLARE spids_cr CURSOR FOR
SELECT spid
FROM master..sysprocesses
WHERE spid<>@@SPID AND net_address<>''
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr

GO

-- 檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2

-- 刪除所有的處理序、連線、session
EXEC KillUserConnections

-- 再度檢視 SQL Server 目前所有的連線 session ;所有目前的處理序
EXEC sp_who2


其中 sysprocesses 此為 SQL Server 2000 系統資料表。


還有其他方法嗎?
1. 停止 SQL Server ? 呵呵...這應該不是好方法。
2. 中斷伺服器的網路連線。
3. 啟用防火牆。
...等等

2008-01-03

SSIS 2005 與 Excel 2007 (*.xlsx , *.xlsb)




2010/07/10 更新:
在「Microsoft Office 12.0 Access Database Engine OLE DB Provider」設定視窗,
在「全部」頁面,點選「Extended Properties」,點選「編輯內容值」,請依據附檔名來填寫:

*.xlsx -- > 填入 Excel 12.0 xml
*.xlsb -- > 填入 Excel 12.0




在使用 Excel 2003(*.xls)時,有數項條件限制,例如:
  • 最大資料列筆數是 65,536 列。Excel 匯出選項會檢查此數值,若超過此限制,會在 Excel 中顯示錯誤。
  • 最大資料行數是 256 行。Excel 匯出選項會檢查此數值,若超過此限制,會在 Excel 中顯示錯誤。

要解決此問題,可能有幾個方法:

  • 當資料筆數會超過 65,536 筆數時,採用新增工作表的方式,讓每個工作表的資料列筆數,不會超過 65,536 筆數的軟體限制。
  • 改用 Excel 2007 ,存檔成 *.xlsx 的檔案格式,也可以解決此問題。
    將資料匯出成 *.csv 檔案格式,分隔符號選擇為:[逗號{,}],再利用 Excel 2007 開啟存取,也可以正常運作。

以下是使用 SSIS ,將資料匯入到 Excel 2003(*.xls)所遇到錯誤:



Excel 2003(*.xls)至多僅能達到 65,536 列。


改用新版本的 Excel 2007(*.xlsx) 也可以改善這些問題,舉例來說:

  • 可支援到 1,048,576 筆資料列。
  • 可支援到 16,384 資料行。
  • Excel 2007 讓試算表的容量擴充到超過 1 百萬資料列和 1 萬 6 千資料行。



在 Integration Services 中,要與 Excel 2007 連線時,可能要注意以下幾件事情:

  • Excel 2007 與 Excel 2003 兩個版本的檔案格式不同,這可能表示我們無法再使用[Microsoft Jet 4.0 OLE DB Provider]來與 Excel 2007 進行連線。
  • 在 Microsoft Office 2007 中,發行了新版本的 OLD DB 驅動程式:[Microsoft Office 12.0 Access Database Engine OLE DB Provider],縮寫為 ACE。

新版本的 ACE 驅動程式,可以稍作屬性的調整,就可以與 Excel 2007 及 Access 2007 連線,請各位參考以下的整理:

  • 在[SQL Server 匯入和匯出精靈]中,若是要使用 Excel 2007 作來資料來源或是目的地,則需要利用[Microsoft Office 12.0 Access Database Engine OLE DB Provider],點選[屬性],在[資料連結內容]視窗中,點選[全部]頁面,點選[Extended Properties],輸入以下的資料:Excel 12.0 。
  • 在設計 SSIS 封裝時,若是要使用 Excel 2007 作來資料來源或是目的地,需要使用[OLE DB 連接管理員],然後在[提供者]畫面,選擇[Microsoft Office 12.0 Access Database Engine OLE DB Provider],請記得,一樣需要設定[Extended Properties]的內容值為:Excel 12.0。
  • 至於[Excel 連接管理員]、[Microsoft Jet 4.0 OLE DB Provider]這類的資料庫驅動程式,則仍然適用於與 Excel 2003 (*.xls)進行連線。

筆者提供與利用[SQL Server 匯入和匯出精靈]與 Excel 2007 連線的設定步驟:

0. 請事先利用 Excel 2007 在 C:\ 中,建立 Ex01.xlsx 的檔案。

1. 在資料來源或是目的地的驅動程式部分,選擇[Microsoft Office 12.0 Access Database Engine OLE DB Provider]。



2. 點選[屬性],在[資料連結內容]畫面,點選[資料來源],輸入:C:\Ex01.xlsx。




3. 點選[全部]頁面,點選[Extended Properties],點選[編輯內容值],輸入以下的資料:Excel 12.0。





4. 再點選回[連線]頁面,點選[測試連線],正常應該可以看到測試連線成功的訊息,請按下[確定]\[確定],完成與 Excel 2007 的連線設定,按[下一步]。

若是沒有事先建立 Excel 2007(*.xlsx)檔案時:



如果您的需求是讓 SSIS 於執行時,當下由系統動態創建此 *.xlsx 檔案,無須事先建立此 *.xlsx 檔案。
請將輸入的副檔名修改為 *.xlsb 檔案格式,就可以讓系統自行動態建立此檔案,也能夠正常開啟運作。

Excel 2007 的檔案格式

  • Excel 2007 支援多種的檔案格式,依據預設值,副檔名是 *.xlsx,這是一種以 XML 為基礎的全新檔案格式,稱為 Microsoft Office Open XML Formats,具備了數項優點:壓縮檔案、改良的受損檔案復原、輕鬆偵測包含巨集的文件、對個人資訊提供更理想的隱私權保護與更嚴密的控管、更完善地整合並互通商業資料等等,檔案大小也會比(*.xls)來的更小;此外,由於檔案格式屬於 XML 架構格式,再加上開放、免權利金的授權,讓我們開發人員更容易就能建置與採用 Excel 2007 文件內容及中繼資料的解決方案。
  • Excel 2007 二進位檔案格式(BIFF12),其副檔名是:*.xlsb,這是 Excel 2007 專屬的二進位檔案格式(BIFF12);與先前的版本之二進位檔案格式,副檔名是:*.xls 是不相容的,例如:在 Excel 5.0/95 版本是(BIFF5),在 Excel 97-2003 版本是(BIFF8)。

參考資料:

Excel 2007 中支援的檔案格式
http://office.microsoft.com/zh-tw/excel/HP100141031028.aspx

將 Office Excel 2007 與舊版 Excel 搭配使用
http://office.microsoft.com/zh-hk/excel/HA100775613076.aspx

新副檔名與 Office XML Formats 簡介
http://office.microsoft.com/zh-tw/help/HA100069351028.aspx


Excel 2007 的規格及限制
http://office.microsoft.com/zh-tw/excel/HP100738491028.aspx

Improving Performance in Excel 2007
http://msdn2.microsoft.com/zh-tw/library/aa730921.aspx#Office2007excelPerf_BigGridIncreasedLimitsExcel


無法匯入超過 65,536 列是文字檔到 Excel 97、 Excel 2000、 Excel 2002 和 Excel 2003
http://support.microsoft.com/kb/120596/

Summary of capability limitations in Excel 97
http://support.microsoft.com/kb/296053/en-us


匯出至 Excel (*.xls)的限制
http://technet.microsoft.com/zh-tw/library/aa337207.aspx

Limitations with Exporting to Excel(*.xls)
http://msdn2.microsoft.com/en-us/library/aa337207.aspx

2008-01-02

顯示每一個資料庫的所使用的磁碟空間之完整版本; Displays the disk space reserved and used by the each database



若是需要顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間等等報表時:

可以參考:

顯示資料庫所使用的磁碟空間、資料實際所使用的空間; Displays the disk space reserved and used by the whole database

檢視全部的資料庫,其交易記錄檔案所使用的空間資訊; Transaction log space usage statistics for all databases

筆者彙整範例如下:
顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。

USE master

CREATE TABLE tDBSize
([DBName] [nchar](128) NULL CONSTRAINT [DF_tDBSize_DBName]  DEFAULT (db_name()),
Fileid INT, FileGroup INT, TotalExtents INT,
UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000)
)

CREATE TABLE tLogSize
(DBName sysname, logsize float, used float, status int)

--
SET NOCOUNT ON
DECLARE @mydb sysname,@mystr nvarchar(4000)

DECLARE allDB CURSOR FOR
SELECT name FROM master..sysdatabases

OPEN allDB

FETCH NEXT FROM allDB INTO @mydb

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @mystr='USE ['+ @mydb +'] INSERT master.dbo.tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName) EXEC (''DBCC showfilestats'')'
EXECUTE (@mystr)

FETCH NEXT FROM allDB INTO @mydb
END

CLOSE allDB
DEALLOCATE allDB

--
INSERT INTO master.dbo.tLogSize
EXECUTE ('DBCC SQLPERF(LOGSPACE)')

-- 完整呈現資料
SELECT D.DBName N'資料庫',
TotalExtents N'資料使用的硬碟空間(MB)',
UsedExtents N'資料實際使用(MB)',
logsize N'交易記錄檔使用的硬碟空間(MB)',
(logsize*used/100) N'交易記錄檔實際使用(MB)'
FROM tLogSize L INNER JOIN (
SELECT DBName ,
SUM(TotalExtents*64.0/1024) N'TotalExtents',
SUM(UsedExtents*64.0/1024) N'UsedExtents'
FROM tDBSize
GROUP BY DBName) D
ON L.DBName=D.DBName

DROP TABLE [dbo].[tDBSize]
DROP TABLE [dbo].[tLogSize]


請參考以下的執行結果:



筆者調整了資料顯示的精確度:精確到小數點第二位
彙整範例如下:
顯示 SQL Server 上,每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。

-- 查詢每一個資料庫,資料檔案實際所使用的空間、資料檔案使用的磁碟空間、交易記錄檔案實際所使用的空間、交易記錄檔案使用的磁碟空間。
USE master
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tDBSize]') AND type in (N'U'))
DROP TABLE [dbo].[tDBSize]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tLogSize]') AND type in (N'U'))
DROP TABLE [dbo].[tLogSize]
GO
CREATE TABLE tDBSize
([DBName] [nchar](128) NULL DEFAULT (db_name()),
Fileid INT, FileGroup INT, TotalExtents INT,
UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000)
)
GO
CREATE TABLE tLogSize
(DBName sysname, logsize float, used float, status int)
GO
--
SET NOCOUNT ON
DECLARE @mydb sysname,@mystr nvarchar(4000)
 
DECLARE allDB CURSOR FOR
SELECT name FROM master..sysdatabases
 
OPEN allDB
 
FETCH NEXT FROM allDB INTO @mydb
 
WHILE (@@FETCH_STATUS=0)
BEGIN
SET @mystr='USE ['+ @mydb +'] INSERT master.dbo.tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName) EXEC (''DBCC showfilestats'')'
EXECUTE (@mystr)
 
FETCH NEXT FROM allDB INTO @mydb
END
 
CLOSE allDB
DEALLOCATE allDB
 
--
INSERT INTO master.dbo.tLogSize
EXECUTE ('DBCC SQLPERF(LOGSPACE)')
 
-- 精確到小數點第二位
SELECT D.DBName N'資料庫',
CAST(TotalExtents AS decimal(18,2)) N'資料使用硬碟空間(MB)',
CAST(UsedExtents AS decimal(18,2)) N'資料實際使用(MB)',
CAST(logsize AS decimal(18,2)) '交易記錄檔使用硬碟空間(MB)',
CAST((logsize*used/100) AS decimal(18,2)) '交易記錄檔實際使用(MB)'
FROM tLogSize L INNER JOIN (
SELECT DBName ,
SUM(TotalExtents*64.0/1024) N'TotalExtents',
SUM(UsedExtents*64.0/1024) N'UsedExtents'
FROM tDBSize
GROUP BY DBName) D
ON L.DBName=D.DBName
 
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tDBSize]') AND type in (N'U'))
DROP TABLE [dbo].[tDBSize]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tLogSize]') AND type in (N'U'))
DROP TABLE [dbo].[tLogSize]
GO


請參考以下的執行結果:

顯示資料庫所使用的磁碟空間、資料實際所使用的空間; Displays the disk space reserved and used by the whole database


我們可以使用:

sp_spaceused

可以用於:顯示資料列的數目、所保留的磁碟空間和資料表所用的磁碟空間、索引檢視,或目前資料庫中的 SQL Server 2005 Service Broker 佇列,或顯示整個資料庫所保留和使用的磁碟空間。

重要引數:
@updateusage:
指出應該執行 DBCC UPDATEUSAGE 來更新空間使用方式資訊。當未指定 objname 時,會針對整個資料庫執行這個陳述式;
否則,就會針對 objname 來執行這個陳述式。值可以是 true 或 false。updateusage 是 varchar(5),預設值是 false。

提醒:
database_size 一律會大於 reserved + unallocated space 的總和,因為它包括記錄檔的大小,但 reserved 和 unallocated_space 只考量資料頁。

XML 索引和全文檢索索引所用的頁面包括在兩個結果集的 index_size 中。當指定了 objname 時,reserved 和 index_size 總結果也會將物件的 XML 索引和全文檢索索引的頁面計算在內。

當指定了 updateusage 時,SQL Server 2005 Database Engine 會掃描資料庫中的資料頁,關於每份資料表所用的儲存空間,它會進行 sys.allocation_units 和 sys.partitions 目錄檢視的必要更正。

例如,在某些狀況下,在卸除索引之後,資料表的空間資訊可能不是目前的資訊。
如果是大型資料表或資料庫,updateusage 的執行時間可能會比較長。
請只在您覺得傳回的值不正確時,以及不會對資料庫的其他使用者或處理序造成不良影響時,才使用 updateusage。
如果願意的話,您可以個別執行 DBCC UPDATEUSAGE。

當您卸除或重建大型索引時,或卸除或截斷大型資料表時,Database Engine 會延遲取消配置實際的頁面及其相關聯鎖定,直到認可交易之後。延遲的卸除作業並不會立即釋出已配置的空間。
因此,在卸除或截斷大型物件之後,sp_spaceused 立即傳回的值不一定能反映實際可用的磁碟空間。


請參考以下的範例:

USE AdventureWorks;
GO
-- 檢視目前資料庫所用的空間,但不一定能反映實際可用的磁碟空間。
EXEC sp_spaceused
GO
-- 要求掃描資料庫中的全部的資料頁後,再檢視目前資料庫所用的空間
EXEC sp_spaceused @updateusage = N'TRUE';
GO


請參考以下的執行結果:





所使用我們在使用 sp_spaceused 時,將會面臨幾個問題:

  • 沒有使用 @updateusage = N'TRUE',顯示出來的實際可用的磁碟空間可能不正確。
  • 使用 @updateusage = N'TRUE' 可以顯示實際可用的磁碟空間,卻當下額外耗用系統資源。
  • 預存程序顯示的結果集,不容易再利用。
  • 未分別資料檔案與交易記錄檔案之空間使用。
    等等...

可能有幾種方式可以處理這問題,筆者以 DBCC showfilestats 這個 undocumented command 來討論:
請參考以下的範例:

USE AdventureWorks
GO
DBCC showfilestats




請參考以下的執行結果:




TotalExtents:指所使用的磁碟空間 Extents(64KB)
UsedExtents:指資料實際所佔用的空間 Extents(64KB)


筆者整理後,請參考以下的範例:
檢視單一資料庫,各個資料檔案的硬碟使用空間與資料實際使用空間


USE AdventureWorks
GO
SET NOCOUNT ON
DECLARE @tDBSize TABLE
(DBName SYSNAME DEFAULT(DB_NAME()),
Fileid INT, FileGroup INT, TotalExtents INT,
UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000)) 

INSERT @tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName)
EXEC ('DBCC showfilestats')

SELECT DBName N'資料庫',Name N'資料檔案',
TotalExtents*64.0/1024 N'資料檔案使用硬碟空間(MB)',
UsedExtents*64.0/1024 N'資料實際使用空間(MB)', FileName N'實體檔案路徑'
FROM @tDBSize
GO



請參考以下的執行結果:




筆者整理後,請參考以下的範例:
檢視單一資料庫,各個[資料檔案]、[交易記錄檔]的硬碟使用空間與資料實際使用空間

USE AdventureWorks
GO
SET NOCOUNT ON
DECLARE @tDBSize TABLE
(DBName SYSNAME DEFAULT(DB_NAME()),
Fileid INT, FileGroup INT, TotalExtents INT,
UsedExtents INT, Name SYSNAME, FileName NVARCHAR(4000)) 

DECLARE @tLogSize TABLE
(DBName sysname, logsize float, used float, status int)

INSERT @tDBSize(Fileid,FileGroup,TotalExtents,UsedExtents,Name,FileName)
EXEC ('DBCC showfilestats')

INSERT INTO @tLogSize
EXECUTE ('DBCC SQLPERF(LOGSPACE)')

SELECT D.DBName N'資料庫',D.Name N'資料檔案',
TotalExtents*64.0/1024 N'資料檔案使用硬碟空間(MB)',
UsedExtents*64.0/1024 N'資料實際使用空間(MB)',
logsize N'交易記錄檔整體使用的硬碟空間(MB)',
(logsize*used/100) N'交易記錄檔整體的實際使用(MB)'
FROM @tLogSize L INNER JOIN @tDBSize D
ON L.DBName=D.DBName


請參考以下的執行結果:







檢視全部的資料庫,其交易記錄檔案所使用的空間資訊; Transaction log space usage statistics for all databases



我們可以利用:

DBCC SQLPERF 陳述式


提供所有資料庫如何使用交易記錄空間的統計資料。它可以用來重設等候及閂鎖統計資料。

權限
若要執行 DBCC SQLPERF(LOGSPACE),需要伺服器的 VIEW SERVER STATE 權限。
若要重設等候和閂鎖統計資料,需要伺服器的 ALTER SERVER STATE 權限。


EX1. 顯示所有資料庫的記錄檔空間資訊
下列範例會顯示目前所安裝之所有資料庫的 LOGSPACE 資訊。


DBCC SQLPERF(LOGSPACE);
GO


以下為結果集:



可能的缺陷:

  • 顯示的是每個資料庫其交易記錄其所佔用實體檔案的百分比。
  • 無法排序。
  • 無法僅搭配篩選式來過濾資料。

我們以下的改寫範例可為參考:

檢視全部的交易記錄檔的空間使用 -- 使用資料表變數

SET NOCOUNT ON
DECLARE @tLogSize TABLE
(DBName sysname, logsize float, used float, status int)

INSERT INTO @tLogSize
EXECUTE ('DBCC SQLPERF(LOGSPACE)')

-- 依據交易記錄檔的大小,由高到低的進行排序
SELECT DBName '資料庫', logsize N'交易記錄檔整體使用的硬碟空間(MB)',
(logsize*used/100) N'交易記錄檔整體的實際使用(MB)'
FROM @tLogSize
ORDER BY 2 DESC



以下為結果集:





分析:

  • 可以依其所需進行排序。
  • 可以依其所需進行篩選資料。
  • 可彈性自訂所需要的資料,例如:顯示實際所佔用的磁碟空間(MB)等等。