小编Zik*_*ato的帖子

为什么 sys.fn_xe_file_target_read_file 需要对 datetime2 列进行显式转换?

根据文档,返回的列timestamp_utc应为datetime2(7)类型

但是当我这样查询时

SELECT 
    *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE timestamp_utc > dateadd(hour, -1, GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

它不返回任何行。仅当我向datetime2添加显式转换时,它才返回行

SELECT 
    *
FROM sys.fn_xe_file_target_read_file('system_health*.xel', null, null, null)
WHERE cast(timestamp_utc as datetime2(7)) > dateadd(hour, -1, GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)

这与文档中的最后一个示例匹配(即使没有引起注意)

在此输入图像描述

这是为什么?

sql-server extended-events sql-server-2022

11
推荐指数
1
解决办法
472
查看次数

为什么 SQL Optimizer 不使用我的约束?

我想创建一个带有NOT NULLbool 列的表。
我用TINYINTCHECK约束BETWEEN 0 and 1。约束是新的,因此是可信的

现在我希望 SQL 优化器现在知道这个列只能是 0 和 1,所以当我写查询时,col >= 2我会在实际执行计划中看到常量扫描(就像我在检查NULLSELECT TOP (0)

但事实并非如此,它选择了表扫描。我还需要在此列上建立索引吗?

在我下面的测试中,我使用TINYINTCHECK约束。用户定义类型基于TINYINTwith boundRULE和 good old BIT

GO
CREATE TYPE dbo.myBool 
FROM [INT] NOT NULL
GO

CREATE RULE dbo.R_Bool AS @value BETWEEN 0 AND 1
go

EXEC sys.sp_bindrule @rulename = N'R_Bool'
                   , @objname = N'myBool'
GO 


DROP TABLE IF EXISTS dbo.RuleTest
CREATE …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2016

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

查找先前的语句或在阻塞情况下持有锁

我正在使用 XEblocked_process_report 来检测和分析阻塞。
但由于这是一个时间点情况,我只能看到当前正在运行的阻塞领导者的语句以及被阻塞会话试图获取的不兼容锁。

因此,如果阻塞领导者在一个事务中有多个批次/语句,我无法找出之前的哪个语句导致阻塞。

重现脚本

/* Set up tables */
CREATE TABLE dbo.FirstQuery (Id int PRIMARY KEY)
CREATE TABLE dbo.SecondQuery (Id int PRIMARY KEY)

INSERT INTO dbo.FirstQuery (Id)
OUTPUT Inserted.Id INTO dbo.SecondQuery ( Id )
VALUES (1), (2), (3)

/* set up the blocked process event */

EXEC sys.sp_configure
        @configname = 'blocked process threshold (s)' -- varchar(35)
      , @configvalue = 10 -- int
    
RECONFIGURE 

CREATE EVENT SESSION [blocked_process_report] ON SERVER 
ADD EVENT sqlserver.blocked_process_report
(
    ACTION(sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_stack)
)
GO
ALTER EVENT …
Run Code Online (Sandbox Code Playgroud)

monitoring sql-server blocking sql-server-2019

7
推荐指数
0
解决办法
197
查看次数

如何查找计算列中是否引用了列?

我正在尝试批量重新输入列。这意味着首先删除并重新创建它们所属的任何约束。

我发现这些约束引用的列

  • 外键,
  • 主键,
  • 索引,
  • 检查约束,
  • 规则,
  • 默认约束。

但我找不到计算列。

我已经研究过INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE,但它不包括计算列。

还有sys.computed_columnswhich 显示定义,但不以可搜索的方式列出列。

我还有其他地方可以看吗?如果 SQL Server 可以弄清楚依赖关系,我想我也可以。

sql-server t-sql dmv system-tables sql-server-2016

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

无法回收内存中 OLTP 中索引未使用的内存

重现问题的步骤

创建具有内存优化文件组和容器的数据库 使用非集群 pk 创建仅模式内存表 模拟插入和删除活动。我的结果是我有高索引未使用的内存,不会下降。

 USE master
 go
 DROP DATABASE IF EXISTS MemoryOptimizedTest
 CREATE DATABASE MemoryOptimizedTest
 GO
 USE MemoryOptimizedTest
 GO
 ALTER DATABASE MemoryOptimizedTest 
 ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA
 GO 
 
 ALTER DATABASE MemoryOptimizedTest ADD FILE (name='imoltp_mod1', filename='c:\imoltp_mod1') TO FILEGROUP imoltp_mod
 GO
 
 
 DROP TABLE IF EXISTS dbo.MyCache
 CREATE TABLE dbo.MyCache
 (
    PK int NOT NULL, 
    SecondInt int NOT NULL,
    ThirdInt int NOT NULL,
     CONSTRAINT PK_MyCache PRIMARY KEY NONCLUSTERED (PK)
 ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY)
 
 go

/* Generate activity …
Run Code Online (Sandbox Code Playgroud)

sql-server memory memory-optimized-tables sql-server-2019

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

如何检查模型数据库上的查询存储设置?

可以在模型数据库上启用查询存储,并确保每个新数据库都具有与模型数据库相同的设置。

缺少 GUI 选项

GUI 中缺少查询存储选项

但可以使用 TSQL 启用它

ALTER DATABASE model
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);
Run Code Online (Sandbox Code Playgroud)

由于没有 GUI,我无法检查那里的默认设置。

再次使用TSQL

USE model;
select * from sys.database_query_store_options;
Run Code Online (Sandbox Code Playgroud)

返回空结果

模型数据库查询存储设置的结果为空

当我创建一个新数据库(使用模型作为模板并查询设置时,它会显示结果)

create database TestQs;
go
use TestQs;
select * from sys.database_query_store_options;
Run Code Online (Sandbox Code Playgroud)

TestQS 数据库的查询存储选项

此外,设置必须保存在某处,因为当我更改查询存储选项时,更改会传播到新数据库

ALTER DATABASE model
SET QUERY_STORE (INTERVAL_LENGTH_MINUTES = 22);
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 SMO 来找到这些选项,但没有成功。

$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'localhost'
$sqlServer.Databases['TestQs'].QueryStoreOptions
Run Code Online (Sandbox Code Playgroud)

数据库 TestQS 返回选项

但对模型数据库进行相同的查询不会产生任何结果

$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'localhost'
$sqlServer.Databases['model'].QueryStoreOptions
Run Code Online (Sandbox Code Playgroud)

数据库模型返回空选项

有没有一种方法可以检查模型数据库上的查询存储设置,而无需创建新数据库并在那里进行检查?

sql-server smo query-store sql-server-2019

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

在生产环境中选择风险最小的方法是什么?

我的目标是在生产中使用选择而不影响其他任何东西。

当我刚接触 SQL 时,我只是写了简单的选择,但后来我知道这会导致锁定。

如果我不关心脏读,我可以在每个选择上使用 nolocks 或设置事务隔离级别来读取未提交。

但我确实关心脏读,所以我选择了隔离级别快照。隔离级别快照写入 tempdb,我不知道这是否有问题(额外写入数据库意味着更慢的 DB 和更少的空间?)

那么在 DB 上编写选择的最少侵入性方法是什么,我不能减慢它的速度或创建共享锁?我应该回到隔离级别读取未提交的每个查询吗?

这是从开发人员的角度提出的问题。我不知道有关 DB 设置的详细信息,但希望以最少麻烦的方式使用选择。

performance sql-server-2008 sql-server query-performance

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

为什么 UPDATE FROM 失败而 MERGE 在具有 INSTEAD OF 触发器的视图上运行?

有时为了重构,我使用视图来抽象更改并使用INSTEAD OF触发器来模仿以前的功能。

我过去遇到过错误 414(或 415)

不允许 UPDATE,因为该语句更新参与联接并具有 INSTEAD OF UPDATE 触发器的视图“%.*ls”。

我可以将其重写UPDATE FROMMERGE语句并且有效。但为什么?

我找到了这些参考资料,但没有一个能回答原因。

/sf/ask/215952551/

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/87c173b0-8f87-4aa3-b861-d40f23803a43/views-and-instead-of-update-trigger-limitation-why?forum=transactsql

https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/

trigger sql-server merge

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

我可以更改 cdc 架构的所有者吗?

我已使用以下命令在数据库上启用了更改数据捕获 (CDC)exec sys.sp_cdc_enable_db

这将创建一个由cdc用户拥有的新cdc架构

select
    s.*
    , dp.name
from sys.schemas as s
join sys.database_principals as dp
    on dp.principal_id = s.principal_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因为我想利用所有权链接并使用 proc 从此架构中读取数据,所以我可以将所有者更改为dbo吗?

ALTER AUTHORIZATION ON SCHEMA::cdc TO dbo
Run Code Online (Sandbox Code Playgroud)

此命令起作用并更改所有者。但疾病预防控制中心已经启用了一段时间,我担心未来会进一步破坏一些东西。

security change-data-capture owner sql-server-2019 schema-migration

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

如何重新创建具有相同设置的索引?

我想向现有索引添加另一个包含的列,但保持其余设置(例如 FILLFACTOR、ONLINE、SORT_IN_TEMPDB 等)相同。

  • 我在源代码管理中没有以前的版本
  • 我没有在 sys.indexes DMV 中找到它们中的大部分(FILLFACTOR 在那里,但不是 ONLINE)
  • 在对象资源管理器中查找索引并编写它的脚本会填充 ONLINE 设置的默认值(并省略 DATA_COMPRESSION)
  • 我没有在 OBJECTPROPERTY DMF 中找到该属性
  • Brent Ozar 的 sp_BlitzIndex 也不提供其中一些高级设置
  • sp_helpindex 为我提供与 sp_help 在父表上相同的有限信息。
  • 我无法测试 WITH (DROP_EXISTING = ON) 是否使用相同的设置重新创建索引,因为我在任何地方都找不到设置。

有任何想法吗?

index t-sql sql-server-2017

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