2008-10-20 2 views
1

SQL 데이터베이스는 대부분의 소프트웨어의 초석 인 것처럼 보입니다. 그러나 텍스트 데이터에 최적화 된 것으로 보입니다. 실제로 숫자 데이터, 정수를 포함하는 쿼리를 수행 할 때 숫자가 텍스트로 변환 된 다음 응용 프로그램과 데이터베이스간에 네이티브 형식으로 다시 변환되는 것은 비효율적 인 것처럼 보입니다. 이와 동일한 비 효율성이 BLOB 데이터에도 적용되는 것처럼 보입니다. 필자의 이해는 Linq to SQL과 같은 것조차도이 양방향 변환이 백그라운드에서 발생한다는 것입니다.데이터베이스 통신에서 BLOB 및 수치 데이터를 효율적으로 처리하는 방법은 무엇입니까?

SQL을 사용하여이 오버 헤드를 우회하는 일반적인 방법이 있습니까? 다른 특정 데이터베이스 관리 시스템보다 효율적으로이를 처리하는 특정 데이터베이스 관리 시스템이 있습니까 (예 : 비표준 확장/API 사용)?

명확화. 다음 select 문에서 IN 이후의 숫자 목록은 int의 원시 배열로보다 쉽게 ​​전달 될 수 있지만 최적화 수준을 달성 할 방법이없는 것 같습니다.

SELECT foo FROM bar WHERE baz IN (23, 34, 45, 9854004, ...) 

답변

1

데이터베이스의 수치 데이터는 텍스트로 저장되지 않습니다. 나는 그것이 데이터베이스에 달려 있다고 생각하지만, 분명히 있어야 할 필요는 없다.

BLOB는 사용자가 설정 한대로 정확하게 저장되며, DB는 정보를 해석 할 방법이 없습니다. 유용하다고 판단되면 압축 할 수 있습니다. BLOB는 텍스트로 변환되지 않습니다.

은 여기 어떻게 오라클 저장 번호 :

http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#i16209

내부 숫자 형식

오라클 데이터베이스는 가변 길이 형식으로 숫자 데이터. 각 값은 과학 표기법으로 저장되며 지수를 저장하는 데 1 바이트, 가수를 저장하는 데 최대 20 바이트가 사용됩니다. 결과 값은 38 자리의 정밀도로 제한됩니다. Oracle Database는 선행 및 후행 0을 저장하지 않습니다. 예를 들어, 숫자 412는 4.12 x 102와 비슷한 형식으로 저장되며, 지수 (2)를 저장하는 데 1 바이트가 사용되고 가수 (3,1,2)의 유효 숫자 3 자리를 저장하는 데 사용됩니다. 음수에는 길이가 기호로 표시됩니다. 여기

MySQL의 정보 : 텍스트로 저장하면, 불가능 테이블에

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

봐는 - - TINYINT 1 바이트 (127 -128)로 표현된다.

편집 : 명확한 설명과 함께 -이 (의사) 같은

stmt = conn.Prepare("SELECT * FROM TABLE where x in (?, ?, ?)"); 
stmt.SetInt(0, x); 
stmt.SetInt(1, y); 
stmt.SetInt(2, z); 

I가 기본이되는 프로토콜의 전송을 위해 텍스트를 사용하여 믿을 수 없어 보이는 언어의 API를 사용하여 말할 것 매개 변수.

+0

질문은 데이터가 저장되는 방식이 아니라 애플리케이션과 DBMS 간의 통신에 관한 것입니다. – postfuturist

2

생각하지 마십시오. 법안.

산술 엔진으로 데이터베이스를 오용하지 않는 한 형식 변환은 데이터베이스 작업에 측정 가능한 비용이 될 가능성이 없습니다.

LOB의 IO 비용, 특히 문자 변환이있는 CLOB의 IO 비용은 중요해질 수 있습니다. 여기서 해결할 점은 실제로 작동 할 수있는 가장 단순한 것이 성능에 현저한 영향을 준다는 것을 알고 나면 LOB 데이터를 복사하는 횟수를 최소화하는 것입니다. 어떤 SQL 매개 변수 바인딩 스타일을 사용하여 생성 지점이나 사용 지점과 데이터베이스간에 직접 데이터를 전송할 수 있습니다. 이는 종종 LOB를 스트림 또는 I/O 채널에 바인딩합니다.

영향을 측정 할 수있는 방법이 있어야만 병목 현상을 나타내는 측정 값을 얻을 때까지는이 작업을 수행하지 마십시오.

관련 문제