小编Ste*_*ble的帖子

如何在 SQL Server 中提示多对多连接?

我有 3 个“大”表,它们连接在一对列上(都是ints)。

  • 表 1 有大约 2 亿行
  • 表 2 有大约 150 万行
  • 表 3 有约 600 万行

每个表在Key1、上都有一个聚集索引Key2,然后还有一个列。Key1具有低基数并且非常偏斜。它总是在WHERE子句中被引用。条款中Key2从未提及WHERE。每个连接都是多对多的。

问题在于基数估计。每个连接的输出估计变而不是变大。当实际结果达到数百万时,这导致最终估计值低至数百。

我有什么办法可以让 CE 做出更好的估计吗?

SELECT 1
FROM Table1 t1
     JOIN Table2 t2
       ON t1.Key1 = t2.Key1
          AND t1.Key2 = t2.Key2
     JOIN Table3 t3
       ON t1.Key1 = t3.Key1
          AND t1.Key2 = t3.Key2
WHERE t1.Key1 = 1;
Run Code Online (Sandbox Code Playgroud)

我尝试过的解决方案:

  • 在 上创建多列统计信息Key1Key2
  • 创建大量 …

join sql-server many-to-many sql-server-2016 cardinality-estimates

9
推荐指数
1
解决办法
1381
查看次数

STRING_AGG 可以多次使用不同的分隔符吗?

我正在做一些字符串聚合,并注意到对我来说看起来像一个错误。STRING_AGG在具有不同分隔符参数的同一查询中使用了两次。但是,两者都产生了相同的结果(在两种情况下都使用“第一个”分隔符)。它似乎只在某些情况下发生。这是错误还是记录在案的行为?

首先,设置:

CREATE TABLE #Data
  ([Group] INT
 , Member  CHAR(1));

INSERT INTO #Data
VALUES (1, 'a'), (1, 'b')
     , (2, 'c'), (2, 'd');
Run Code Online (Sandbox Code Playgroud)

从表与VALUES构造函数。没有WITHIN GROUP ORDER BY,一切都很好。有了它,bug就出现了

SELECT Commas = STRING_AGG(Member, ', ') --WITHIN GROUP(ORDER BY Member)
     , Colons = STRING_AGG(Member, '::') --WITHIN GROUP(ORDER BY Member)
FROM #Data;

SELECT Commas = STRING_AGG(Member, ', ') --WITHIN GROUP(ORDER BY Member)
     , Colons = STRING_AGG(Member, '::') --WITHIN GROUP(ORDER BY Member)
FROM (VALUES (1, 'a'), (1, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2017

9
推荐指数
1
解决办法
1399
查看次数