我正在使用 MySQL 和 PhpMyAdmin,我有一个名为的表items- 结构如下;
+------+---------+------+---------+
| name | type | Null | Default |
+------+---------+------+---------+
| id | int(11) | No | None |
+------+---------+------+---------+
| year | int(4) | Yes | Null |
+------+---------+------+---------+
Run Code Online (Sandbox Code Playgroud)
在 PhpMyAdmin 中,我运行以下查询;
UPDATE `item` SET `item_publication_year` = '' WHERE `item_id` = '5'
Run Code Online (Sandbox Code Playgroud)
这将成功执行。
然后我运行这个查询;
SELECT * FROM `item` WHERE `item_id` = '5'
Run Code Online (Sandbox Code Playgroud)
这将成功执行并产生以下结果;
+-----+------+
| id | year |
+-----+------+
| 5 | 0 |
+-----+------+
Run Code Online (Sandbox Code Playgroud)
为什么是这个year领域0——不应该是 …
需要一些帮助来理解UPDATE以下语句之一的缓慢:-
UPDATE TOP (100) xyz
SET xyz.flag = 1
OUTPUT inserted.Rcode, inserted.EDR, inserted.id, abc.EID,abc.CID,abc.ENID,abc.Cdate
FROM dbo.table1 xyz WITH (UPDLOCK, READPAST)
INNER JOIN dbo.table2 abc WITH (NOLOCK)
on xyz.id=abc.id
WHERE xyz.flag = 0
Run Code Online (Sandbox Code Playgroud)
表1有大约。50 万行,表 2 大约有。500 万行
哈希匹配不同流运算符显示黄色警报,消息为:
操作员使用 Tempdb 溢出数据,以溢出级别 4 和 1 个溢出线程执行”
构建残差:
database.dbo.table2.id as abc.id = database.dbo.table2.id as abc.id
我截了屏。不幸的是,由于安全原因,我不能提供更多,甚至不能提供匿名计划。从我的工作站我无法访问互联网,所以我无法让计划浏览器在那里运行。
通常,对于较小的行子集,它在几秒钟内,就像我们刚刚匹配 10K 行或其他东西一样。但是随着数据量的增加,这似乎是一个临界点,应用程序无法承受 1 分钟的运行时间。从 SSMS 我得到 30 秒,但从应用程序我们有平均。约 50 秒 RCSI 处于测试阶段。
我的好计划没有显示 Hash Match Flow Distinct 运算符,如我的屏幕截图所示,而其余计划保持不变。好的一个在 3 秒左右完成。正如所见,该操作员花费了近 16 秒。我们可以通过适当的索引或查询重写来消除它吗? …
sql-server execution-plan update sql-server-2014 query-performance
下面的两个会话尝试更新同一行的场景由 Paul White 提供。
场景一:
- 会话 1
U在读取时获取基表行的锁。- 会话 2 阻塞,等待获取
U基表中的同一行。- 会话 1 将值设置为 10 并提交。
- 会话 2 获取了它的
U锁并且发现没有什么可做的,因为现在 Value != 0。结果:值设置为 10。
根据 Paul 的说法,会话 2 已经找到了需要更新的行,但它被阻止了。当阻塞消失并且会话 2 获得 U 锁时,它需要再次检查条件吗?我理解正确吗?对我来说这有点奇怪。会话找到了这一行,这是因为它评估了导致识别该行的过滤器。为什么在实际更新之前需要再次检查条件?
我正在尝试使用 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 级嵌套”。
我以为我已经确定了这个语法,但是当我尝试执行时,我收到了 Incorrect syntax near ) 的错误。为什么我的语法不正确?
;with CTE As
(
Select max(entryID) As "MaxEntryID"
,userID FROM loghist group by userID
)
Select es.userID As userID, cm.companyName, SUM(COALESCE(eq.TotalValue,0)) As TotalValue
FROM CTE vn
Inner Join loghist es
ON vn.userID=es.userID
AND Coalesce(vn."MaxEntryID",0)=COALESCE(es.entryID,0)
INNER JOIN company cm
ON es.customerid = cm.customerid
Inner Join loghistpart ep
ON ep.loghist = es.loghistid
Inner Join lhq eq
On eq.loghistpartid = ep.loghistpartid
GROUP BY es.userID, cm.companyName
)
UPDATE fvi
Set TotalValue = loghistdTotalValue
FROM FullVarianceInfo fvi
INNER JOIN …Run Code Online (Sandbox Code Playgroud) Postgres 已经有一种方法可以执行“upsert”,但我不喜欢发送这些长查询,我想知道它是否可以实现为一个存储过程,它将接受 json 并执行
INSERT INTO ... (keys)
VALUES (values)
ON CONFLICT DO UPDATE SET (setEverythingFromExcluded)
Run Code Online (Sandbox Code Playgroud)
我知道我可以以某种方式使用json_object_keysandjson_extract_path或直接使用json_each,但我最初的尝试毫无结果,所以也许有人已经这样做了?
我使用的是 SQL Server 2008 及以上版本。
我有以下两个表:
MasterTable
MId
DetailsCount DEFAULT 0
DetailsTable
DId
MId
Run Code Online (Sandbox Code Playgroud)
在 中,我将匹配的MasterTable.DetailsCount记录数存储在 中。DetailsTableMId
首先将记录插入到主表中,然后将给定 MId 的数千条记录插入到详细信息表中。这发生在多个线程上。每个线程都有自己的SqlConnection.
详细信息表中的总记录数为数百万,并且还在不断增加。
在DetailsTable.MId列上添加非聚集索引。无法添加聚集索引。
我尝试过两种维护DetailsCount专栏的方法:
DetailsCount使用查询:UPDATE MasterTable
SET DetailsCount = (SELECT COUNT(*) FROM DetailsTable WHERE MId = ?)
WHERE MId = ?
Run Code Online (Sandbox Code Playgroud)
由于详细信息表中有数百万条记录,这种方法的性能不高,因为每次在其中添加新记录时我都需要扫描详细信息表(以获取计数)。即使使用非聚集索引,它的性能也不佳。如果我们简单地评论该列的更新,我们会看到性能的显着提高。
DetailsCountusing 查询:UPDATE MasterTable
SET DetailsCount = DetailsCount + 1
WHERE MId = ?
Run Code Online (Sandbox Code Playgroud)
这种方式更好,因为我不需要访问详细信息表。
但是,详细信息表中的插入发生在多个线程上。每个线程使用不同的SqlConnection实例。
这就是为什么DetailsCount经常会更新错误的值。
我查看了 …
我试图通过我正在开发的一个 Web 应用程序插入数据,但无法插入数据,在解决问题时,我发现即使直接通过 Microsoft SQL Server Management Studio 也无法编辑日期时间字段。
我正在尝试更新 SQL Server 2014 中的日期时间字段,但我收到了这个奇怪的错误
我试图使第一行与第二行相同,但出现上述错误:
我有完全权限用户,我还可以编辑除日期时间类型列之外的所有其他列!
在这方面的任何帮助将更受欢迎。
这是列定义:
我有 2 列 anint和 a tiny int,我想varchar用值更新另一列 a one column1 + '-' + column2。像这样的伪代码:
UPDATE COLUMN3 varchar = CONCAT (COLUMN1 INT AND + COLUMN2 TINYINT);
Run Code Online (Sandbox Code Playgroud)
我怎样才能用真正的代码做到这一点?