2011-09-09 2 views

답변

7

에 달려 있습니다. RDBMS를 지정하지 않았으므로 SQL Server에 대해서만 구체적으로 이야기 할 수 있지만 데이터 형식에는 관련된 저장 비용이 다릅니다. Ints 범위는 1 - 8 바이트, Decimals은 5-17이고 floats은 4 - 8 바이트입니다.

RDBMS는 데이터를 찾기 위해 디스크에서 데이터 페이지를 읽어야하며 (최악의 경우) 8k 페이지의 데이터에 너무 많은 행을 넣을 수 있습니다. 따라서 17 바이트 소수 자릿수를 사용하는 경우 데이터의 크기를 올바르게 지정하고 X를 저장하기 위해 1 바이트 비용의 작은 비트를 사용하는 경우보다 읽기 당 디스크에서 읽는 행의 양이 1/17이됩니다.

데이터를 정렬 (정렬) 할 때 저장소 비용이 계단식 효과를 갖습니다. 그것은 메모리에서 정렬하려고 시도하지만 bazillion 행이 있고 메모리가 부족하면 일종의 임시 저장 장치에 덤프 될 수 있으며 그 비용을 계속해서 지불하고 있습니다.

인덱스는 정렬 된 방식으로 데이터를 저장할 수 있지만 데이터를 메모리로 가져 오는 것이 비만 데이터 유형에 비해 효율적이지 않은 경우 도움이 될 수 있습니다.

[편집]

@Bohemian 부동 소수점 비교 대 정수의 CPU 효율에 대한 좋은 점을하게하지만, CPU가 데이터베이스 서버에 아군 할 것이 놀라 울 정도로 드물다. 디스크 IO 하위 시스템과 메모리에 제약을받는 경우가 많기 때문에 엔진에서 데이터를 정렬 작업을 수행하는 데 필요한 데이터와 비교하는 CPU 비용 사이의 속도 차이에 중점을 둡니다.

+0

고마워요, @billinkc. 데이터베이스는 PostgreSQL 일 가능성이 큽니다. 아마도 * bigint *가 필요할 것이므로 나중에 레코드를 저장하면 특정 순서대로 정렬 될 수 있습니다. –

5

(편집)은 디스크에 정확히 동일한 공간을 점유하고, 메모리 물론 - 32 비트 - 즉 유일한 차이는 방법에 그들이 를 처리한다.

int는 비교가 간단하기 때문에, float보다 정렬 빨리해야한다 : 프로세서는 하나의 기계 사이클에서의 int를 비교할 수 있지만, 부동의 비트는 확실하지 않다 (비교하기 전에 값을 얻기 위해 '해석'할 필요가 얼마나 많은 사이클 아마도 일부 CPU는 부동 소수점 비교를위한 특별한 지원을 할 수 있지만).

+1

좋은 포인트를 10 % 추가 것 물건에 대해 걱정하기 전에 디스크 I/O 또는 악화를 두 배로 것 물건에 대해 걱정 , 나는 디스크와 메모리에 초점을 맞췄다. – billinkc

+0

나는 동의 하겠지만, 십진수의 경우, 그것은 사실이 아니어야한다 : 그들은 오래된 EBCEDIC과 같이 코딩되어 있고, 바이너리 모드에서 빨리 비교해야한다. –

+0

마치 프로세서 구현에 달려있는 것 같습니다 : 일부는 매우 빠르게 만드는 부동 소수점 단위를 가지고 있습니다. 그러나 int가 모든 경우에 빠르다고 보장되기 때문에 +1. – Klaim

3

일반적으로 데이터 유형의 선택은 데이터 유형이 저장해야하는 값을 저장하는 데 적합한 지 여부에 따라 결정되어야합니다. 주어진 데이터 유형이 부적절한 경우 데이터 유형이 얼마나 효율적인지는 중요하지 않습니다.

디스크 I/O 측면에서 속도 차이는 2 차입니다. 1 차 효과와 관련하여 디자인이 좋을 때까지 2 차 효과에 대해 걱정하지 마십시오.

인덱스 디자인을 수정하면 쿼리가 정렬 된 순서로 검색 될 때 지연이 크게 감소합니다. 그러나 쿼리 속도를 높이려면 인덱싱 된 데이터를 수정하는 프로세스와 같은 다른 프로세스의 속도가 느려지므로 비용을 절감해야합니다. 그만한 가치가 있는지 여부를 판단해야합니다.한마디로

, 당신은 실제 CPU 비용에 대한 귀하의 디스크 I/O를

+0

디자인에 대한 좋은 지적, Walter. 내가 질문을하는 진정한 이유는 데이터베이스에서 상대적 타임 라인 http://stackoverflow.com/questions/7342264를 구성하고 bigint 또는 float를 사용하여 이벤트를 정렬해야하는지 궁금하기 때문입니다. 결국 int에 레코드를 작성할 때 숫자의 간격을 띄우면 2 개의 이전 이벤트 사이에 중간에 숫자를 가져와 새 이벤트를 삽입 할 수 있습니다. 마지막에 항상 새로운 자리를 추가하여 (.50 -> .501 -> .51) 삽입 할 수 있기 때문에 십진수도 사용할 수 있습니다. –

관련 문제