我怎样才能将默认的四个系统数据库迁移到另一个分区?

为什么在4个SQL Server系统数据库对象中看不到任何detach / attach命令? 我想将它移动到每个数据库文件和日志文件的独立分区以获得更好的性能。

我应该这样做还是把它放在C:\ Program Files \ Microsoft SQL Server \ MSSQL10。(dbinstance)\ MSSQL \ DATA?

您不能在系统数据库上使用attach / detach,而是使用alter database语句,并更改指向新位置的启动参数。

以下是MS如何移动系统数据库的指南:

http://msdn.microsoft.com/en-us/library/ms345408.aspx

系统数据库的位置不太可能导致或将导致性能问题。

在执行这个任务之前,你应该回答2个问题:

  1. 是否有性能问题?

  2. 系统数据库的位置是否是导致性能问题的原因?

如果你对这两个问题都不能回答“是”,那么我的build议是把事情保持原样。

为了补充以上2个已经答案,你应该关心的唯一数据库是tempdb。 下面的查询将获得每个数据库IO的数量,如果tempdb比其他人做更多的工作,它是一个很好的指标。 如果是,将tempdb移动到不同的主轴将有所帮助。 您还应该使用WAIT STATISTICS(下面的查询)检查tempdb中是否存在分配瓶颈,并根据需要使用TF 1118和多个tempdb数据文件。 所以如果你添加更多的细节,你可能会得到很好的回应 您可以稍微调整第一个查询来查看每个文件级别的IO统计信息,以获得更多的粒度。

--Per database write cost with running total With g as (select db_name(mf.database_id) as database_name, mf.physical_name, left(mf.physical_name, 1) as drive_letter, vfs.num_of_writes, vfs.num_of_bytes_written as BYTESWRITTEN, vfs.io_stall_write_ms, mf.type_desc, vfs.num_of_reads, vfs.num_of_bytes_read, vfs.io_stall_read_ms, vfs.io_stall, vfs.size_on_disk_bytes from sys.master_files mf join sys.dm_io_virtual_file_stats(NULL, NULL) vfs on mf.database_id=vfs.database_id and mf.file_id=vfs.file_id ) select database_name , sum(BYTESWRITTEN) as BYTES_WRITTEN , Percentage = RTRIM(CONVERT(DECIMAL(5,3),sum(BYTESWRITTEN)*100.0/(SELECT SUM(BYTESWRITTEN) FROM g)))+'%' from g group by database_name order by BYTES_WRITTEN desc -- Isolate top waits for server instance since last restart or statistics clear WITH Waits AS (SELECT wait_type, wait_time_ms / 1000. AS wait_time_s, 100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct, ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn FROM sys.dm_os_wait_stats WHERE wait_type NOT IN( 'BROKER_TASK_STOP', 'BROKER_TRANSMITTER', 'SQLTRACE_BUFFER_FLUSH', 'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'BROKER_EVENTHANDLER', 'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'LAZYWRITER_SLEEP', 'SQLTRACE_WAIT_ENTRIES')) -- filter out additional irrelevant waits SELECT W1.wait_type, CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s, CAST(W1.pct AS DECIMAL(12, 2)) AS pct, CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct FROM Waits AS W1 INNER JOIN Waits AS W2 ON W2.rn <= W1.rn GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold