sourcecode

SQL Server: 테이블의 최대 행 수

codebag 2023. 5. 18. 21:01
반응형

SQL Server: 테이블의 최대 행 수

데이터베이스 테이블 중 하나(SQL Server 버전 8, 9 또는 10)에 많은 데이터를 저장하는 소프트웨어를 개발합니다.하루에 약 100,000개의 레코드가 그 테이블에 삽입됩니다.이것은 연간 약 3천 6백만 개의 기록입니다.성능을 위해 매일 새 테이블(이름에 현재 날짜가 있는 테이블)을 만들어 테이블당 레코드 수를 줄입니다.

이게 좋은 생각이었나요?SQL 서버 테이블에 대한 레코드 제한이 있습니까?또는 성능이 크게 저하되기 전에 테이블에 저장할 수 있는 레코드 수가 얼마나 되는지 알고 계십니까?

다음은 SQL Server 2008 R2의 최대 용량 사양 중 일부입니다.

  • 데이터베이스 크기: 524,272 테라바이트
  • SQL Server 인스턴스당 데이터베이스 수: 32,767
  • 데이터베이스당 파일 그룹 수: 32,767개
  • 데이터베이스당 파일 수: 32,767개
  • 파일 크기(데이터): 16테라바이트
  • 파일 크기(로그): 2테라바이트
  • 테이블당 행 수:사용 가능한 스토리지에 의해 제한됨
  • 데이터베이스당 테이블 수:데이터베이스의 개체 수에 따라 제한됨

SQL Server 2008 R2의 행 수가 60억 개를 조금 넘는 세 개의 열 테이블이 있습니다.

우리는 고객을 위한 분 단위 시스템 분석 차트를 만들기 위해 매일 조회합니다.데이터베이스 성능이 저하되는 것을 전혀 눈치채지 못했습니다(매일 최대 1GB씩 증가한다는 사실로 인해 백업 관리에 필요한 작업이 예상보다 다소 증가함).

2016년 7월 업데이트

행 수

백업이 2년 이상 된 레코드(고가의 테이프를 포함하여 여러 백업에 저장된 700GB)를 잘라내기로 결정할 수 있을 정도로 크기가 커지기 전에 최대 245억 행에 도달했습니다.이러한 결정에 있어 성과는 중요한 동기부여 요인이 되지 못했다는 점에 주목할 필요가 있습니다(즉, 여전히 효과적이었습니다).

SQL Server에서 200억 개의 행을 삭제하려는 사람이라면 이 기사를 적극 추천합니다.링크가 끊길 경우 관련 코드(자세한 설명은 기사 참조):

ALTER DATABASE DeleteRecord SET RECOVERY SIMPLE;
GO

BEGIN TRY
    BEGIN TRANSACTION
        -- Bulk logged 
        SELECT  *
        INTO    dbo.bigtable_intermediate
        FROM    dbo.bigtable
        WHERE   Id % 2 = 0;

        -- minimal logged because DDL-Operation 
        TRUNCATE TABLE dbo.bigtable;  

        -- Bulk logged because target table is exclusivly locked! 
        SET IDENTITY_INSERT dbo.bigTable ON;
        INSERT INTO dbo.bigtable WITH (TABLOCK) (Id, c1, c2, c3)
        SELECT Id, c1, c2, c3 FROM dbo.bigtable_intermediate ORDER BY Id;
        SET IDENTITY_INSERT dbo.bigtable OFF;
    COMMIT
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

ALTER DATABASE DeleteRecord SET RECOVERY FULL;
GO

2016년 11월 업데이트

이렇게 많은 데이터를 단일 테이블에 저장하려는 경우: 저장하지 마십시오.테이블 파티셔닝(수동으로 또는 Enterprise Edition을 실행하는 경우 기본 제공 기능 포함)을 고려하는 것이 좋습니다.따라서 오래된 데이터를 삭제하는 것은 테이블을 1주일에 한 번(주/월/일 등) 자르기만 하면 됩니다.Enterprise가 없는 경우(우리에게는 없는 경우) 한 달에 한 번 실행되고 2년 이상 된 테이블을 삭제하고 다음 달 테이블을 만들고 모든 파티션 테이블을 함께 결합하는 동적 보기를 재생성하여 쿼리를 쉽게 수행할 수 있습니다.분명히 "한 달에 한 번"과 "2년 이상"은 사용 사례에 적합한 것을 기준으로 정의해야 합니다.수백억 줄의 데이터가 있는 테이블에서 직접 삭제하면 a) 시간이 많이 걸리고 b) 트랜잭션 로그를 수백 또는 수천 번 채웁니다.

이것에 대해 일반적인 대답을 하기는 어렵습니다.이는 실제로 다음과 같은 요인의 수에 따라 달라집니다.

  • 행 크기
  • 저장하는 데이터 유형(숫자, 블롭, 숫자)
  • 데이터로 수행할 작업(아카이브로 보관, 정기적으로 쿼리)
  • 테이블에 인덱스가 있습니까? - 몇 개입니까?
  • 서버 사양이 무엇입니까?

기타.

여기 다른 곳에서 답변했듯이, 하루에 10만 명, 따라서 1인당 살인은 과도합니다. 저는 매달 또는 매주, 아마도 분기별로 제안하고 싶습니다.테이블이 많을수록 유지보수/쿼리에 대한 악몽이 커집니다.

저는 행 제한은 모르지만 1억 7천만 개 이상의 행이 있는 테이블을 알고 있습니다.분할된 테이블(2005+) 또는 여러 테이블을 연결하는 뷰를 사용하여 속도를 높일 수 있습니다.

MSSQL을 구체적으로 알지는 못하지만 3,600만 개의 행은 엔터프라이즈 데이터베이스에 비해 크지 않습니다. 메인프레임 데이터베이스로 작업하면 100,000개의 행이 구성 테이블처럼 들립니다 :-).

Microsoft 소프트웨어 중 일부는 별로 좋아하지 않지만, 여기서 말하는 액세스는 아닙니다. 엔터프라이즈 DBMS로 상당한 데이터베이스 크기를 처리할 수 있다고 생각합니다.

나는 만약 그것이 정말로 분할이 필요하다면, 그것을 분할하기에는 며칠이 너무 좋은 해결책이었는지 의심합니다.

SQL Server 2005 및 2008에는 10억 개 이상의 행(매일 3천만 개 추가)이 있는 테이블이 있습니다.저는 그것을 매일 새로운 테이블로 나누어서 쥐집에 가는 것을 상상할 수 없습니다.

적절한 Disk 공간(어차피 필요한 공간)과 RAM을 추가하는 것이 훨씬 저렴합니다.

그것은 나름이지만, 그 단순함을 위해 모든 것을 한 테이블에 보관하는 것이 좋다고 말씀드리고 싶습니다.

하루에 100,000개의 행이 실제로 그렇게 많은 양은 아닙니다(서버 하드웨어에 따라 다름).MSSQL이 단일 테이블에서 최대 1억 개의 행을 문제 없이 처리하는 것을 직접 보았습니다.당신이 당신의 인덱스를 순서대로 유지하는 한 그것은 모두 좋을 것입니다.중요한 것은 인덱스를 디스크로 스왑할 필요가 없도록 메모리를 쌓아두는 것입니다.

한편, 데이터를 어떻게 사용하느냐에 따라 많은 쿼리를 작성해야 하는 경우, 가능성이 낮은 데이터가 여러 날에 걸쳐 필요할 것이므로 테이블에 참여할 필요가 없습니다. 따라서 여러 테이블로 분리하는 것이 더 빠를 것입니다.이는 10초마다 50,000개 기기의 값을 읽을 수 있는 산업 프로세스 제어와 같은 응용 프로그램에서 자주 사용됩니다.이 경우 속도는 매우 중요하지만 단순성은 중요하지 않습니다.

테이블에서 정수 기본 키를 한 번 오버플로했습니다(최대 24억 행).행 제한이 있다면 연간 3,600만 행에 그칠 가능성은 거의 없습니다.

디스크 공간이 부족할 때까지 테이블을 채울 수 있습니다.

더 나은 성능을 위해 SQL Server 2005로 마이그레이션한 다음 테이블을 파티션으로 분할하고 다른 Disk에 부품을 배치할 수 있습니다(RAID 구성이 있는 경우).파티셔닝은 SQL Server 2005의 엔터프라이즈 버전에서만 가능합니다. 링크에서 파티션 예제를 볼 수 있습니다.

또한 가장 많이 사용되는 데이터 부분에 대한 보기를 만들 수 있으며, 이 또한 해결책 중 하나입니다.

Windows 2003의 SQL Server 8에서 만난 가장 큰 테이블은 5개의 열이 있는 7억 9천 9백만 개였습니다.그러나 SLA 및 사용 사례를 기준으로 호의적인지 여부를 측정해야 합니다. 예를 들어 50-100,000,000개의 레코드를 로드하고 여전히 작동하는지 확인합니다.

SELECT Top 1 sysobjects.[name], max(sysindexes.[rows]) AS TableRows, 
  CAST( 
    CASE max(sysindexes.[rows]) 
      WHEN 0 THEN -0 
      ELSE LOG10(max(sysindexes.[rows])) 
    END 
    AS NUMERIC(5,2)) 
  AS L10_TableRows 
FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id] 
WHERE sysobjects.xtype = 'U' 
GROUP BY sysobjects.[name] 
ORDER BY max(rows) DESC

테이블을 월별로 분할합니다.이 방법은 오라클 또는 MSSQL에서 일일 유입량이 많은 테이블을 처리하는 가장 좋은 방법입니다.

언급URL : https://stackoverflow.com/questions/759244/sql-server-the-maximum-number-of-rows-in-table

반응형