在我们的数据库中,大约有1000个表引用表:FAMILIES。当我们尝试从FAMILIES删除记录时,我们看到以下错误:
8621消息,第17级,状态1,第81行 查询优化期间查询处理器的堆栈空间不足。请简化查询。
我注意到,如果一个表有超过918个引用该表的外部约束,我们可以重现此问题。下面是重现该错误的代码。
以下代码: 创建表FAMILIES 插入样本记录 创建引用FAMILIES的表(@tbl_count是要创建的表数) 从FAMILIES删除记录
如果我们将@tbl_count的值更改为918或更小,则代码可以正常工作。
此问题在SQL Server 2012和2014中可重现,但在2016年运行良好。 我正在使用Windows10。
BEGIN TRANSACTION
CREATE TABLE families (fmly_key BIGINT, PRIMARY KEY (fmly_key))
INSERT INTO families VALUES (10)
DECLARE @v_count BIGINT = 0, @sql_stmt NVARCHAR(MAX), @tbl_count BIGINT = 919
WHILE @v_count < @tbl_count
BEGIN
SET @v_count = @v_count + 1
SET @sql_stmt = 'CREATE TABLE TABLE'+cast(@v_count as nvarchar(max))+' (COL1 BIGINT, FOREIGN KEY (COL1) REFERENCES FAMILIES (FMLY_KEY))'
exec sp_executesql @sql_stmt
END
DELETE FROM families WHERE fmly_key = 10
ROLLBACK TRANSACTION
答案 0 :(得分:4)
在SQL 2016中增加了受支持的限制。请参见
可以计算的FOREIGN KEY约束的实际数量 使用的硬件受到硬件配置和设计的限制 数据库和应用程序。我们建议一个表不再包含 超过253个FOREIGN KEY约束,并且不再引用 超过253个外键约束。
SQL Server 2016(13.x)增加了其他服务器的数量限制 表和可以引用单个表中的列的列 (传入参考),范围从253到10,000。