最近在做批量插入SQL Server時,出現了SQL參數過多的錯誤異常。經查閱資料,發現SQL server對於SQL中用戶自定義的參數限制爲2100個。於是變更了批量插入的分組數,解決該問題。
以下是蒐集的關於SQL Server的最大容量規範,包含數據庫引擎對象、實用工具對象、數據層引用對象、複製對象四個對象中的相關最大數量和最小數量。一般開發者重點還是在數據庫引擎對象這塊。個人覺得比較重要的都進行了加粗變色處理。
數據庫引擎 對象
在 SQL Server 數據庫中定義的或在 Transact-SQL 語句中引用的各種對象的最大大小和最大數量。
SQL Server 數據庫引擎 對象 (object) | 最大大小/數量 SQL Server (64 位) | 其他信息 |
---|---|---|
批大小 | 65,536 * 網絡數據包大小 | 網絡數據包大小指的是用於在應用程序和關係 數據庫引擎之間進行通信的表格格式數據流 (TDS) 數據包的大小。 默認的數據包大小爲 4 KB,由“網絡數據包大小”配置選項控制。 |
每個短字符串列的字節數 | 8,000 | |
每個 GROUP BY、ORDER BY 的字節數 | 8,060 | |
每個索引鍵的字節數 | 聚集索引爲 900 字節。 非聚集索引爲 1,700 字節。 | 在 SQL Server中,聚集索引鍵的最大字節數不能超過 900。 對於非聚集索引鍵,最大值爲 1700 個字節數。 你可以使用可變長度列來定義鍵,這些列的最大大小之和可超過此限制。 但是,這些列中數據的總大小絕不能超過此限制。 在非聚集索引中,可以包含額外的非鍵列,且這些非鍵列不會算入鍵的大小限制。 非鍵列可能有助於更好地執行某些查詢。 |
內存優化表中的每個索引鍵的字節數 | 非聚集索引爲 2,500 字節。 哈希索引沒有限制,只要全部索引鍵均適應行內即可。 | 在內存優化表上,非聚集索引不能具有聲明的最大大小超過 2500 個字節的鍵列。 這與鍵列中實際數據是否短於聲明的最大大小並不相關。 因爲,哈希索引沒有硬性大小限制。 對於內存優化表的索引,不存在“包含的列”這一概念,因爲所有索引本來就覆蓋了所有的列。 對於內存優化表,即使行大小爲 8060 個字節,一些可變長度列也可以物理方式存儲於這 8060 個字節以外的空間。 但是,表上所有索引的所有鍵列,加上表中任何其他固定長度列,其最大聲明大小不得超過 8060 個字節。 |
每個外鍵的字節數 | 900 | |
每個主鍵的字節數 | 900 | |
每行的字節數 | 8,060 | SQL Server 支持行溢出存儲,行溢出存儲使長度可變的列可以被推送到行外。 只有 24 字節的根存儲在推送出行外的可變長度列的主記錄中;因此,此版本中的有效行限制高於 SQL Server早期版本中的有效行限制。 有關更多信息,請參閱大型行支持。 |
內存優化表中的每行字節數 | 8,060 | 啓動 SQL Server 2016 (13.x) 內存優化表支持行外存儲。 如果表中的所有列的最大大小超過 8060 個字節,則可變長度列將被擠出行,這是編譯時的決定。 存儲於行外的列僅有 8 字節的引用存儲於行內。 有關詳細信息,請參閱 內存優化表中的表和行大小。 |
存儲過程源文本中的字節數 | 批處理大小中的較小者或 250 MB | |
每個 varchar(max) 、 varbinary(max) 、 xml、 text或 image 列的字節 | 2^31-1 | |
每個 ntext 或 nvarchar(max) 列的字符 | 2^30-1 | |
每個表的聚集索引數 | 1 | |
GROUP BY、ORDER BY 中的列數 | 僅受字節數限制 | |
GROUP BY WITH CUBE 或 WITH ROLLUP 語句中的列數或表達式數目 | 10 | |
每個索引鍵的列數 | 32 | 如果表包含一個或多個 XML 索引,由於 XML 列被添加到主 XML 索引的聚集鍵,因此用戶表的聚集鍵被限制爲 31 列。 在 SQL Server中,可在非聚集索引中包括非鍵列以避免最多爲 32 個鍵列的限制。 有關詳細信息,請參閱 Create Indexes with Included Columns。 |
每個外鍵的列數 | 32 | |
每個主鍵的列數 | 32 | |
每個非寬表的列數 | 1,024 | |
每個寬表的列數 | 30,000 | |
每個 SELECT 語句的列數 | 4,096 | |
每個 INSERT 語句的列數 | 4,096 | |
每個客戶端的連接個數 | 已配置連接的最大值 | |
數據庫大小 | 524,272 TB | |
每個 SQL Server | 32,767 | |
每個數據庫的文件組個數 | 32,767 | |
每個數據庫的內存優化數據文件組個數 | 1 | |
每個數據庫的文件個數 | 32,767 | |
文件大小(數據) | 16 TB | |
文件大小(日誌) | 2 TB | |
每個數據庫的內存優化數據文件個數 | SQL Server 2014 (12.x) 中爲 4,096。 更高版本的 SQL Server 不會施加這樣的嚴格限制。 | |
每個內存優化數據文件的差異文件 | 1 | |
每個表的外鍵表引用數 | 傳出 = 253。 傳入 = 10,000。 | 有關限制,請參閱 Create Foreign Key Relationships。 |
標識符長度(以字符計) | 128 | |
每臺計算機的實例數 | 獨立服務器上爲 50 個實例。 在使用共享羣集磁盤作爲您的羣集安裝的存儲選項時,在故障轉移羣集上支持 25 個實例。如果您爲羣集安裝選擇 SMB 文件共享作爲存儲選項,則 SQL Server 在故障轉移羣集上支持 50 個實例。 |
|
每個內存優化表的索引個數 | 自 SQL Server 2017 (14.x) 起以及在 Azure SQL Database 中爲 999 SQL Server 2014 (12.x) 和 SQL Server 2016 (13.x) 中爲 8 |
|
包含 SQL 語句的字符串的長度(批大小) | 65,536 * 網絡數據包大小 | 網絡數據包大小指的是用於在應用程序和關係 數據庫引擎之間進行通信的表格格式數據流 (TDS) 數據包的大小。 默認的數據包大小爲 4 KB,由“網絡數據包大小”配置選項控制。 |
每個連接的鎖數 | 每個服務器的最大鎖數 | |
每個 SQL Server | 僅受內存限制 | 此值針對靜態鎖分配。 動態鎖僅受內存限制。 |
嵌套存儲過程級別數 | 32 | 如果存儲過程訪問的數據庫多於 64 個,或者交替訪問的數據庫多於 2 個,將收到錯誤信息。 |
嵌套子查詢個數 | 32 | |
嵌套觸發器層數 | 32 | |
每個表的非聚集索引數 | 999 | |
當存在以下任意子句時,GROUP BY 子句中的非重複表達式數:CUBE、ROLLUP、GROUPING SETS、WITH CUBE、WITH ROLLUP | 32 | |
GROUP BY 子句中的運算符生成的分組集數目 | 4,096 | |
每個存儲過程的參數個數 | 2,100 | |
每個用戶定義函數的參數個數 | 2,100 | |
每個數據表的 REFERENCE 個數 | 253 | |
每個數據表的行數 | 受可用存儲空間限制 | |
每個數據庫的表數 | 受數據庫中對象數限制 | 數據庫對象包括諸如表、視圖、存儲過程、用戶定義函數、觸發器、規則、默認值和約束等對象。 數據庫中所有對象的數量總和不能超過 2,147,483,647。 |
每個分區表或索引的分區數 | 15,000 | |
非索引列的統計信息條數 | 30,000 | |
每個 SELECT 語句的表個數 | 僅受可用資源限制 | |
每個表的觸發器數 | 受數據庫中對象數限制 | 數據庫對象包括諸如表、視圖、存儲過程、用戶定義函數、觸發器、規則、默認值和約束等對象。 數據庫中所有對象的數量總和不能超過 2,147,483,647。 |
每個 UPDATE 語句(寬表)的列數 | 4096 | |
用戶連接 | 32,767 | |
XML 索引 | 249 |
SQL Server 實用工具對象
在 SQL Server 實用工具中測試的各種對象的最大大小和最大數量。
SQL Server 實用工具對象 | 最大大小/數量 SQL Server (64 位) |
---|---|
每個 SQL Server 實用工具的計算機數(物理計算機或虛擬計算機) | 100 |
每臺計算機的 SQL Server 實例數 | 5 |
每個 SQL Server 實用工具的 SQL Server 實例總數 | 200* |
每個 SQL Server實例的用戶數據庫數(包括數據層應用程序) | 50 |
每個 SQL Server 實用工具的用戶數據庫總數 | 1,000 |
每個數據庫的文件組數 | 1 |
每個文件組的數據文件數 | 1 |
每個數據庫的日誌文件數 | 1 |
每臺計算機的卷數 | 3 |
* SQL Server 實用工具支持的 SQL Server 託管實例的最大數目將會依服務器的硬件配置而定。
SQL Server 數據層應用程序對象
在 SQL Server 數據層應用程序 (DAC) 中測試的各種對象的最大大小和最大數量。
SQL Server DAC 對象 | 最大大小/數量 SQL Server (64 位) |
---|---|
每個 DAC 的數據庫數 | 1 |
每個 DAC 的對象數* | 受數據庫中對象數或可用內存限制。 |
*限制中包含的對象類型爲用戶、表、視圖、存儲過程、用戶定義函數、用戶定義數據類型、數據庫角色、架構和用戶定義表類型。
複製對象
在 SQL Server 複製中定義的各種對象的最大大小和最大數量。
SQL Server 複製對象 | 最大大小/數量 SQL Server(64 位) | |
---|---|---|
項目(合併發佈) | 2048 | |
項目(快照發布或事務發佈) | 32,767 | |
表中的列數*(合併發佈) | 246 | |
表中的列數**(SQL Server 快照發布或事務發佈) | 1,000 | |
表中的列數**(Oracle 快照發布或事務發佈) | 995 | |
行篩選器中使用的列的字節數(合併發佈) | 1,024 | |
行篩選器中使用的列的字節數(快照發布或事務發佈) | 8,000 |
*如果將行跟蹤用於衝突檢測(默認設置),則基表最多可以包含 1,024 列,但必須從項目中對這些列進行篩選,以便最多可發佈 246 列。 如果使用列跟蹤,則基表最多可包含 246 列。
**基表可以包含發佈數據庫中允許的最大數量的列(在 SQL Server中爲 1,024),但如果這些列的數目超過爲發佈類型指定的最大值,則必須從項目中篩選這些列。