小编Ran*_*der的帖子

将一列从 NOT NULL 更改为 NULL - 幕后发生了什么?

我们有一个包含 2.3B 行的表。我们想将一列从 NOT NULL 更改为 NULL。该列包含在一个索引中(不是聚集索引或 PK 索引)。数据类型没有改变(它是一个 INT)。只是可空性。声明如下:

Alter Table dbo.Workflow Alter Column LineId Int NULL
Run Code Online (Sandbox Code Playgroud)

该操作在我们停止之前需要超过 10 次(我们甚至还没有让它运行完成,因为它是一个阻塞操作并且花费的时间太长)。我们可能会将表复制到开发服务器以测试实际需要多长时间。但是,我很好奇是否有人知道 SQL Server 在从 NOT NULL 转换为 NULL 时在幕后做了什么?此外,受影响的索引是否需要重建?生成的查询计划并不表明发生了什么。

有问题的表是集群的(不是堆)。

sql-server sql-server-2008-r2 alter-table database-internals

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

删除未使用的索引 - 评估意外危险

根据 DMV 统计数据,我们有一个非常大的数据库,其中包含数百个未使用的索引,这些索引自 7 月份服务器上次重新启动以来一直在累积。我们的一位 DBA 发表了以下警示性声明,这对我来说没有意义:

  1. 在删除索引之前,我们需要确定它是否没有强制执行唯一性约束,因为查询优化器可能需要该索引存在。
  2. 无论何时创建索引,都会在 SQL Server 中创建与该索引相关的统计信息。查询可能没有使用索引,但可能正在使用其统计信息。所以我们可能会遇到这样的情况,在删除索引后,特定的查询性能变得非常糟糕。SQL Server 不保留统计信息的使用情况。尽管我们在数据库上启用了“自动创建统计”功能,但我不知道在查询优化器创建丢失的统计之前必须在内部满足哪些所有参数。

关于#1,在我看来,SQL Server 实际上会在插入/更新完成之前对索引进行查找以确定唯一性,因此,索引不会显示为未使用。

关于#2,这真的可能吗?

顺便说一句,当我说不使用索引时,我的意思是没有搜索和扫描。

index sql-server

16
推荐指数
1
解决办法
819
查看次数

为什么在这个查询中没有使用主(集群)键?

我有一个 SQL Server 2008 R2 表,其架构结构如下所示:

CREATE TABLE [dbo].[CDSIM_BE]
(
    [ID] [bigint] NOT NULL,
    [EquipmentID] [varchar](50) NOT NULL,
    [SerialNumber] [varchar](50) NULL,
    [PyrID] [varchar](50) NULL,
    [MeasMode] [varchar](50) NULL,
    [ReadTime] [datetime] NOT NULL,
    [SubID] [varchar](15) NULL,
    [ProbePosition] [float] NULL,
    [DataPoint] [int] NULL,

    CONSTRAINT [PK_CDSIM_BE] 
    PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] ASC)
         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
               ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])
) ON [MonthlyArchiveScheme9]([ReadTime])

CREATE NONCLUSTERED INDEX [idx_CDSIM_BE__SubID_ProbePosition] 
ON [dbo].[CDSIM_BE] ([SubID] ASC, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization execution-plan sql-server-2008-r2 query-performance

10
推荐指数
1
解决办法
716
查看次数

SQL Server 查询存储 - 什么是“临时”查询?

我一直在深入研究 SQL Server 查询存储,我经常看到对“临时”查询的引用。但是,我还没有看到查询存储确定临时查询是什么。我见过一些地方,它可以被推断为不带参数的查询或只执行一次的查询。是否存在对此的正式定义?我不是说一般。我的意思是因为它与查询存储有关。

例如,此页面显示了从查询存储中删除临时查询的示例,但它使用的条件似乎只是执行计数为 1。这似乎是临时查询的奇怪定义。顺便说一句,如果您转到该页面,请搜索“删除临时查询”。

sql-server query-store

10
推荐指数
1
解决办法
3702
查看次数

sys.dm_exec_requests - start_time

我有以下查询,它告诉我我负责的数据库中查询的状态(尽管我不是 DBA)。

SELECT 
     T3.FullStatement as FullSQLStatement
    ,T3.ExecutingStatement
    ,req.session_id as SessionId
    ,T2.login_name as LoginName
    ,command as SQLCommand
    ,start_time as StartTime
    ,DateDiff(MINUTE,start_time,GetDate()) as ElapsedTimeMinutes
    ,req.status as QueryStatus
    ,req.wait_type as WaitType
    ,req.wait_time as WaitTimeMs
    ,blocking_session_id as BlockingSessionId
    ,req.row_count as [RowCount]
    ,req.cpu_time as CpuTimeMs
    ,req.total_elapsed_time as TotalElapsedTimeMs
    ,SubString(sqltext.TEXT,req.statement_start_offset,req.statement_end_offset-req.statement_start_offset)
FROM sys.dm_exec_requests req
    Inner Join sys.dm_exec_sessions T2 ON T2.session_id = req.session_id
    Cross Apply dbo.GetExecutingSQLStatement (req.session_id) T3
    Cross Apply sys.dm_exec_sql_text(sql_handle) AS sqltext
where req.database_id = 5
Order By 6 Desc
Run Code Online (Sandbox Code Playgroud)

它生成的输出部分如下所示:

在此处输入图片说明 尽管它在我包含的示例中没有很好地显示,但 start_time 是完整语句的开始时间,而不是语句的执行部分。有什么地方可以获取执行部分的开始时间以及完整语句的开始时间。这对我很重要,因为很明显,一个完整的语句可能有许多单独的查询。

sql-server dmv

7
推荐指数
1
解决办法
1222
查看次数

索引碎片 - 我是否正确解释了结果?

我不是 DBA,但我负责一个目前有数百个表和大约 5TB 数据的数据库。我最近运行了以下查询,希望能确定索引碎片:

Declare @DatabaseId Int = DB_ID('ODS')

SELECT 
    OBJECT_NAME(T.OBJECT_ID) as TableName, 
    T2.Name as IndexName,
    T.index_id as IndexId,
    index_type_desc as IndexType,
    index_level as IndexLevel,
    avg_fragmentation_in_percent as AverageFragmentationPercent,
    avg_page_space_used_in_percent as AveragePageSpaceUsedPercent,
    page_count as PageCount
FROM sys.dm_db_index_physical_stats (@DatabaseId, NULL, NULL, NULL, 'DETAILED') T
    INNER JOIN [sys].[indexes] T2 ON T.index_id = T2.index_id And T.object_id = T2.object_id
ORDER BY avg_fragmentation_in_percent DESC
Run Code Online (Sandbox Code Playgroud)

结果集的前30-40行如下(导入Excel后):

在此处输入图片说明

这让我非常吃惊。我读得对吗,我有所有这些索引,实际上还有更多,都是 100% 碎片化的?我的查询正确吗?

index sql-server dmv

6
推荐指数
2
解决办法
635
查看次数

如何将 BACPAC 文件导入 Azure SQL 并覆盖现有数据库?

假设我有一个名为 MyDatabase 的本地数据库。我想将它移动到 Azure SQL 并替换当前驻留在那里的名为 MyDatabase 的现有数据库。我知道如何在本地创建 BACPAC 文件。我知道如何将 BACPAC 导入到我的 Azure 存储帐户。但是,一旦 BACPAC 位于 Azure 存储中,我不知道使用存储中的副本覆盖现有 MyDatabase 数据库的首选方法。我可以导入 BACPAC 文件并创建第二个数据库,然后删除第一个,并重命名刚刚导入的数据库。但是,这样做是最好的还是首选的方式?

sql-server azure-sql-database

6
推荐指数
2
解决办法
2万
查看次数

服务器故障后的 Azure SQL 数据库还原 - 备份在哪里?

根据这篇文章,Azure SQL 备份可用于“将数据库还原到另一个地理区域。当您无法访问您的服务器和数据库时,这允许您从地理灾难中恢复。它在任何地方的任何现有服务器中创建一个新数据库在世界上。

我的问题是这个。如果我的数据库所在的服务器出现故障,我如何能够访问最新的备份以将其恢复到另一台服务器?例如,如果我现在想恢复我的数据库的副本,我会选择我的数据库,然后从页面顶部的菜单中选择恢复选项。但是,如果我丢失了我的服务器(以及我的数据库),我如何访问位于丢失服务器上的数据库的备份?

backup restore azure-sql-database azure

6
推荐指数
1
解决办法
541
查看次数

sys.dm_exec_requests 和 cpu_time

如果查询在多核服务器上执行,并且查询使用并行线程,是否会sys.dm_exec_requests.cpu_time显示执行查询的所有线程消耗的 cpu 时间?我认为是这种情况,但我找不到说明这一点的文档。

dmv

5
推荐指数
1
解决办法
723
查看次数

将 SQL Server 2000 数据库转换为 SQL Server 2016

我需要将一个 SQL Server 2000 数据库还原到 SQL Server 2016。有没有什么可能的方法可以做到这一点,而无需安装 SQL Server 2008 的完整副本,还原到 2008,更改兼容级别,然后将 2008 备份还原到 2016 ? 我知道这行得通,但我真的不想为了这个单一目的而安装 2008 R2,除非我别无选择。

sql-server

5
推荐指数
2
解决办法
3万
查看次数