假设我有两张表,一张名为ParentTable,另一张名为ChildTable,具有一对多关系,其中一个父项可能有多个子项。
我正在创建一个AFTER DELETE触发器ChildTable。在该触发器中,我正在检查一个值ParentTable(如果存在),如下所示:
-- ...
FROM deleted d
JOIN ParentTable pt ON d.FK_Parent = pt.ID
WHERE pt.Foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
如果我先从 删除ChildTable,然后从 删除ParentTable,AFTER DELETE触发器是在删除行之前还是之后ParentTable触发?
A。这两个DELETE语句通常位于显式事务中,因为我使用的是实体框架。
如果我将外键设置为ChildTable,CASCADE DELETE然后从ParentTableonly 中删除,当触发器触发时,中的行ParentTable仍然可以访问吗AFTER DELETE?
我有一张表格,如下所示:
create table z_test_duration
( Days date,
Status char(8)
);
Run Code Online (Sandbox Code Playgroud)
样本数据如下:
| 天 | 地位 |
|---|---|
| 2022 年 1 月 1 日 | 在 |
| 2022 年 1 月 2 日 | 在 |
| 2022 年 1 月 3 日 | 在 |
| 2022 年 1 月 4 日 | 离开 |
| 2022 年 1 月 5 日 | 在 |
| 2022 年 1 月 6 日 | 离开 |
| 2022 年 1 月 7 日 | 在 |
| 2022 年 1 月 8 日 | 在 |
| 2022 年 1 月 9 日 | 离开 |
想要的结果是这样的
| 时间到了 | OFF_DATE | COUNT_OF_ACTIVE_DAYS … |
|---|
我正在尝试使用 CASE 语句更新 SQL Server 2016 中的列,因为我必须根据不同的条件更改值。问题是我有超过 10 个条件,而且 SQL Server 似乎最多只允许 10 个条件级别。那么我该怎么做呢?这是我试图做的:
UPDATE my_table
SET my_column = CASE
WHEN condition1 THEN expression1
WHEN condition2 THEN expression2 ...
Run Code Online (Sandbox Code Playgroud)
它不是链接服务器,我还没有尝试在CASE表达式中放入 11 个条件。如果您查看文档,您会发现“SQL Server 仅允许在CASE表达式中进行 10 级嵌套”。
我有一个带有字符串字段 ID 的表,其值如下所示:
012345678
Run Code Online (Sandbox Code Playgroud)
我想从 ID 字段中选择所有以 0 开头并包含一个字母的记录,例如000A345Bor 0A32C450。我还想选择以零开头并包含-,/ 或空格的记录。
请注意,记录应以 0 开头。
我该如何解决?
我们有一张包含约 600 万种产品的表:
| ID | 姓名 | 代码 |
|---|---|---|
| 1 | 一 | 123.456.789-M |
| 2 | 二 | 852.789456 |
| 3 | 三 | 1-123654.P |
按代码列过滤产品而没有掩码(痕迹、斜线或点)的好方法(关于性能)是什么?
例子:
SELECT id, name FROM products WHERE code = '123456789M' OR code = '1123654P';
Run Code Online (Sandbox Code Playgroud) 从分区表中获取有序数据的最有效方法是什么?
我有这样的疑问:
SELECT TOP (4000)
*
FROM dbo.MS
ORDER BY MANDT
, MBLNR
, MJAHR
, ZEILE
Run Code Online (Sandbox Code Playgroud)
表按 MBLNR 分区。
执行计划:https://www.brentozar.com/pastetheplan/? id=Bkhv5g5EF
是否有任何选项可以从执行计划中删除排序?
建表语句:
CREATE TABLE [dbo].[MS]
(
[MANDT] [NVARCHAR](3) NOT NULL
, [MBLNR] [NVARCHAR](10) NOT NULL
, [MJAHR] [NVARCHAR](4) NOT NULL
, [ZEILE] [NVARCHAR](4) NOT NULL
, [LINE_ID] [NVARCHAR](6) NOT NULL
, [PARENT_ID] [NVARCHAR](6) NOT NULL
, [LINE_DEPTH] [NVARCHAR](2) NOT NULL
, [MAA_URZEI] [NVARCHAR](4) NOT NULL
, [BWART] [NVARCHAR](3) NOT NULL
, [XAUTO] [NVARCHAR](1) NOT NULL
, [MATNR] …Run Code Online (Sandbox Code Playgroud) 我很确定我明白这一点,但我想确定我明白。我们有一个 SQL Server 2016,它运行着 2 个 NumaNode,每个 NumaNode 有 8 个 vCPU。最大并行度 (MAXDOP) 设置为 8。
这对我来说听起来不对。第一个问题:这是一个像我认为的那样糟糕的想法吗?
根据我的研究,我需要告诉他们减少 VM 设置以使其在单个 NUMANode 中运行。我们似乎遇到了一些随机时期,其中运行时间为 170 毫秒的查询现在超时时间为 30 秒以上!因此,我们快速查看了一下,CPU 使用率为 5%,磁盘 I/O 使用率较低,网络使用率合理......基本上,机器处于空闲状态。我们还查找了等待锁的查询,并且没有。我们正在 AG 组中的辅助节点上运行查询(只读查询)
所以,我的猜测是:它已经获得了足够的负载,可以在第二个 NUMANode 中的一个 vCPU 上切换并运行一个有问题的视图(每天运行大约 4,000 次),然后决定执行计划应该始终运行在那个节点。结果是它正在访问的所有数据都缓存在另一个节点的内存中,并且它需要通过节点间链接(远程内存)来获取它,所以它这样做了,但最终速度慢了很多(170次?),并且查询现在都在这个远程链接上运行越来越多的查询......直到它总是超时,因为远程内存已饱和......
这样的分析有效吗?我不想将其作为解决方案来提交,以解释为什么如果这完全不正确,查询会突然及时跳转。而且很难让他们相信 8 个 CPU 会比 16 个 CPU 获得更好的性能。
哦,还有更多证据来支持我的说法:如果我select * into #tmp from myView OPTION (MAXDOP 16)这样做,我的性能变化约为 -5% 到 -12% - 这意味着运行查询所需的时间比我只使用 8 个 vCPU 时要长。然而,情况并非如此。
所以我的问题是:我的分析是否有效?
更新:还有其他一些事情,我从以下位置获得了很多信息:https://codenotary-compliance.medium.com/vmware-vsphere-why-checking-numa-configuration-is-so-important-9764c16a7e73
其次,如果我执行select * from sys.[dm_os_nodes] then 我得到foreign_commited_KB为5,414,260或5 GB,从上面的信息来看,这听起来像是从另一个节点提交的(这很糟糕?)
我有一个过程,它在数百个数据库中动态运行查询,这些数据库都具有相同的确切架构,并将结果聚合到临时表中。该查询仅涉及 3 个表(每个表都在数百万行的 10 到 100 之间,但我总共只提取了大约 50,000 行数据)。
在查看查询的汇总 IO 统计信息(通过 StatisticsParser.com - 大声喊出 Richie Rump)时,它显示创建了一个工作表,并且该工作表上有大约 550,000 个 LOB 逻辑读取。查询中所有表的常规逻辑读取总数略低于大约 400,000 次逻辑读取。
查询中的实际表都没有使用任何 LOB 数据类型,那么这到底意味着什么,它是否是我查询中瓶颈的潜在来源?
(顺便说一句,我拉回的 50,000 行数据仅相当于大约 3 MB 的数据,但我的查询在第一次运行时需要大约 10 秒才能运行(例如,当表的数据页仍在加载到内存中时) ),然后在后续运行中不到一半的时间,因此尝试查看我是否可以始终接近 <= 4s 基准测试,以及这些 LOB 逻辑读取是否与之相关。)
更新:这是一个类似的示例查询(再次查看它,我可能会发现 LOB 逻辑读取的来源)。
过程签名: sp_StoredProc_ToGetData (@IdsTable TVP (Id INT), @StartDate DateTime, @EndDate DateTime)
sp_StoredProc_ToGetData 内部的查询:
SELECT Id
INTO #IdsTableTemp
FROM @IdsTable;
-- This query is ran using dynamic SQL but for the example simplicity this is just the root …Run Code Online (Sandbox Code Playgroud) sql-server statistics dynamic-sql sql-server-2016 performance-tuning
我有几个关于分区的问题。我打算将现有的分区方案/函数放入table1,然后将新的分区方案/函数指向table1. 我知道如何继续这个过程,但在此之前,我想对以下问题提出一些建议/答案:
如果我删除旧的/现有的分区方案/功能以及表中的数据,旧partition.ndf文件中的数据会发生什么?它们会被删除或修改吗?
如果我删除旧的/现有的分区方案/功能,表中有数据,表中的数据会发生什么?会不会有记录丢失?
所以是时候升级服务器了。我是这家公司的新员工,我们拥有 2008 年到 2014 年的 SQL Server。我真的认为将它们全部升级到 2014 年没有问题,因为它确实有很好的文档记录并且为社区所熟知。它的支持将于 2024 年 7 月 9 日结束,对吗?直接升级到 SQL Server 2016 的原因是什么?
我可以找到很多比较它们的网站,但这些都不是我们现在使用的功能。
我想直接升级到 2016 年,因为它的支持于 2026 年 7 月 14 日结束,但恐怕自 2008/2012 年以来它的查询有很多变化(例如已删除不推荐使用的功能)。
SQL Server 升级顾问是用于进行此类测试的可靠工具吗?
我过去曾将我们的环境(不同公司)从 SQL SERVER 2005/2008 升级到 2014,没有出现任何问题。
并且由于我们的数据库很少(就像每个服务器中不到 10 个),备份/恢复然后到新环境中更安全,对吗?我没有信心进行就地升级。
据我所知,我们不能将数据库直接从 SQL Server 2008 (100) 迁移到 sql server 2016,对吗?
在我的搜索引擎上,我看到了多个结果来获得一个月的第一天,但我想做一些稍微不同的事情。在 SQL 2016 中,我想检查今天GetDate()是否是该月的第一天。
我该怎么做?
sql-server-2016 ×12
sql-server ×9
partitioning ×2
case ×1
delete ×1
dynamic-sql ×1
migration ×1
numa ×1
order-by ×1
ssms ×1
statistics ×1
t-sql ×1
trigger ×1
update ×1
upgrade ×1
vmware ×1