DISTINCT
在下面的例子中添加对查询运行时间有什么影响吗?
有时将其用作提示是否明智?
SELECT *
FROM A
WHERE A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B)
Run Code Online (Sandbox Code Playgroud) 我试图将数据合并到的目标表有 ~660 列。合并代码:
MERGE TBL_BM_HSD_SUBJECT_AN_1 AS targetTable
USING
(
SELECT *
FROM TBL_BM_HSD_SUBJECT_AN_1_STAGING
WHERE [ibi_bulk_id] in (20150520141627106) and id in(101659113)
) AS sourceTable
ON (...)
WHEN MATCHED AND ((targetTable.[sampletime] <= sourceTable.[sampletime]))
THEN UPDATE SET ...
WHEN NOT MATCHED
THEN INSERT (...)
VALUES (...)
Run Code Online (Sandbox Code Playgroud)
我第一次运行这个(即当表为空时)它导致成功,并插入了一行。
我第二次使用相同的数据集运行此程序时,返回错误:
无法创建大小为 8410 的行,该行大于允许的最大行大小 8060。
为什么我第二次尝试合并已经插入的同一行会导致错误。如果该行超过了最大行大小,则预计它不可能首先插入它。
所以我尝试了两件事,(成功了!):
为什么使用合并更新不成功,而插入可以,直接更新也可以?
更新:
设法找到实际的行大小 - 4978。我创建了一个只有这一行的新表,并通过这种方式找到行大小:
而且我仍然没有看到超出允许限制的东西。
更新(2):
努力使这种复制不需要任何额外的辅助对象,并且数据将(有点)混淆。
在 2012 版和 2008 版的几台服务器上尝试了这一点,并且能够在所有服务器中完全重现。
我正在尝试将一行大小为 5k 的目标表更新为一行大小为 5k 的目标表。
由于它是一行,因此很容易知道行的实际大小:
select *
from sys.dm_db_index_physical_stats(DB_ID('RODS_HSD_ES'),
OBJECT_ID(N'TBL_BM_HSD_SUBJECT_AN_148_REPRO'), NULL, NULL, 'DETAILED')
Run Code Online (Sandbox Code Playgroud)
表自创建以来没有改变。没有看到它应该失败的任何原因。想法?