我们有一个包含 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
根据 DMV 统计数据,我们有一个非常大的数据库,其中包含数百个未使用的索引,这些索引自 7 月份服务器上次重新启动以来一直在累积。我们的一位 DBA 发表了以下警示性声明,这对我来说没有意义:
关于#1,在我看来,SQL Server 实际上会在插入/更新完成之前对索引进行查找以确定唯一性,因此,索引不会显示为未使用。
关于#2,这真的可能吗?
顺便说一句,当我说不使用索引时,我的意思是没有搜索和扫描。
我有一个 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
我一直在深入研究 SQL Server 查询存储,我经常看到对“临时”查询的引用。但是,我还没有看到查询存储确定临时查询是什么。我见过一些地方,它可以被推断为不带参数的查询或只执行一次的查询。是否存在对此的正式定义?我不是说一般。我的意思是因为它与查询存储有关。
例如,此页面显示了从查询存储中删除临时查询的示例,但它使用的条件似乎只是执行计数为 1。这似乎是临时查询的奇怪定义。顺便说一句,如果您转到该页面,请搜索“删除临时查询”。
我有以下查询,它告诉我我负责的数据库中查询的状态(尽管我不是 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 是完整语句的开始时间,而不是语句的执行部分。有什么地方可以获取执行部分的开始时间以及完整语句的开始时间。这对我很重要,因为很明显,一个完整的语句可能有许多单独的查询。
我不是 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% 碎片化的?我的查询正确吗?
假设我有一个名为 MyDatabase 的本地数据库。我想将它移动到 Azure SQL 并替换当前驻留在那里的名为 MyDatabase 的现有数据库。我知道如何在本地创建 BACPAC 文件。我知道如何将 BACPAC 导入到我的 Azure 存储帐户。但是,一旦 BACPAC 位于 Azure 存储中,我不知道使用存储中的副本覆盖现有 MyDatabase 数据库的首选方法。我可以导入 BACPAC 文件并创建第二个数据库,然后删除第一个,并重命名刚刚导入的数据库。但是,这样做是最好的还是首选的方式?
根据这篇文章,Azure SQL 备份可用于“将数据库还原到另一个地理区域。当您无法访问您的服务器和数据库时,这允许您从地理灾难中恢复。它在任何地方的任何现有服务器中创建一个新数据库在世界上。 ”
我的问题是这个。如果我的数据库所在的服务器出现故障,我如何能够访问最新的备份以将其恢复到另一台服务器?例如,如果我现在想恢复我的数据库的副本,我会选择我的数据库,然后从页面顶部的菜单中选择恢复选项。但是,如果我丢失了我的服务器(以及我的数据库),我如何访问位于丢失服务器上的数据库的备份?
如果查询在多核服务器上执行,并且查询使用并行线程,是否会sys.dm_exec_requests.cpu_time显示执行查询的所有线程消耗的 cpu 时间?我认为是这种情况,但我找不到说明这一点的文档。
我需要将一个 SQL Server 2000 数据库还原到 SQL Server 2016。有没有什么可能的方法可以做到这一点,而无需安装 SQL Server 2008 的完整副本,还原到 2008,更改兼容级别,然后将 2008 备份还原到 2016 ? 我知道这行得通,但我真的不想为了这个单一目的而安装 2008 R2,除非我别无选择。
sql-server ×8
dmv ×3
index ×2
alter-table ×1
azure ×1
backup ×1
optimization ×1
performance ×1
query-store ×1
restore ×1