我注意到一个奇怪的事情。这个查询
declare @t int = 3;
select distinct top(@t)
Number - Number + ABS(CHECKSUM( CAST(NEWID() as binary(16)) ))
from Numbers as n;
Run Code Online (Sandbox Code Playgroud)
制定这个计划
dbo.Numbers 是一个标准的 Numbers 表 - 只是具有聚集主键的连续整数列表 - 包含 100k 行。
有两个计算标量运算符。右边的计算Number - Number并定义一个内部表达式。左边的执行加法和内部函数调用。奇怪的是,如果重写为,则只有一个计算标量运算符
Number + ABS(...) - Number
Run Code Online (Sandbox Code Playgroud)
这里发生了一些“有趣”的事情吗?或者这是解析器如何从备忘录构建执行计划的简单产物?两种形式都在 search(1) 中完成编译。使用 TF8677 强制搜索(2) 不会改变行为。TF8606 显示项目标准化后树中的分离。
我不认为这是一个问题。我只是想知道这里是否有值得学习的东西。
一些背景
我想生成一个固定长度的随机数列表。这
ABS(CHECKSUM(NEWID()))
Run Code Online (Sandbox Code Playgroud)
似乎是要走的路。我有一个 Numbers 表(有 100k 行),因此使用它来驱动输出似乎是合理的。我想要不进行替换的采样,因此 DISTINCT 将确保没有重复项,并且 TOP() 将给出所需的结果集大小。把它放在一起我得到
declare @t int = 3;
select distinct top(@t)
ABS(CHECKSUM(NEWID()))
from Numbers as n;
Run Code Online (Sandbox Code Playgroud)
遗憾的是,该计划是使用哈希匹配(聚合)进行聚集索引扫描。最好只读取所需的最小行数,也许可以使用 Flow Distinct 来强制唯一性。 …
我们将我们的数据库从 SQLServer 2012 迁移到 SQLServer 2019。我们的 ETL 是在 Visual Studio 中构建的,并且是从主包设置的。masterpackage 调用不同的包,这些包未部署在 SSIS 中。其中一个包调用存储过程。此存储过程调用不同的存储过程。在旧服务器上,此 SP 步骤需要 4 个小时。在新服务器上,此步骤需要 7 个小时。我们可以做些什么来加快这个过程?数据库的兼容级别会影响这个过程吗?如果我们在 SSIS 中部署包会有所帮助吗?我们愿意接受任何建议。
我们已经尝试过的事情:
感谢您的帮助。埃斯米
SQL Server 有一个类型标志,称为is_nullable您可以在 上看到它sys.types。目前,(SQL Server 2019)它只设置为FALSE两种类型,sys.timestamp和sys.sysname. 对sys.timestamp这种类型似乎接受null。在sys.sysname它没有。这种行为有什么解释吗?
你可以看到这些类型
SELECT * FROM sys.types WHERE is_nullable = 0;
SELECT TYPEPROPERTY('timestamp', 'AllowsNull'); -- returns 0
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它,
CREATE TABLE foo ( a sys.timestamp );
INSERT INTO foo (a) VALUES ( null );
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用,这将不起作用 sys.sysname
Run Code Online (Sandbox Code Playgroud)Msg 515 Level 16 State 2 Line 1 Cannot insert the value NULL into column 'a', table 'dbo.foo'; column does not allow nulls. INSERT …
我正在查看执行计划并从右到左阅读它。
例子:
1<-2<-3<-4
^
|_5
Run Code Online (Sandbox Code Playgroud)
所以4和5是并行执行的。当两者都完全完成时,则 3 完全执行,然后 2 完全运行,然后 1。
这是正确的还是可能存在以下情况:
3 甚至在 4 和 5 完全完成之前就开始执行。
2 甚至在 3 完全完成之前就开始执行。
我已在 azure blob 存储容器中设置了 SAS 令牌。目前它是有效的,正如 Windows cmd.exe 中的此命令有效的事实所证明的那样:
azcopy list "https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>/path/to/file.BAK?<SAS token>"
Run Code Online (Sandbox Code Playgroud)
并作为输出返回:
INFO: ; Content Length: 7.58 GiB
Run Code Online (Sandbox Code Playgroud)
现在,如果我通过 SSMS 在 SQL Server 中发出以下命令(服务器在发出 azcopy 命令的同一台计算机上本地运行,并且 <> 括号中的值与上面相同。请注意,我末尾没有“/”容器名称,并且令牌中没有“?”,遵循 Microsoft 文档的建议):
CREATE CREDENTIAL [https://<mystorageaccountname>.blob.core.windows.net/<mystorageaccountcontainername>]
-- this name must match the container path, start with https and must not contain a forward slash at the end
WITH IDENTITY='SHARED ACCESS SIGNATURE'
-- this is a mandatory string and should not be changed
, SECRET = '<SAS token>';
GO
RESTORE HEADERONLY FROM …Run Code Online (Sandbox Code Playgroud) 我想知道我的 type 列中有哪些特殊字符(换行符、制表符等)nvarchar。我知道如何选择哪些行包含特定字符。
例如SELECT * FROM your_table WHERE your_column LIKE '%' + CHAR(10) + '%'
但是,我想知道哪些列包含不在其中的字符[a-zA-Z0-9],然后知道哪些列包含其中的字符。我还查看了是否可以在列上进行选择以显示显示所有字符的原始文本(例如类似于 Microsoft Word 的显示所有字符),但我也找不到如何执行此操作。
我正在从使用对象 ID 和属性类型作为聚集索引的属性表迁移一些存储“键值”样式的数据(我也尝试过作为非聚集索引):
\nCREATE TABLE [dbo].[#attrs](\n [DataMigrationEventObjectID] [int] NOT NULL,\n [AttributeType] [varchar](128) NOT NULL,\n [AttributeValue] [varchar](255) NULL\n) \nCREATE CLUSTERED INDEX pk ON #attrs ([DataMigrationEventObjectID],AttributeType);\nRun Code Online (Sandbox Code Playgroud)\n我添加了属性值来选择值,因为数据库中的属性表有很多其他数据,我可以仅为此迁移事件选择它。使用我的测试数据集来填充此表的查询会插入约 3k 行,并且运行时间不到一秒(我的数据集中总共约有 50 个对象,每个对象都有多个属性)。
\n查询中表的连接如下所示,连接聚集索引:
\n INNER JOIN #attrs obj_gvn\n ON obj_gvn.DataMigrationEventObjectID = obj.DataMigrationEventObjectID\n AND obj_gvn.AttributeType = \'GivenName\'\nRun Code Online (Sandbox Code Playgroud)\n通过对该临时表进行 14 个联接,查询将在几秒钟内完成。如果有 15 个连接,查询需要一分钟,如果有 16 个以上连接,则半小时后仍在运行。
\n我已经检查了所有联接是否存在意外条件,这会导致返回太多行,当它在 1 分钟内返回时,它只返回正确的行,所以我不认为存在意外的笛卡尔联接。设置 MAXDOP 值不会影响它,并且查询运行一分钟时返回的查询计划不会标记任何问题。
\n对于 SQL,我错过了什么,导致它在聚集索引上进行大量联接,理论上应该很快,而且记录数量如此之少?
\n我无法获得实际执行计划,因为查询未完成,并且因为它使用临时表,所以我无法获得其估计计划。我尝试将临时表捏造为数据库中的真实表并生成估计计划,但 2 分钟后该计划仍未生成,因此看起来延迟是在“创建计划”方面
\n粘贴查询的缩短版本的计划:brentozar.com/pastetheplan/ ?id=Hy76dd92i
\n我已经更新了数据库的统计数据以防万一,但它仍然没有生成计划。
\n我过去处理过越来越多有问题的连接查询,其中计划编译仍然是即时的。我觉得它在“生成计划”步骤失败这一事实一定意味着什么。
\n不幸的是,更新到最新的 CU 没有帮助。 …
修补被动节点并重新启动后,我们尝试故障转移到该节点。但令人惊讶的是,启动 SQL Server 服务大约需要 10 分钟,该服务挂起在更改挂起状态。在不打补丁的常规情况下,大约需要 10 秒。我从微软文档中得知,停机时间取决于故障转移时间和数据库升级脚本执行的总时间:
这一过程导致整个故障转移集群升级期间的停机时间仅限于一次故障转移时间和数据库升级脚本执行时间。
在我看来,这个停机时间似乎很长,只是在寻找以某种方式减少它的方法。如果您有任何建议,我将非常乐意倾听。
sql-server clustering failover sql-server-2019 failover-cluster-instance
我的应用程序中有列的值始终为 4 位数字,例如“0100”或“1230”。示例之一可能是Merchant Category Code。
暂时,我已经将这个列的类型设置为char (4). 我有很多这种类型的专栏。这些类型的列之一也包含在非聚集UNIQUE索引中。我想为这种类型的专栏建立一种方法。
通过在应用程序中添加或 添加到开头来使用char (4)或可能更好吗?smallint' '0
包含这些列的表已分区,将包含大约 3 亿条记录。UPDATE可能不会在这种类型的列上执行。它们也不会出现在WHERE(有时可能出现在临时报告中)。
我应该选择哪种数据类型?
它就像一个邮政编码,它可以是数字,但你必须存储前导零
确切地。我在考虑在性能方面什么是更好的方法。还必须考虑到,如果我将其存储为smallint,应用程序代码必须将其解析为字符串并添加前导零。
来自文档:确定有效的数据库引擎权限
SQL Server 管理员可以查看有关所有登录名和用户的信息。权限较低的用户通常只能看到有关他们自己身份的信息。
根据上述引用,使用户成为SQL Server 管理员的权限是什么?
sql-server-2019 ×10
sql-server ×9
datatypes ×2
optimization ×2
clustering ×1
failover ×1
metadata ×1
null ×1
performance ×1
permissions ×1
restore ×1