我必须从生产数据库创建 DACPAC。我想通过 Visual Studio 2022(SQL Server 对象资源管理器和“提取 - 数据层应用程序”)来执行此操作。是否可以阻止任何进程/查询或利用更多 CPU/内存来执行此操作?
adam.g's questions
我们的 SQL Server 版本为 SQL Server 2016 和 SQL Server 2019。我们已经检查是否可以在没有侦听器的情况下在 SQL Server 2019 上进行故障转移,但我无法在 SQL Server 2016 上测试它。您知道这是否也可能吗?
目前我们的生产 SQL Server 是Standard_D96ds_v5
Azure VM 机器。
我们收到请求检查是否可以将服务器规模缩小到Standard_D48ds_v5
.
将考虑采取哪些措施来确认我们可以缩小服务器规模?
我们正在使用 SQL Server 2016。我们在 2023 年 9 月 11 日的查询持续时间方面遇到一些问题。想在 QueryStore 上检查它,我在 2023 年 9 月 11 日 05:00 PM 执行的查询存储上看到:
2023 年 9 月 11 日,我们的执行次数要多得多(2023 年 9 月 8 日,执行次数约为 1150 VS 800)。我在 2023 年 9 月 12 日运行相同的查询存储检查,发现昨天的执行计数比我昨天检查的要少得多。
你知道为什么我们会有这样的差异吗?更重要的是,我仍然看到 2023 年 9 月 11 日的执行计数仍在减少。
查询执行 2023-09-14 9:52 AM:
我想创建交易,它将:
- 如果存在则禁用更改跟踪。
- 表的 TRUNCATE 分区。
- 将分区从不同的表切换到主表。
- ENABLE 更改跟踪 IF 之前被禁用。
想要创建带有参数的脚本,所以我将使用动态 SQL。主意:
/* OPS parameters */
DECLARE @schemaName sysname = 'dbo';
DECLARE @tableName sysname = 'TABLE';
DECLARE @partition INT = 90;
/* DEV parameters */
DECLARE @tableNameSRP sysname = CONCAT(@tableName, '_SRP');
DECLARE @tableNameWithSchema sysname = CONCAT(QUOTENAME(@schemaName), '.', QUOTENAME(@tableName));
DECLARE @tableNameWithSchemaSRP sysname = CONCAT(QUOTENAME(@schemaName), '.', QUOTENAME(@tableNameSRP));
DECLARE @isCtReEnabled BIT = 0;
DECLARE @isDebug BIT = 1;
SET TRAN ISOLATION LEVEL READ UNCOMMITTED;
SET XACT_ABORT ON;
BEGIN TRAN;
BEGIN TRY
IF EXISTS (
SELECT
1
FROM sys.change_tracking_tables
WHERE object_id = OBJECT_ID(@tableNameWithSchema)
)
BEGIN
SET @statement = N'ALTER TABLE ' + @tableNameWithSchema + N' DISABLE CHANGE_TRACKING;';
IF (@isDebug = 0)
BEGIN
EXEC sp_executesql @stmt = @statement;
END;
IF (@isDebug = 1)
BEGIN
RAISERROR('[INFO] SQL: %s', 0, 1, @statement) WITH NOWAIT;
END;
SET @isCtReEnabled = 1;
END;
SET @statement
= N'TRUNCATE TABLE ' + @tableNameWithSchema + N' WITH (PARTITIONS (' + CAST(@partition AS NVARCHAR(5)) + N'))
ALTER TABLE ' + @tableNameWithSchemaSRP + N' SWITCH PARTITION ' + CAST(@partition AS NVARCHAR(5)) + N' TO ' + @tableNameWithSchema + N' PARTITION '
+ CAST(@partition AS NVARCHAR(5));
IF (@isDebug = 0)
BEGIN
EXEC sp_executesql @stmt = @statement;
END;
IF (@isDebug = 1)
BEGIN
RAISERROR('[INFO] SQL: %s', 0, 1, @statement) WITH NOWAIT;
END;
IF (@isCtReEnabled = 1)
BEGIN
SET @statement = N'ALTER TABLE ' + @tableNameWithSchema + N' ENABLE CHANGE_TRACKING;';
IF (@isDebug = 0)
BEGIN
EXEC sp_executesql @stmt = @statement;
END;
IF (@isDebug = 1)
BEGIN
RAISERROR('[INFO] SQL: %s', 0, 1, @statement) WITH NOWAIT;
END;
END;
COMMIT;
END TRY
BEGIN CATCH
SET @errorMessage = ERROR_MESSAGE();
RAISERROR('ERROR MESSAGE: %s', 0, 1, @errorMessage) WITH NOWAIT;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
我的问题:
- 启用/禁用更改跟踪、截断和分区切换等操作是否可以在一个事务中进行?(想要执行全部或不执行)
- 在这种情况下动态sql有问题吗?
我看到有人交换了下面的代码:
SELECT
PK1
, PK2
, PK3
, PK4
, C
, B
, SUM(NUMERIC_1)
, SUM(NUMERIC_2)
, MAX(NUMERIC_3)
, SUM(NUMERIC_4)
FROM MATDOC_EXTRACT
WHERE A = ''
AND (
(
(
B = ''
OR B = 'K'
)
AND (
C = '01'
OR C = '02'
OR C = '07'
OR C = '08'
)
)
OR (
B = ''
AND (
C = '03'
OR C = '04'
)
)
)
GROUP BY PK1
, PK2
, PK3
, PK4
, C
, B;
对于这个
SELECT
PK1
, PK2
, PK3
, PK4
, C
, B
, SUM(NUMERIC_1)
, SUM(NUMERIC_2)
, MAX(NUMERIC_3)
, SUM(NUMERIC_4)
FROM sap.MATDOC_EXTRACT
WHERE A = N''
AND B = N''
AND C IN (N'01', N'02', N'07', N'08', N'03', N'04')
GROUP BY PK1
, PK2
, PK3
, PK4
, C
, B
UNION ALL
SELECT
PK1
, PK2
, PK3
, PK4
, C
, B
, SUM(NUMERIC_1)
, SUM(NUMERIC_2)
, MAX(NUMERIC_3)
, SUM(NUMERIC_4)
FROM sap.MATDOC_EXTRACT
WHERE A = N''
AND B = N'K'
AND C IN (N'01', N'02', N'07', N'08')
GROUP BY PK1
, PK2
, PK3
, PK4
, C
, B;
他们平等吗?
我正在构建应用程序,该应用程序必须具有配置(禁用/启用)特定数据库表上的更改跟踪的选项。我正在通过 SQL 用户连接到数据库。需要为 SQL 用户添加哪些数据库权限以禁用/启用对表的更改跟踪和运行以下查询的选项:
SELECT DISTINCT
sct1.name AS CT_schema
, sot1.name AS CT_table
, ps1.row_count AS CT_rows
, sct2.name AS tracked_schema
, sot2.name AS tracked_name
, CHANGE_TRACKING_MIN_VALID_VERSION(sot2.object_id) AS min_valid_version
, itt.create_date AS change_tracking_table_creation_date
, CAST(ps1.reserved_page_count * 8. / 1024 AS BIGINT) AS CT_reserved_MB
, CAST(ps2.reserved_page_count * 8. / 1024 AS BIGINT) AS tracked_base_table_MB
, ps2.row_count AS tracked_rows
FROM sys.internal_tables it
JOIN sys.objects sot1
ON it.object_id = sot1.object_id
JOIN sys.schemas AS sct1
ON sot1.schema_id = sct1.schema_id
JOIN sys.dm_db_partition_stats ps1
ON it.object_id = ps1.object_id
AND ps1.index_id IN (0, 1)
LEFT JOIN sys.objects sot2
ON it.parent_object_id = sot2.object_id
LEFT JOIN sys.schemas AS sct2
ON sot2.schema_id = sct2.schema_id
LEFT JOIN sys.dm_db_partition_stats ps2
ON sot2.object_id = ps2.object_id
AND ps2.index_id IN (0, 1)
INNER JOIN sys.internal_tables itt
ON itt.name = sot1.name
WHERE it.internal_type IN (209, 210);
在 SQL Server 2016 (13.0.6300.2) 上,我们有一个表有两个 XML 列和大约 1500000 行。表的大小约为 150 GB。压缩此表的最佳选择是什么?我在开发环境中检查 PAGE 压缩,但它只节省了 3%。在 Sql Server 2019 上(计划在不久的将来更新)是否有可能会更好?
是否有任何选项可以查看查询存储中的已终止会话?
我在问,因为我们有一个额外的工具,如果会话运行时间超过 30 分钟(KILL
命令),它就会终止会话。
我想检查查询存储中的执行计划是否有已终止的查询。我在查询存储会话/查询中找不到被这个附加应用程序杀死的。
我在查询存储中强制执行计划。计划与每天运行一次的作业中的程序相关联。这项工作的步骤之一就是:
EXEC [schema].[LoadData]
过程 [schema].[LoadData] 看起来像
TRUNCATE TABLE [schema].[Data];
INSERT INTO [schema].[Data]
([A1],
[A2],
.
.
.,
[A49]
)
SELECT *
,CURRENT_TIMESTAMP AS [Insert TimeStamp]
FROM [schema].[View]
其中 view 是一个包含一些 CTE 并使用同义词的视图(连接到来自不同数据库的表)。
要测试强制计划是否有效,我按照以下步骤操作:
- 在 SSMS 中运行查询 ->
EXEC [schema].[LoadData]
- 上面的执行被视为不同的查询,因此在查询存储中没有看到任何新的查询 = 7
- DBA 只需使用正在运行查询的步骤创建一个新作业 ->
EXEC [schema].[LoadData]
- 运行上述新创建的工作原因计划 ID = 29800
质疑为什么不强制执行计划?在“强制计划失败计数”列中为 0。
我需要在 Sql Server 上模拟错误:
“Msg 0, Level 20 A severe error occurred on the current command”
因为我们的开发人员必须在应用程序中处理它。
如何模拟/触发这种错误?(我也可以在我的本地主机上尝试)。
想问一下,因为找不到这个信息。
服务器重启后查询存储强制计划是否仍然存在?
在哪些情况下,通过查询存储强制执行计划不会保持有效?
我们从客户端获得票证,该票证有时会从查询中获取部分数据。简单的单词查询是视图查询:
SELECT column1, column2, column3, column4, column5, column6 ... column50
from [dbo].[view]
查看返回大约 300 万条记录。在服务器上,我们有一些规则会在运行 30 分钟后终止查询。在正常情况下,此查询运行大约 5 分钟,但在工作量大的情况下,此查询运行超过 30 分钟。在这种情况下,客户端可能会遇到两种错误:
• 返回的终止查询
“消息 596,级别 21 无法继续执行,因为会话处于终止状态”
这会导致应用程序导入节点失败,因此是“理想”情况,因为它们不依赖于具有部分输入数据集的工作流。
• 一个与杀死进程相关的场景
“消息 0,级别 20 当前命令发生严重错误”
从 ODBC 的角度来看,这看起来与成功运行相同,因此我们以部分数据集结束 - 这是最危险的情况。
你知道如何避免这种问题吗?