小编Tho*_*anz的帖子

为什么没有分区消除

我有一个包含 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:可以在此处找到执行计划

sql-server partitioning sql-server-2014

6
推荐指数
1
解决办法
1259
查看次数

WHERE 1 = 2 返回一行

任何想法,为什么以下查询中的第一个返回带有 -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)

sql-server t-sql sql-server-2014 sql-server-2016

3
推荐指数
1
解决办法
184
查看次数

列存储:糟糕的执行计划 - 过滤而不是查找

请参阅https://www.brentozar.com/pastetheplan/?id=SyLQIPDtF (SQL 2016 Enterprise)上的执行计划

  • 我有一个数据仓库表peak_reporting_data,它跟踪每天和每小时的活动,每月包含大约 40 亿行,并具有按 date_key 分区的聚集列存储索引(每天一个分区)
  • 在表peak_reporting_monats_peaks中,我聚合了该表并按月峰值对其进行排序/排名。有 3 种类型的活动 (kpi_type),每种类型每月最多有 24 小时 * 31 天 = 744 行,[monats_peak] 排名从 1 到 744。它有一个关于 Month_key、kpi_type、monats_peak 的唯一索引。
  • 对于最活跃的时间(每个 kpi_type),我需要更多详细信息,因此我编写了以下查询/视图:
    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)

sql-server execution-plan columnstore sql-server-2016

3
推荐指数
1
解决办法
604
查看次数

将 COMPRESSION_DELAY 添加到现有的 COLUMNSTORE INDEX

当我创建一个 COLUMNSTORE 索引时,我可以COMPRESSION_DELAY = x [minutes]在 CREATE-Statement 中指定。它延迟了封闭段中的行从增量存储到压缩列存储的移动。这样做的原因:您的导入过程不仅是一个简单的 INSERT,而且还有一些 UPDATE 和 DELETE。

有没有办法在不重新创建整个索引的情况下设置这个值(这在我们的大表上需要很长时间)?

我测试已经REBUILD和重组,但他们都不懂COMPRESSION_DELAY的选项WITH()

sql-server columnstore sql-server-2016

2
推荐指数
1
解决办法
302
查看次数