SQL Server:引用表的最大约束数量

时间:2019-05-07 14:55:32

标签: sql-server

在我们的数据库中,大约有1000个表引用表:FAMILIES。当我们尝试从FAMILIES删除记录时,我们看到以下错误:

8621消息,第17级,状态1,第81行 查询优化期间查询处理器的堆栈空间不足。请简化查询。

我注意到,如果一个表有超过918个引用该表的外部约束,我们可以重现此问题。下面是重现该错误的代码。

以下代码:     创建表FAMILIES     插入样本记录     创建引用FAMILIES的表(@tbl_count是要创建的表数)     从FAMILIES删除记录

如果我们将@tbl_count的值更改为918或更小,则代码可以正常工作。

  1. 一个表可以具有的任何约束(或外键引用)的最大数量是多少?
  2. 如果引用一个表的表超过1000个,是否可以解决该错误?

此问题在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

1 个答案:

答案 0 :(得分:4)

在SQL 2016中增加了受支持的限制。请参见

  

可以计算的FOREIGN KEY约束的实际数量   使用的硬件受到硬件配置和设计的限制   数据库和应用程序。我们建议一个表不再包含   超过253个FOREIGN KEY约束,并且不再引用   超过253个外键约束。

https://docs.microsoft.com/en-us/sql/relational-databases/tables/create-foreign-key-relationships?view=sql-server-2014

  

SQL Server 2016(13.x)增加了其他服务器的数量限制   表和可以引用单个表中的列的列   (传入参考),范围从253到10,000。

https://docs.microsoft.com/en-us/sql/relational-databases/tables/create-foreign-key-relationships?view=sql-server-2016