我想删除 SQL Server 数据库中一些未使用的文件组/文件,但由于 SQL Server 认为文件组/文件仍在使用中而被卡住。
一些背景:
我像这样查询未使用的文件组的 dm 视图:
SELECT
*
FROM sys.filegroups fg
LEFT OUTER JOIN
sysfilegroups sfg
ON fg.name = sfg.groupname
LEFT OUTER JOIN
sysfiles f
ON sfg.groupid = f.groupid
LEFT OUTER JOIN
sys.indexes i
ON fg.data_space_id = i.data_space_id
WHERE i.object_id IS NULL
Run Code Online (Sandbox Code Playgroud)
这为我提供了我试图从数据库中删除的文件组/文件列表。但其中一些无法删除。示例错误消息:
The filegroup 'FG_XXXX' cannot be removed because it is not empty.
Run Code Online (Sandbox Code Playgroud)我无法通过sys.data_spaces和连接到这些文件组的表/索引sys.indexes:
SELECT * FROM sys.data_spaces ds
INNER JOIN sys.indexes i
ON ds.data_space_id = i.data_space_id …Run Code Online (Sandbox Code Playgroud)我有一个文件组(不是主要的),其中包含两个不同的 .ndf 文件,例如 a1.ndf 和 a2.ndf。
现在我想创建一个表,我希望我的表保存在 a2.ndf 文件而不是 a1 中。有没有办法做这样的事情?我正在使用 SQL Server。
谢谢。
我被分配了一个任务来创建四个文件组(每个卷一个)定位表,以便它们的定位方式在 ETL 过程中不会同时读取和写入文件组。
我已经逐步完成了所有的包、数据流任务、过程和视图,并记录了从哪些表中读取以及以何种顺序读取。
我现在需要编写一个查询来确定表的最佳位置。
在逻辑方面,我有以下几点,将其分解为以下规则。
对于每个序列,源表和目标表不能在同一个卷上。表不能存在于多个卷上。
我很想听听人们对这个过程是否值得的意见,但无论如何我都会感谢一些帮助解决查询。
您可以在下面找到用于创建表和插入一些测试数据的脚本。
在此先感谢您的任何建议。
-- Create table
CREATE TABLE [dbo].[TestData]
(
[TestDataID] [smallint] IDENTITY(1,1) NOT NULL,
[Src] [nvarchar](50) NOT NULL,
[Dest] [nvarchar](50) NOT NULL,
[Seq] [int] NOT NULL,
CONSTRAINT PK_TestData PRIMARY KEY CLUSTERED (TestDataID)
)
GO
-- Insert data
INSERT INTO TestData(Src, Dest, seq)
SELECT 'A', 'B', 1
UNION ALL
SELECT 'A', 'C', 1
UNION ALL
SELECT 'C', 'D', 2
UNION ALL
SELECT 'A', 'D', 3
UNION ALL
SELECT 'B', 'D', 3
GO
Run Code Online (Sandbox Code Playgroud) 我正在尝试备份由我无权访问的人创建的数据库。我收到此错误消息:
不允许备份文件或文件组“fileStream”,因为它不在线。
然后它建议通过T-SQL备份数据库只备份在线文件组。然而,这不是我的要求。
我想使脱机文件组再次联机。我看到了这个答案,它建议使用alter database命令使 fielgroup 脱机。
alter database dn_name
modify file (name='filegroup_name', offline)
go
Run Code Online (Sandbox Code Playgroud)
但是,正如我看到的上述命令的文档,没有选项可以让 fielgroup 重新联机。我该怎么办?如何在 SQL Server 2012 中使文件组(或文件)重新联机?
在我的一个生产数据库中,我有一个包含 3 个数据文件的文件组,这些文件位于 3 个不同的磁盘上。此文件组上有 50 多个表。
如何确定 3 个数据文件之间 50 个表中每一个的位置?我需要知道每个表的聚集索引驻留在哪个数据文件上。
例子 :
Table A : Datafile 1 : FG1
Table B : Datafile 2 : FG1
Table C : Datafile 1 : FG1
Table D : Datafile 3 : FG1
Run Code Online (Sandbox Code Playgroud) 我即将构建一个新的 SQL Server,并计划广泛使用文件组。我预计这台服务器上的 5 个不同数据库会出现大量增长和大量读/写。我计划在每个数据库上创建 2 个额外的文件组(一个用于用户数据,一个用于索引),每个数据库总共有 3 个文件组。我计划在不同的驱动器/主轴之间拆分文件组。此服务器是 EMC SAN 上的虚拟服务器 (VMWare)。我是 SAN 架构的新手,我不是 SAN 管理员。我在“Microsoft SQL Server 2012 Unleashed”一书中读到了关于文件组和 SAN 的简短介绍,文件组在使用 SAN 时可能无关紧要。不幸的是,没有比这更详细的内容了,而且我还没有找到关于该主题的其他内容。
使用 SAN 进行存储时,使用文件组是否有意义?
如果没有,那为什么不呢?如果是这样,那为什么?
关于这个主题,我可以问我的 SAN 管理员什么问题?
我在 SQL Server 2008 R2 上有一个包含 5 个 .ndf(辅助)数据文件的数据库。(这些数据文件中的每一个都被分配到一个单独的文件组。)我想知道这些文件中有哪些数据。是否可以?我知道这些文件组中有全文索引(并且由于每个文件组只有一个文件,因此创建这么多文件的唯一目的可能是将全文索引放在不同的文件组中,我不知道)。我想确保除了全文索引之外没有其他数据。
谢谢
我有一个 SQL Server 2014 数据库,其中包含 100 多个表,在一年中的增长率为 5%。读书多,写作少。
该数据库将通过另一组 20 多个表进行扩展,这些表定期(每季度)在一夜之间增长,几乎与整个数据库其余部分的总和一样多。
这些表在处理结束时在几个小时内完全清空。该数据在这些表是相当消耗,但需要在同一个数据库,其余为参照完整性。
对于一些示例数字,假设第一个 DB 是 20GB,表的子集增长到 15GB,然后被清空。因此,数据的实际大小在几天内在 20 到 35 GB 之间波动。
sql-server filegroups scalability physical-design sql-server-2014
当我在 MY_Database 上运行以下查询时
select * from sys.sysfiles
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
但是当我运行一个动态查询来获取可用空间的百分比时,我得到:
消息 8115,级别 16,状态 7,第 93 行 将数字转换为数据类型数字的算术溢出错误。
DECLARE @command NVARCHAR(MAX)
SELECT @command = 'SELECT db_name() as db_name,
CAST(S.size/128.0 - CAST(FILEPROPERTY(S.name, ' + '''' +
'SpaceUsed' + '''' + ' ) AS int)/128.0 AS int) AS FreeSpaceMB
,CAST(100 * (CAST (((S.size/128.0 -CAST(FILEPROPERTY(S.name,
' + '''' + 'SpaceUsed' + '''' + ' ) AS int)/128.0)/(S.size/128.0))
AS decimal(5,2))) AS varchar(8)) + ' + '''' + '''' + ' AS FreeSpacePct
FROM sys.sysfiles S'
exec …Run Code Online (Sandbox Code Playgroud) sql-server filegroups dynamic-sql database-size sql-server-2014
从我在线阅读的内容来看,与在单个文件组中包含多个文件相比,多个文件组似乎只有两个优势:
能够将特定表隔离到特定驱动器 - 实现此目的的唯一方法是在目标驱动器上添加一个包含文件的新文件组,然后将表移到那里。
可以通过使用只读文件组进行零碎恢复来加快恢复速度。
与单个文件组中的多个文件相比,多个文件组还有其他优势吗?我对性能优势最感兴趣,但欢迎任何想法。