根据文档,返回的列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)
这与文档中的最后一个示例匹配(即使没有引起注意)
这是为什么?
我想创建一个带有NOT NULL
bool 列的表。
我用TINYINT
与CHECK
约束BETWEEN 0 and 1
。约束是新的,因此是可信的
现在我希望 SQL 优化器现在知道这个列只能是 0 和 1,所以当我写查询时,col >= 2
我会在实际执行计划中看到常量扫描(就像我在检查NULL
或SELECT TOP (0)
但事实并非如此,它选择了表扫描。我还需要在此列上建立索引吗?
在我下面的测试中,我使用TINYINT
了CHECK
约束。用户定义类型基于TINYINT
with 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) 我正在使用 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) 我正在尝试批量重新输入列。这意味着首先删除并重新创建它们所属的任何约束。
我发现这些约束引用的列
但我找不到计算列。
我已经研究过INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
,但它不包括计算列。
还有sys.computed_columns
which 显示定义,但不以可搜索的方式列出列。
我还有其他地方可以看吗?如果 SQL Server 可以弄清楚依赖关系,我想我也可以。
重现问题的步骤
创建具有内存优化文件组和容器的数据库 使用非集群 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) 可以在模型数据库上启用查询存储,并确保每个新数据库都具有与模型数据库相同的设置。
缺少 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)
此外,设置必须保存在某处,因为当我更改查询存储选项时,更改会传播到新数据库
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)
但对模型数据库进行相同的查询不会产生任何结果
$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'localhost'
$sqlServer.Databases['model'].QueryStoreOptions
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以检查模型数据库上的查询存储设置,而无需创建新数据库并在那里进行检查?
我的目标是在生产中使用选择而不影响其他任何东西。
当我刚接触 SQL 时,我只是写了简单的选择,但后来我知道这会导致锁定。
如果我不关心脏读,我可以在每个选择上使用 nolocks 或设置事务隔离级别来读取未提交。
但我确实关心脏读,所以我选择了隔离级别快照。隔离级别快照写入 tempdb,我不知道这是否有问题(额外写入数据库意味着更慢的 DB 和更少的空间?)
那么在 DB 上编写选择的最少侵入性方法是什么,我不能减慢它的速度或创建共享锁?我应该回到隔离级别读取未提交的每个查询吗?
这是从开发人员的角度提出的问题。我不知道有关 DB 设置的详细信息,但希望以最少麻烦的方式使用选择。
有时为了重构,我使用视图来抽象更改并使用INSTEAD OF
触发器来模仿以前的功能。
我过去遇到过错误 414(或 415)
不允许 UPDATE,因为该语句更新参与联接并具有 INSTEAD OF UPDATE 触发器的视图“%.*ls”。
我可以将其重写UPDATE FROM
为MERGE
语句并且有效。但为什么?
我找到了这些参考资料,但没有一个能回答原因。
https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-from/
我已使用以下命令在数据库上启用了更改数据捕获 (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
我想向现有索引添加另一个包含的列,但保持其余设置(例如 FILLFACTOR、ONLINE、SORT_IN_TEMPDB 等)相同。
有任何想法吗?
sql-server ×7
t-sql ×3
blocking ×1
dmv ×1
index ×1
memory ×1
merge ×1
monitoring ×1
owner ×1
performance ×1
query-store ×1
security ×1
smo ×1
trigger ×1