索引在批量插入时不同步
Index gets out of sync on bulk insert
我的 SQL 服务器数据库有一个奇怪的问题。
我正在使用 SqlBulkCopy.WriteToServer
写入批量数据(大约 90,000 行),并且我还在使用 EF 的 AddRange
.
以 1,000 批为一组写入大约 30,000 行
这会导致这些表上的索引不同步,并且查询花费的时间比平时长很多(10 分钟后超时,而不是几秒后得到结果)。
在我手动重建索引后,查询再次变快,直到发生另一个导入。
我对bulk loading的理解是它也应该更新索引。
我的问题是:这种行为是否有众所周知的原因?如果没有,我该如何解决这个问题?
几年前我们遇到过完全相同的问题。正如 dfundako 所建议的那样,答案是过时的统计数据。
如果更改了一定百分比的记录,SQLServer 默认会更新统计信息。如果您的 table 有大量记录,这是一个问题,因此添加的 90000 条记录不会达到所需的更改行数百分比。
因此,如果您想确定,插入后您可以重新索引 table(就像您所做的那样)或更新 table
的统计信息
update statistics <your table>
根据此处的评论和答案,我试图弄清楚是否可以通过某种方式更改 20% 的阈值。
事实上,有一种方法可以做到这一点,使用 trace flag 2371
您可以这样启用它:
DBCC TRACEON(2371, -1)
现在我将等待几周以确保这能解决问题,但我对此抱有良好的希望。
我的 SQL 服务器数据库有一个奇怪的问题。
我正在使用 SqlBulkCopy.WriteToServer
写入批量数据(大约 90,000 行),并且我还在使用 EF 的 AddRange
.
这会导致这些表上的索引不同步,并且查询花费的时间比平时长很多(10 分钟后超时,而不是几秒后得到结果)。
在我手动重建索引后,查询再次变快,直到发生另一个导入。
我对bulk loading的理解是它也应该更新索引。 我的问题是:这种行为是否有众所周知的原因?如果没有,我该如何解决这个问题?
几年前我们遇到过完全相同的问题。正如 dfundako 所建议的那样,答案是过时的统计数据。 如果更改了一定百分比的记录,SQLServer 默认会更新统计信息。如果您的 table 有大量记录,这是一个问题,因此添加的 90000 条记录不会达到所需的更改行数百分比。 因此,如果您想确定,插入后您可以重新索引 table(就像您所做的那样)或更新 table
的统计信息update statistics <your table>
根据此处的评论和答案,我试图弄清楚是否可以通过某种方式更改 20% 的阈值。
事实上,有一种方法可以做到这一点,使用 trace flag 2371
您可以这样启用它:
DBCC TRACEON(2371, -1)
现在我将等待几周以确保这能解决问题,但我对此抱有良好的希望。