【发布时间】:2020-11-05 22:37:38
【问题描述】:
我遇到的情况是执行计划中的估计行数有偏差
我在联接中的列是varchar(50)。我尝试了不同的索引,但它并没有减少这个问题。我什至尝试过使用临时表上的索引。我还能做什么?
PS 这是估计数字开始漂移的第一个地方......而且表格并不大(48000 行)。
代码是:
SELECT DISTINCT householdnumber, householdid, primaryCustomerID
INTO #Households
FROM TableA
SELECT
A.*,
MIN(B.[ProfileCreatedDate]) PROFILECREATEDDATE
INTO #Profile
from #Households AS a
LEFT JOIN TableA AS B
ON A.[HouseholdNumber]= B.[HouseholdNumber] and A.[HouseholdId]=B.[HouseholdId]
GROUP BY a.householdnumber, a.householdid, a.primaryCustomerID;
我知道这似乎可以重写为:
SELECT householdnumber, householdid, primaryCustomerID, MIN([ProfileCreatedDate]) AS PROFILECREATEDDATE
INTO #Profile2
from TableA
GROUP BY householdnumber, householdid, primaryCustomerID;
但结果并不相同,我不想更改结果,因为我不确定这段代码的创建者是否知道他们在做什么。
关于列的一些统计信息:
householdnumber 始终等于 householdid。 householdid 是 nvarchar(50) 但 householdnumber 是 varchar(40)。该表有 48877 行。 householdnumber, householdid, primaryCustomerID 的不同组合有 48029 行。 primaryCustomerID 的不同数量是 47152。
【问题讨论】:
-
如果不了解正在发生的一切,我不确定这是否有用,但是:您知道您可以将
UPDATE STATISTICS #Households作为脚本的一部分运行吗?或者,可能更好的是,将OPTION (RECOMPILE)添加到您的查询中(在GROUP BY行之后)。 -
@EdmCoff:谢谢,我会试试
UPDATE STATISTICS。实际上我曾尝试重新编译,但这也无济于事。我让你知道它是否有效。但是表是刚刚创建的?我必须阅读有关统计数据的更多信息... -
@EdmCoff:更新统计数据没有帮助......
-
请参阅paste the plan,了解在您的问题中包含执行计划的方法。
-
@HABO:我很愿意,但我有点偏执地发布敏感内容......
标签: sql sql-server tsql query-performance