SQL Server : [닫힌] 테이블의 최대 행 수


80

데이터베이스 테이블 (SQL Server 버전 8, 9 또는 10) 중 하나에 많은 데이터를 저장하는 소프트웨어를 개발합니다. 하루에 약 100,000 개의 레코드가 해당 테이블에 삽입된다고 가정 해 보겠습니다. 이것은 연간 약 3,600 만 개의 레코드입니다. 성능이 떨어질 까봐 걱정이되어 테이블 당 레코드 수를 줄이기 위해 매일 새 테이블 (이름에 현재 날짜가있는 테이블)을 만들기로 결정했습니다.

그게 좋은 생각인지 말씀해 주시겠습니까? SQL Server 테이블에 대한 레코드 제한이 있습니까? 또는 성능이 크게 저하되기 전에 테이블에 저장할 수있는 레코드 수 (다소)를 알고 있습니까?


33
"프로그래머는 프로그램의 중요하지 않은 부분의 속도에 대해 생각하거나 걱정하는 데 막대한 시간을 낭비하며 이러한 효율성 시도는 실제로 디버깅 및 유지 관리를 고려할 때 강력한 부정적인 영향을 미칩니다. 97 %의 시간 : 조기 최적화는 모든 악의 근원입니다. 그러나 우리는 그 중요한 3 %에서 기회를 포기해서는 안됩니다. " 크 누스 1974
마태 복음 잠금

답변:


36

이에 대한 일반적인 대답을 제공하기는 어렵습니다. 실제로 여러 요인에 따라 다릅니다.

  • 행의 크기
  • 저장하는 데이터의 종류 (문자열, 얼룩, 숫자)
  • 데이터로 무엇을합니까 (아카이브로 보관하고 정기적으로 쿼리)
  • 테이블에 인덱스가 있습니까?
  • 당신의 서버 사양은 무엇입니까

기타

여기 다른 곳에서 대답했듯이, 하루에 100,000, 따라서 테이블 당 과잉입니다. 매월 또는 매주 아마도 분기별로 제안 할 것입니다. 테이블이 많을수록 더 큰 유지 관리 / 쿼리 악몽이 될 것입니다.


13
나는 "더 큰 유지 관리 / 쿼리 악몽"을 다시 시행하고 싶다. 개인적인 경험에서 나는 전염병과 같은 테이블로 나누는 것을 피하고 싶다.
Daniel James Bryars 2011

92

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

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

22
9,223,372,036,854,775,807 개 이상의 행이있는 경우 문제가 발생할 것이라고 생각합니다 (최대 크기 a bigint)
Martin Smith

11
OP가 언급 한 100000 행 / 일에서 해당 행 수에 도달하는 데 걸리는 년 수를 계산 한 적이 있습니까?
Erwin Smout 2011

75
게으른 사람을 위해 게시 : 252,695,124 년.
NotMe

18
@NotMe 부활하고 nitpick하지 않지만 252695124297 년을 얻었습니다. (때로는 내가 당신이 언급 한 게으른 인구
였으면 좋겠어요

4
@philthyfool 윤년의 하루는 엄청난 차이입니다. 252,522,163,911을받습니다. 또한, 지금은 돌아올 수없는 내 인생의 완벽한 시간이었습니다.
Suamere

53

SQL Server 2008 R2에는 60 억 개가 넘는 행이있는 3 열 테이블이 있습니다.

우리는 고객을 위해 분 단위 시스템 분석 차트를 만들기 위해 매일 쿼리합니다. 데이터베이스 성능 저하를 발견하지 못했습니다 (매일 ~ 1GB가 증가한다는 사실 때문에 백업 관리가 원하는 것보다 약간 더 복잡해집니다).

2016 년 7 월 업데이트

행 수

백업이 2 년 이상 된 레코드를 잘라내기로 결정할 수있을만큼 충분히 커지기 전에 최대 245 억 행 으로 만들었습니다 (고가의 테이프를 포함하여 여러 백업에 저장되는 최대 700GB). 이 결정에서 성과가 중요한 동기가 아니었다는 점은 주목할 가치가 있습니다 (즉, 여전히 훌륭하게 작동하고 있음).

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 에디션을 실행하는 경우 기본 제공 기능 사용). 이렇게하면 테이블을 한 번 (주 / 월 / 기타) 자르는 것만 큼 쉽게 오래된 데이터를 삭제할 수 있습니다. Enterprise (우리가없는)가없는 경우 한 달에 한 번 실행하고 2 년 이상 된 테이블을 삭제하고 다음 달의 테이블을 만들고 모든 파티션을 조인하는 동적 뷰를 다시 생성하는 스크립트를 작성하면됩니다. 쉬운 쿼리를 위해 함께 테이블. 분명히 "한 달에 한 번"및 "2 년 이상"은 사용 사례에 맞는 것을 기반으로 정의해야합니다.


14
최대 10 억 5 천만 달러, 여전히 흔들리고 있습니다. COUNT ()를 실행하려고하지 마십시오. ;)
Dan Bechard 2015 년

6
1 년이 지났고, 우리는 165 억 개의 행에 있습니다. 방금 추가 데이터 소스를 추가 했으므로 이제 조금 더 빠르게 성장하고 있습니다. 또한이 데이터베이스를 자체 SQL 인스턴스로 이동하여 서버의 다른 데이터베이스를 고갈시키지 않고 전용 메모리를 사용할 수 있도록했습니다. 지난 3 년 동안 24 시간 동안 1 초 이내에 모든 데이터 포인트를 차트로 작성할 수 있습니다. 우리 분석가들은 그것을 좋아합니다.
Dan Bechard

오랜만이라는 건 알지만이 데이터베이스를 실행하는 하드웨어 종류에 대해 말씀해 주시겠습니까? 이 미래에 문제가지기 시작하면 우리는 일년에 10 억 증가, 50 억 행의 테이블을 가지고 있고, IK 알아 싶습니다 때문에 호기심
Jeroen1984

3
@ Jeroen1984 두 개의 Intel (R) Xeon (R) CPU E5-2430 프로세서가 장착 된 Hyper-V 호스트 ProLiant DL360e Gen8에서 실행되는 가상 머신입니다. VM에는 38GB의 정적으로 할당 된 RAM과 내가 기억하지 못하는 몇 개의 가상 프로세서가 있습니다.
Dan Bechard 2016

19

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


19

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

나는의 큰 팬이 아니에요 동안 일부 마이크로 소프트의 소프트웨어, 이것은 우리가 여기에 대해 얘기에 액세스되지 않은 : 나는 그들이 엔터프라이즈 DBMS 꽤 상당한 데이터베이스 크기를 처리 할 수있는 가정합니다.

나는 실제로 분할이 필요하다면 분할하기에는 날이 너무 미세했을 수 있다고 생각합니다.


5

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

적절한 디스크 공간 (어쨌든 필요한)과 RAM을 추가하는 것이 훨씬 저렴합니다.


4

상황에 따라 다르지만 단순성을 위해 모든 것을 하나의 테이블에 보관하는 것이 좋습니다.

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

반면에 데이터를 사용하는 방법에 따라 쿼리를 많이 만들어야하고 며칠에 걸친 데이터가 필요하지 않은 경우 (테이블을 조인 할 필요가 없음) 여러 테이블로 분리하는 것이 더 빠릅니다. 이는 10 초마다 50,000 개의 기기에서 값을 읽을 수있는 산업 공정 제어와 같은 애플리케이션에서 자주 사용됩니다. 이 경우 속도는 매우 중요하지만 단순성은 중요하지 않습니다.


3

테이블에서 정수 기본 키를 한 번 (약 24 억 행) 오버플로했습니다. 행 제한이있는 경우 연간 3 천 6 백만 행에 도달 할 가능성은 거의 없습니다.


2

디스크 공간이 충분할 때까지 테이블을 채울 수 있습니다. 더 나은 성능을 위해 SQL Server 2005로 마이그레이션 한 다음 테이블을 분할하고 다른 디스크에 부품을 배치 할 수 있습니다 (실제로 도움이 될 수있는 RAID 구성이있는 경우). 분할은 SQL Server 2005 엔터프라이즈 버전에서만 가능합니다. 다음 링크에서 분할 예제를 볼 수 있습니다. http://technet.microsoft.com/en-us/magazine/cc162478.aspx

또한 가장 많이 사용되는 데이터 부분에 대한보기를 만들 수도 있습니다. 이는 솔루션 중 하나이기도합니다.

이것이 도움이 되었기를 바랍니다.


0

Windows2003의 SQL Server 8에서 내가 만난 가장 큰 테이블은 5 개 열이있는 7 억 9 천만 명이었습니다. 그러나 그것이 좋은지 여부는 SLA 및 사용 사례에 대해 측정하는 것입니다. 예를 들어 50-100,000,000 개의 레코드를로드하고 여전히 작동하는지 확인합니다.


2
이것이 정말로 답인지 확실하지 않습니다.
앤드류 바버

-1
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

이 쿼리를 실행하여이 결과를 얻었습니다. 내 데이터베이스에 UrlCategories 테이블이 있습니다. 이 결과는 무엇을 의미합니까? 이름 TableRows L10_TableRows UrlCategories 7 0.85
Aditya Bokade 2013

-4

테이블을 매월 분할하십시오. Oracle 또는 MSSQL과 같이 일일 유입량이 많은 테이블을 처리하는 가장 좋은 방법입니다.


4
이것이 질문 한 특정 질문에 대한 답변인지 확실하지 않습니다.
Andrew Barber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.