文档坚持认为这ISNULL
是一个函数,但COALESCE
事实并非如此。具体来说,他们说
ISNULL 函数和 COALESCE 表达式
如果我戴上 Lisp 帽子,我可以将其视为COALESCE
一个宏,并且一切都有意义。然而,我在 T-SQL 中从来不需要这样的思考。所以,我必须问。在 T-SQL 中:
- 函数的定义是什么?
- 表达式的定义是什么?
- 如何区分函数和表达式?
Microsoft 维护着一份不良 DLL 列表。这是该列表中的一项(强调我的)
UMPPC*.DLL 和 SCRIPTCONTROL*.DLL
如果您为 CrowdStrike 防病毒/端点保护程序启用其他用户模式数据防护设置,这些 DLL 文件将加载到 SQL Server 相关进程的地址空间中。当 SQL Server 代理在执行作业时尝试创建新进程时,您可能会注意到失败。尝试启动 SQL Server Management Studio 时可能会遇到失败。您可能还会看到 SQL Server 无法启动 SQLDumper.exe 来生成内存转储。我们建议您联系 Crowdstrike 支持并提供与您的问题相关的信息,并询问是否有可用的修复程序。
我使用的是 SQL Server 2019 机器,并且有许多 UMPPC*.DLL 和 SCRIPTCONTROL*.DLL 文件。我正在考虑使用 SQL Server 代理来触发一些 SSISDB 包。但是,我不确定如何检查这些 DLL 是否引起问题。这给了我我的问题:当 UMPPC .DLL 和 SCRIPTCONTROL .DLL 触发 SSISDB 包时,SQL Server 代理中会导致出现哪些确切的错误消息?
以下所有内容均引用自此处的datetime
行。我已经打破了引用以对我的理解进行评论。
通过使用两个 4 字节整数来使用整数数据表示。整数值表示以 1900-01-01 为基准日期的天数。
换句话说,我们有八个字节可以使用。datetime
这与已经占用的内容完全相同。
前 2 个字节最多可以代表 2079 年。在此之前,压缩始终可以在此处保存 2 个字节。
换句话说,到 2079 年为止,年份都会丢失两个字节。在那之后,我们会失去更多。这意味着对于 2079 年之前的日期,我们可以使用原始八个字节中的六个。
每个整数值代表 3.33 毫秒。压缩在前五分钟内耗尽了前 2 个字节 [原文如此],并在下午 4 点后需要第四个字节。
换句话说,下午 4 点之后,我们只剩下剩余的 6 个字节中的两个可以使用。
因此,下午 4 点之后压缩只能节省 1 个字节。
这显然是我误解的部分。我之前的算术证明我们还剩两个轮空。然而,微软表示我们只有一个。这是双重令人困惑的,因为如果我们超过了 2079 年,那么微软的数字就会认为我们还剩下负 1 个字节。
当日期时间像任何其他整数一样被压缩时,压缩会在日期中节省 2 个字节。
用户无法控制压缩的工作方式,因此这一行完全无关。
从上面的内容可以看出,我的理解存在很大的误区。我错过了什么?
压缩不会影响备份和恢复。
但这怎么可能呢?当然,如果我的表较小(由于压缩),那么这应该会对备份/恢复产生一些影响?如果我的表较小,那么加载速度应该更快。如果我的表需要一些解压,那么这应该会花费更长的时间。不管怎样,我就是不敢相信数据压缩对备份和恢复完全没有任何作用。
我缺少什么?
我有一张桌子,我相信它的大小大部分归功于一根巨大的NVARCHAR(max)
柱子。我不知道如何测试它的大部分大小来自哪里。无论如何,这样的表会受益于行压缩吗?或者NVARCHAR(max)
已经以可变长度的方式保证行压缩不执行任何操作?
有几个函数是专门为命中全文索引而设计的。我认为以下是完整的列表:
CONTAINS
CONTAINSTABLE
FREETEXT
FREETEXTTABLE
是否可以在不使用这些函数之一的情况下访问全文索引?是否达到索引可以通过粘贴你的执行计划来证明。
假设我已经打开 RCSI 并且我的服务器运行良好;资源使用量没有出现峰值,tempdb 上增加的负载也很小。这一切都很好,但我如何判断更改是否导致了我的用户问题?例如,为了查找由 RSCI 引起但读提交不会引起的问题,是否存在以下问题:
我很高兴使用 RCSI,但这个问题的目的是找到可行的方法来跟踪事后打开它的影响。
假设我在同一台服务器上有两个数据库,RCSI_Yes
并且RSCI_No
. 首先,启用 RCSI。在第二个例子中,事实并非如此。当我编写同时访问两个数据库的查询时,SQL Server 如何决定应使用哪种事务隔离级别?我从哪个数据库运行查询重要吗?
假设您有一个大量使用表变量的多语句表值函数。有哪些方法可以优化它们?我只知道以下这些,但它们都令我失望。
OPTION(RECOMPILE)
,希望有最好的结果。这将为您提供更好的基数估计,但这些都不是灵丹妙药。假设 SQL Server 2019,因为我认为这是该问题中提到的任何内容的性能最后一次改进。
我一直错误地SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Stolen Server Memory%';
认为操作系统从 SQL Server 窃取了多少内存。根据文档,事实是
指定服务器用于数据库页面以外的目的的内存量。
我认为它的意思是“SQL Server(即不是操作系统)用于除缓冲池之外的任何内容的内存量”。
考虑到这一点,检查sys.dm_os_performance_counters
我是否已经在检查还有什么意义吗SELECT * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
?鉴于缓冲池始终位于该列表的顶部(如果不是,您的服务器就注定失败),确定它没有使用多少内存应该是一个简单的算术问题。
我怀疑我的想法是错误的,因为这两个数字在我的服务器上不匹配。然而,我不知道如何找出原因。
-- Total stolen memory.
SELECT top (1) cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE 'Stolen Server Memory%'
ORDER BY cntr_value desc;
-- Total memory not in buffer pool.
-- Should be the same as the above but is always less on my machine.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE [Type] <> 'MEMORYCLERK_SQLBUFFERPOOL';
我已经学会了一些诊断 SQL Server 上 RAM 不足的好方法,我想知道是否应该将计划缓存添加到这个工具箱中。
RAM 不足的一个迹象是计划缓存的寿命不长。您可以轻松地在其中找到最旧的缓存计划sys.dm_exec_query_stats
,并且可以从中找到计划缓存使用了多少 RAM SELECT * FROM sys.dm_os_memory_clerks WHERE TYPE = 'CACHESTORE_SQLCP'
。其中任何一个都可以转化为有关缺乏 RAM 的系统的可操作信息吗?
我怀疑这两种观点都没有提供有用的指标。如果我的服务器内存的 2% 或 20% 被计划缓存占用了,那又怎样?同样,如果我最旧的缓存计划是一个月前的,那又怎样?据我所知,这可能只是一个非常常用的计划。
今天早些时候,我意识到我犯了一个非常愚蠢的错误。我没有编写视图,而是编写了无参数内联表值函数。这让我思考:除了界面之外,两者之间有什么区别吗?据我所知,它们在逻辑上是相同的并且执行相同。
那么,换句话来说,视图提供了哪些无参数内联表值函数所没有的功能呢?我想到的都是索引视图,但我从未见过有人真正使用它们。
通过查询存储,我可以跟踪物理读取的大小以及发生的频率。我如何判断这些数字是否太大以至于表明我需要更多 RAM?
为此,我的其他研究表明我没有 RAM 问题:
sys.dm_exec_query_stats
大约一个月前。我非常喜欢 dbatools,所以我在我的生产 SQL Server 2019 服务器上进行了尝试Get-DbaDbMemoryUsage
(此处的文档)。具体来说,我运行了这个
Get-DbaDbMemoryUsage -SqlInstance [MyProdServer] -IncludeSystemDbs |
Select Database, PageType, PercentUsed |
Where PercentUsed -ne 0 |
Format-Table
该命令的目的是显示每个数据库中的页面类型使用了服务器 RAM 的百分比。
等了几分钟后,我再次运行它。只有一个数据库返回相同的结果。其余的要么返回完全不同的数字,要么从结果集中消失。
鉴于此结果,通过监视每个数据库级别的 RAM 使用情况可以获得什么好处吗?或者是太吵了没用?
注意:如果这暗示我的服务器内存太少,请告诉我。
我非常喜欢 dbatools,所以我在我的测试 SQL Server 2019 服务器上进行了尝试Get-DbaDbMemoryUsage
(此处的文档)。具体来说,我运行了这个
Get-DbaDbMemoryUsage -SqlInstance [MyServer] -IncludeSystemDbs |
Select Database, PageType, PercentUsed |
Where PercentUsed -ne 0 |
Format-Table
该命令的目的是显示每个数据库中的页面类型使用了服务器 RAM 的百分比。
当我阅读结果时,我惊讶地发现我的服务器上 76% 的 RAM 使用量是 tempdb 中的 TEXT_MIX_PAGE。这说明什么?无论如何,在我运行此命令时,服务器非常安静。
我知道查询存储可以显示 SQL Server 2017 中的 tempdb 使用情况,但是它可以显示 tempdb 的溢出吗?我非常有信心计划缓存可以。
我认为查询存储是微软的SQL Server在过去十年中最好的想法。我担心当我转到 Postgres 时我会非常想念它。Postgres 与 SQL Server 的查询存储有什么等价物?
数据收集器是我所知道的最晦涩的 SQL Server 概念。我什至从未见过它在专业或教育背景下被提及,更不用说使用了。我什至不认为它在这个网站上有标签,尽管我已经做出了最好的猜测。然而,它在 dbatools 中的支持有力地表明它一定具有一定的价值。
我以开放的心态阅读了数据收集器的文档,但我根本无法理解它的用例。支持的(即 2012+)版本的 SQL Server 中有哪些典型用例?
在我的 SQL Server 2019 计算机上,我有一个在支持的最低兼容性级别上运行的数据库(我相信这相当于 SQL Server 2008)。我想把它调到最高。我需要先检查是否有已弃用的功能?
这感觉应该是重复的,但我没有找到任何提及这两个主题的内容。
如果我想知道现在发生了什么,那么我会使用 Adam Machanic 的sp_whoisactive
。如果我想了解我的服务器最近发生了什么,那么我将使用查询存储。
扩展事件旨在取代 Profiler,但我认为查询存储的组合sp_whoisactive
已经在 2016 或更高版本的任何 SQL Server 上做到了这一点。考虑到这一点,我什么时候会使用扩展事件?
为了获得灵感,我检查了dbatools 附带的扩展事件。我没有留下深刻的印象。它们似乎只对长期监控查询存储不存储的内容有用。例如:某些登录正在执行的操作、锁定、极其特定的 IO 类型、存储过程参数的使用以及已弃用的功能的使用。这些都很好,但坦率地说,我无法想象自己必须在服务器上进行如此外科手术式的调整。有没有我遗漏的常见用法?