我有 3 个“大”表,它们连接在一对列上(都是int
s)。
每个表在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)
我尝试过的解决方案:
Key1
,Key2
join sql-server many-to-many sql-server-2016 cardinality-estimates
我正在做一些字符串聚合,并注意到对我来说看起来像一个错误。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)