有没有办法为列存储和列存储列存储归档压缩节省压缩?
为了检查这些压缩保存,我必须删除所有聚集和非聚集索引,然后创建一个聚集列存储索引 - 大多数时候这是一个耗时的操作,我想知道是否有其他方法可以做到这一点。
我修改了构建动态 SQL 语句来创建和填充临时表的过程。语法是这样的:
...'create #temp_' + CAST(GETGUID() AS VARCHAR(36)) ...
Run Code Online (Sandbox Code Playgroud)
我问一位同事是否知道为什么将唯一标识符连接到表名。他告诉我,以前有过跨会话共享临时表的情况,导致数据混乱。
我知道这是不可能的,因为 MSDN 明确指出:
您可以创建本地和全局临时表。本地临时表仅在当前会话中可见,全局临时表对所有会话可见。
现在(记住这个例子)一些同事认为我们应该使用上面的语法作为一个好的实践,但我不喜欢它,需要证明不存在这样的错误,或者如果有的话它已经被修复了。
有 SQL Server 2005/2008 经验的人可以告诉我是否有过这种情况吗?
我最近了解了sp_tableoption,它使您能够为特定表存储“行外大值类型”。
我的一个同事告诉我,如果我启用它,每个字段至少存储在 8 KB 页面上,无论它有多大。我无法找到对此的确认,因此我运行了以下测试:
DROP TABLE Size
CREATE TABLE Size
(
[ID] TINYINT
,[Text] NVARCHAR(MAX)
)
EXEC sp_tableoption 'Size' ,'large value types out of row' ,0
TRUNCATE TABLE Size
INSERT INTO Size
SELECT 1, N'in row text'
UNION ALL
SELECT 2, N'' -- add here very large string
SELECT [ID], DATALENGTH([Text]) Size, LEN([Text]) [Len]
FROM [dbo].[Size]
EXEC sp_spaceused Size;
DROP TABLE Size
CREATE TABLE Size
(
[ID] TINYINT
,[Text] NVARCHAR(MAX)
)
EXEC sp_tableoption 'Size' ,'large value types …Run Code Online (Sandbox Code Playgroud) 在本地,我们在READ_COMMITTED隔离级别下使用 SQL Server 2019 标准版,我想测试一个数据库的执行情况READ_COMMITTED_SNAPSHOT(Azure 默认值)。
查询存储已启用。
我想记录READ_COMMITED一周的一些指标(CPU 使用情况、tempdb 使用情况、IO),然后使用READ_COMMITTED_SNAPSHOT. 然后,如果性能更好(这是我所期望的),则计划如何(如果)扩展资源以激活所有数据库的隔离级别。
我们有记录 CPU 使用情况的工具,但没有记录 tempdb 的工具。我想知道是否有一个查询或实用程序可以用来获取当前 tempdb 使用情况(例如给定时刻的 20-50-70%)并创建此类日志?
我对 tempdb 很感兴趣,因为行版本将存储在那里,并且我担心一些遗留代码和繁重/长时间运行的更新,我可能需要首先重写这些更新才能切换隔离级别。
我正在寻找这些数据,因为有很多遗留代码执行速度很慢并且会阻止其他查询。我有以毫秒为单位执行的新代码,但有时,由于长时间运行的 CRUD 操作和阻塞,它会执行 25 秒以上,这很糟糕。我正在重写此类遗留代码,但有时特定情况会花费我几天的时间,有时甚至几个月。当然,客户不愿意等待......
在 SQL Server 实例之一中,我无法执行任何查询。我认为这是由于负载过重所以我尝试执行sp_execeute whoisactive并得到:
]
昨晚,DBA 已升级到 SQL Server 2022 CU5,并告诉我有一个问题,已通过 CU7 解决。因此,升级到 CU7,但没有任何变化。
DBA 发给我这个:

之后:

但我不确定发生了什么事。DBA 停止了查询存储和所有扩展事件会话,但没有任何变化。现在,DBA 认为问题是由此引起的,但它应该在 CU4 中修复,并且它会在升级过程中(而不是升级后)引起问题。
DBA已向MS开票,但我想知道是否有人知道可能导致此问题的原因是什么?
我将附上跟踪数据。更多信息 - 我们有 SQL Server 2022 CU5 实例和另一个运行 CU7 副本的实例。
另一位 DBA 认为问题出在始终在线的副本上,因此它们被停止 - 副本不断崩溃。
我正在尝试检查添加具有默认值的新列后表大小将如何增加。
我使用以下默认值:NULL, ''(空字符串)和some text(一些随机文本)`但似乎表大小没有改变。
我正在使用以下语句:
EXEC sp_spaceused '[Table_A]';
ALTER TABLE [dbo].[Table_A]
ADD [Loops] NVARCHAR(900)
CONSTRAINT [DF_Loops] DEFAULT('XXX') WITH VALUES;
EXEC sp_spaceused '[Table_A]';
ALTER TABLE [dbo].[Table_A]
DROP CONSTRAINT [DF_Loops]
ALTER TABLE [dbo].[Table_A]
DROP COLUMN [Loops];
Run Code Online (Sandbox Code Playgroud)
但sp_spaceused总是返回:
name rows reserved data index_size unused
------------------------------------------------- -------------------- ------------------ ------------------ ------------------ ------------------
Table_A 73540994 8701688 KB 6658544 KB 2042976 KB 168 KB
Run Code Online (Sandbox Code Playgroud)
谁能告诉我做错了什么?
我有一个具有以下结构的表:
ItemID int
ItemType char(1)
Language char(2)
Localization char(2)
Literal nvarchar(4000)
Run Code Online (Sandbox Code Playgroud)
用于将特定的文本翻译ItemID为Literal一个。该Literal列可能包含HTML标签。对于一组特定的查询,HTML需要删除这些标记,并且因为清理是使用 SQL CLR 对数千行完成的,所以我不想在读取时执行此类操作。
所以,我添加了一个像这样的持久列:
ALTER TABLE [dbo].[table]
ADD [LiteralSanitized] AS NULLIF(CAST(LTRIM(RTRIM([dbo].[fn_Utils_RemoveAllHtmlTags] ([Literal]))) AS NVARCHAR(4000)), '') PERSISTED;
Run Code Online (Sandbox Code Playgroud)
该表只有一个索引(主键),定义如下:
ItemID, ItemType, Language, Localization
Run Code Online (Sandbox Code Playgroud)
所以查询速度更快,但我看到这个表有一些额外的读取:
Scan count - 2 vs 12,230
Logical reads - 3,234 vs 43,472
Run Code Online (Sandbox Code Playgroud)
这可能是正常的,因为现在我因为该列而读取了更多数据。所以,我添加了以下索引:
(ItemID ASC, ItemType ASC, Language ASC, Localization ASC) INCLUDE ([LiteralSanitized])
Run Code Online (Sandbox Code Playgroud)
但它不被引擎使用。所以,我尝试强制引擎使用它:
UPDATE #temp
SET [QuestionText] = PSGQ.[LiteralSanitized]
FROM #temp PQD
INNER JOIN [dbo].[table_with_translations] …Run Code Online (Sandbox Code Playgroud)