我有一个包含 3 行的临时表 #termin
当我执行以下查询时
SELECT t.termin, ttw.tourid, twt.va_nummer_int
FROM #term AS t
INNER JOIN plinfo.t_touren_werbeflaechentermine AS ttw
ON ttw.termin = t.termin
INNER JOIN wtv.t_werbeflaechentermine AS twt
ON twt.jahr = t.jahr
AND twt.termin = t.termin
AND twt.ID_Wt = ttw.id_wt
GROUP BY t.termin, ttw.tourid, twt.va_nummer_int
Run Code Online (Sandbox Code Playgroud)
每个表都使用匹配的索引进行连接。两个表都由 ps_termin(termin) 进行分区。
对于第一个表 (t_touren_werbeflaechentermine),它执行分区消除并仅读取行的一个子集,而对于第二个表 (t_werbeflaechentermine),它扫描整个索引 ( jahr, termin, id_wt include (va_nummer_int)
)。
所以我的问题是:为什么它是索引扫描(而不是搜索),为什么它不消除第二个表的分区。
PS:在WITH (FORCESEEK)
第二个表上使用时,它会在执行计划中切换两个表并对第一个表进行全索引扫描......
PPS:可以在此处找到执行计划
任何想法,为什么以下查询中的第一个返回带有 -1,NULL 的行,尽管它有一个WHERE 1=2
?
只有当我将查询放入另一个子查询时,它才能正常工作(并返回一个空的结果集)。
在 Microsoft SQL Server 2014 和 2016 上测试
DECLARE @i INT = 1
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
WHERE 1 = 2
SELECT s1.i, s1.mid
FROM (
SELECT @i i, MAX(sub.id) mid
FROM (SELECT TOP(@i) x.id
FROM (VALUES(1), (2), (3), (4)) x(id)
WHERE x.id > 2 + @i
ORDER BY x.id) sub
) …
Run Code Online (Sandbox Code Playgroud) 请参阅https://www.brentozar.com/pastetheplan/?id=SyLQIPDtF (SQL 2016 Enterprise)上的执行计划
SELECT prmp.month_key
, prd.*
FROM mba.peak_reporting_monats_peaks AS prmp
LEFT LOOP JOIN (SELECT prd.date_key
, prd.hour
, prd.kpi_type
, prd.is_dr_brand
, prd.type_id_usage
, prd.product_identifier
, SUM(prd.kb) / 1024.0 / 1024.0 AS gb
, SUM(CAST(prd.sek AS BIGINT)) AS sek
, SUM(prd.anzahl) AS anzahl
, SUM(prd.kb) / 439453125.0 AS gbits
FROM db1.mba.peak_reporting_data AS prd …
Run Code Online (Sandbox Code Playgroud) 当我创建一个 COLUMNSTORE 索引时,我可以COMPRESSION_DELAY = x [minutes]
在 CREATE-Statement 中指定。它延迟了封闭段中的行从增量存储到压缩列存储的移动。这样做的原因:您的导入过程不仅是一个简单的 INSERT,而且还有一些 UPDATE 和 DELETE。
有没有办法在不重新创建整个索引的情况下设置这个值(这在我们的大表上需要很长时间)?
我测试已经REBUILD和重组,但他们都不懂COMPRESSION_DELAY
的选项WITH()
。