标签: sql-server-2012

如何删除表分区

我想从 SQL Server 2012 数据库中的表中删除分区。表有主键,但分区列不是主键。我还想保持数据结构和模式完好无损。

我试过:

select * 
into [dbo].[new_Non_partitioned_Table] 
from [dbo].[partitioned_table]
Run Code Online (Sandbox Code Playgroud)

然后我删除了分区表并重命名了新表。但是,它导致我丢失了数据结构和一些迫使我放弃约束的依赖项 (FK)。这是用于生产和数据丢失不是一种选择。

有没有更好的方法从现有表中删除分区?

sql-server partitioning sql-server-2012

4
推荐指数
1
解决办法
4万
查看次数

如何按表计算磁盘 I/O

如果所有表都在同一个文件中,是否可以找出哪些表对读/写操作的贡献最大?

我一直在看以下 DMV

SELECT *
FROM sys.dm_io_virtual_file_stats
Run Code Online (Sandbox Code Playgroud)

但它只显示整个文件的统计信息,不知道如何拆分成单个表。尝试这样做是为了识别应该放在不同磁盘上自己文件中的表。

dmv sql-server-2012

4
推荐指数
1
解决办法
5167
查看次数

为什么递归 CTE 估计只有 1 行?

给定两个级联的、独立的(没有真正的表)递归 CTE:

create view NumberSequence_0_100_View
as
with NumberSequence as
(
    select 0 as Number
    union all
    select Number + 1
      from NumberSequence    
     where Number < 100
)
select Number
  from NumberSequence;
go

create view NumberSequence_0_10000_View
as
select top 10001
       v100.Number * 100 + v1.Number as Number
  from Common.NumberSequence_0_100_View v100
 cross join Common.NumberSequence_0_100_View v1
 where v1.Number < 100
   and v100.Number * 100 + v1.Number <= 10000
    -- please resist complaining about "order by in view" for this question
 order by v100.Number …
Run Code Online (Sandbox Code Playgroud)

sql-server cte sql-server-2012 recursive cardinality-estimates

4
推荐指数
1
解决办法
780
查看次数

如何在 VLF 中找到活动交易?

有没有办法找到作为阻止重用事务日志文件 VLF 的活动事务的一部分的 T-SQL 语句?

我每 15 分钟执行一次 tlog 备份,但有时会返回以下查询ACTIVE_TRANSACTIONLOG_BACKUP(甚至这样):

SELECT [name]
      ,[recovery_model_desc] 
      ,[log_reuse_wait_desc]
FROM [sys].[databases]
Run Code Online (Sandbox Code Playgroud)

如果我运行,DBCC Loginfo我可以看到 firsts 和 lasts 行都有 status 0

sql-server sql-server-2012 transaction-log

4
推荐指数
1
解决办法
4174
查看次数

数据库恢复时间过长的可能原因

这是在 SSC 交叉发布的,但现在恢复需要 6 个小时。

你好,

一夜之间,我使用 NORECOVERY 对 5tb 数据库以及其他几个 250GB - 1.3tb 数据库进行了恢复。我这样做是因为有时我们的 3rd 方备份软件会在认为某些内容超时而实际上没有超时时抛出古怪的 LSN 错误。无论如何,恢复完成没有错误。今天早上,我开始运行 RESTORE WITH RECOVERY 命令,使它们联机以进行 DBCC 检查。

在第一个数据库上运行良好,在 5tb 数据库上卡住了大约一个小时,然后我在其余六个数据库上与 5tb 并行运行命令。他们都恢复得很快。5tb 的数据库现在已经恢复了大约 3 个小时。

任何想法:

为什么这会比两者都花费更长的时间:

a) 恢复通常需要多长时间,以及 b) 比其他数据库恢复所需的时间长得多?

如果我应该取消/终止交易并尝试重新开始

我可以看到它在 sp_WhoIsActive 中做了一些事情,即信息列正在增加,等待信息发生变化(尽管它似乎总是处于等待状态是 IO_COMPLETION),但状态似乎总是被挂起。

在研究时,我发现一篇文章表明高 VLF 计数可能导致此问题,并且日志文件中大约有 5k VLF,但我使用的是 2012 版本,已针对该问题进行了修补:

Microsoft SQL Server 2012 - 11.0.5532.0 (X64) 2014 年 7 月 14 日 15:00:27 版权所有 (c) Microsoft Corporation Developer Edition(64 位)在 Windows NT 6.3(Build 9600:)(Hypervisor)上

谢谢

编辑:

这是在我用于卸载 DBCC …

sql-server sql-server-2012

4
推荐指数
1
解决办法
1653
查看次数

无法使用复制向导将数据库从 SQL Server 2000 复制到 SQL Server 2012

我正在尝试使用安装了 SQL Server 2012 的本地计算机中的复制向导将数据库从 SQL Server 2000 复制到 SQL Server 2012。但是,向导未检测到目标服务器。Source DB 在网络上,Destination 是我的本地机器本身。

当我选择目标服务器作为我的本地机器时,我收到以下错误:

标题:复制数据库向导

目标服务器不能是 SQL Server 2005 或更高版本的 Express 实例。

如果“源”早于 SQL Server 2005,是否不支持复制数据库向导?但错误消息仅说明“目的地”。这里我的目的地是 SQL Server 2012,源是 SQL Server 2000。

sql-server sql-server-2012

4
推荐指数
1
解决办法
2728
查看次数

使用 sp_BlitzIndex - 诊断为“索引囤积者:沉迷于空值”

上下文:MS SQL Server 2012

在使用 Kendra Little 的强大工具 sp_BlitzIndex 时,许多表被诊断为“索引囤积者:沉迷于空值”。

我不是在寻找关于 NULL 及其位置的辩论。我知道在某些情况下 NULL 非常合适,甚至是必要的。这里的问题是 sp_BlitzIndex 提供的反馈,以及强制执行 not NULL 约束的值。

在 sp_BlitzIndex 被“诊断”为具有许多允许 NULL 的列的大多数表中,没有任何实际的 NULL 值。我们以编程方式不允许它们。我只是从未取消选中“允许空值”框以在数据库级别强制执行该约束。

强制执行此约束有什么好处,为什么它是她的脚本确定的问题之一?

谢谢!

null sql-server index-tuning sql-server-2012 sp-blitzindex

4
推荐指数
1
解决办法
1834
查看次数

验证用户是否对表具有读取权限

我正在开发一个 ETL,其提取步骤必须从表中读取数据。

有时我的用户对该表的访问权限被撤销。因此,为了避免 ETL 失败,在阅读表之前,我必须验证我是否有权这样做。如果没有,我将跳过提取步骤并运行 ETL 的其余部分。

验证我的用户是否对表具有读取权限的正确方法是什么?

sql-server permissions sql-server-2012 ssis-2012

4
推荐指数
1
解决办法
6638
查看次数

缩小旧分区

我有一个大的分区时间序列表,其中每个分区都存储在它自己的文件中。由于它是基于时间序列的分区按周划分,而且我只存储新数据,因此我一次积极写入的分区不超过 2 个。我在索引上将 FILLFACTOR 设置为 75,因为数据是随机输入的。

旧的数据分区占用了相当多的空间,仅使用了大约 60-70% 的空间。是否可以自动更改所述分区上的 FILLFACTOR,重建索引并缩小文件?由于我不再写入这些分区,因此它们的大小不应再增长。

sql-server shrink partitioning sql-server-2012 fill-factor

4
推荐指数
1
解决办法
1822
查看次数

相同 SQL 语句的执行计划不同

作为此问题的背景,可以在此链接中找到详细信息。

简而言之:除了RIGHT表之外,我有 2 个几乎相同的 SQL 语句。该LEFT JOIN是相同的,并且返回的列不同,因为该表是不同的。数据库从 2008 年移至 SQL Server 2012 实例。在 2012 实例上,1 个查询在 3 秒内执行,而另一个则需要将近 2 小时才能执行。执行计划有所不同,并发布在链接上。

但是,我可以接受这两个查询并在 SQL Server 2008 服务器上执行它们,它们都在 3 秒内完成。2008 服务器上的两个执行计划与 2012 服务器上的“良好”执行计划相同。

我有一个可以工作的新语句,但它所使用的应用程序是一个使用内联 SQL 的 C# windows 应用程序。我不想打破这个 1 语句的模式。任何人都可以阐明这个问题吗?

sql-server t-sql execution-plan sql-server-2008-r2 sql-server-2012

4
推荐指数
1
解决办法
3854
查看次数