일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Pending Intent
- 펜딩인텐트
- setDefaults(NotificationCompat.DEFAULT_ALL)
- notification manager
- 안드로이드 알림
- notifications
- 안드로이드 알림채널
- android notification 예제
- setContentIntent
- 알림 우선순위
- setPriority(NotificationCompat.PRIORITY_HIGH)
- 버전별 관리
- notification channel
- NotificationCompat.Builder
- 안드로이드 알림 예제
- 알림 인텐트
- Today
- Total
공부용 블로그
row-oriented/ column-oriented database 본문
Q. MySAM 이 셀렉트 속도가 빠르니까 vod_list 테이블을 select만 하도록 만들어서 MyIsam을 쓰고
변경이 있는 데이터(조회수 등) 테이블은 InnoDB 를 사용하면 어떻게 됨?
Q. 아무리 셀렉트만 하는 테이블이더라도 새로운 vod가 생기면 insert 발생. 그럴땐 어떡?
=> 그렇더라도 셀렉트 비율이 훨씬 높은경우 insert가 생기기 전까지 쿼리캐시를 활용할 수 있음
Q. full text indexing?
Q. MariaDB와 Percona의 용도?
MariaDB is better for advanced features, the latest security and adapting to new tech. Percona excels at database performance and diagnostics.
https://blog.appdynamics.com/engineering/what-you-need-to-know-about-the-mariadb-percona-forks-of-mysql/
mysql은 커뮤니티 버전(무료버전)이 쓰레드풀을 지원안함. 마리아디비는 지원함.
마리아는 xtraDB 에서 InnoDB로 변경. 이유는?
=> Keeping InnoDB (or XtraDB) up to date with MySQL (Percona) is a complex task. It took us more than half a year to migrate from InnoDB-5.6 to InnoDB-5.7 in 10.2. Doing it again for XtraDB would probably have required only slightly less than this. For us to embark on such project, it must bring significant benefits to our users.
XtraDB had many great improvements over InnoDB in 5.1 and 5.5. But over time, MySQL has implemented almost all of them. InnoDB has caught up and XtraDB is only marginally better. Not enough to justify a multi-month merge that would delay 10.2-GA for everyone.
In particular, the only real improvement that XtraDB 5.7 seems to have is for a write-intensive I/O-bound workload, where innodb_thread_concurrency control is disabled.
With a proper innodb_thread_concurrency, XtraDB is only marginally better. We didn't want to delay 10.2-GA by up to half a year for the sake of those few users who have write-intensive I/O-bound InnoDB workload and don't know how to configure innodb_thread_concurrency.
Note, we still consider incorporating XtraDB optimizations, but as patches, rather than XtraDB as a whole, which no longer has numerous all-over-the-code improvements.
https://mariadb.com/kb/en/library/why-does-mariadb-102-use-innodb-instead-of-xtradb/
모넷디비가 열기반인데 행기반 셀렉트하는 과정이 다름
* 행기반 데이터베이스
특정 행을 읽으려면 먼저 행의 위치를 결정해야 합니다.
행이 고정된 길이를 가진다면 이것은 쉽습니다. 하지만 실제로는 그다지 쉽지 않습니다.
varchar에서는 값의 길이가 가변적일 수 있습니다.
가변 길이 값을 사용하면 행이 어디에서 시작하는지 모르기 때문에 단순히 데이터 파일의 중간에서 점프 할 수 없습니다.
특정 행의 오프셋을 계산하려면 헤더에 저장된 레코드 길이를 사용해야 합니다. 이것은 헤더를 가로지르는 것을 의미합니다.
데이터 파일은 종종 페이지로 구성됩니다.
특정 행에 대한 데이터를 읽으려면 전체 페이지를 읽어야 합니다.
행이 작을수록 페이지에 더 잘 맞을 것입니다.
실제로는 페이지가 완전히 채워지지 않는 경우가 많습니다.
이렇게하면 페이지 분할이나 이동없이도 나중에 업데이트 할 수 있지만 (비싼 작업임) 공간을 많이 낭비 할 수 있습니다.
또한 행은 페이지에 맞춰야하며 부품은 사용하지 않고 남겨 둡니다.
row-oriented storage is good if we need to touch one row.
row-oriented storage is beneficial if all or most column of a row need to be read or written. this can be done with a single read/write.
row-oriented storage is very efficient if not all coulmn are needed but a lot of rows need to be read
full rows are read, including columns not used by a query.
read are done page-wise. not many rows may fit on a page when rows are big.
pages are nomally not fully filled which leads to reading lots of unused areas
record(and somtimes page) headers need to be read. too but do not contain actual row data.
행 지향 스토리지는 한 행을 터치해야하는 경우에 좋습니다.
행 지향 스토리지는 행의 모든 열 또는 대부분의 열을 읽거나 쓸 필요가있을 때 유용합니다. 이 작업은 단일 읽기 / 쓰기로 수행 할 수 있습니다.
행 지향 저장소는 모든 coulmn이 필요하지는 않지만 많은 행을 읽을 필요가있는 경우 매우 효율적입니다.
쿼리에서 사용되지 않는 열을 포함하여 전체 행을 읽습니다.
읽기는 페이지별로 수행됩니다. 행이 큰 경우 많은 행이 페이지에 적합하지 않을 수 있습니다.
페이지는 일반적으로 완전히 채워지지 않아 사용되지 않는 영역을 많이 읽습니다.
레코드 (및 somtimes 페이지) 헤더를 읽을 필요가 있습니다. 실제 행 데이터는 포함하지 않습니다.
row-oriented storage is especially inefficient when only a small amount of coulmns is needed but the table has many column.
example:need only 1 c1, but must read 2 pages to get just 3 values
we'd prefer getting 12 values with 1 read. this would be optimal
행 지향 스토리지는 특히 적은 양의 coulmns 만 필요하지만 테이블에는 많은 컬럼이 있을 때 특히 비효율적입니다.
예 : 1 c1 만 있으면되지만 3 개의 값을 얻으려면 2 페이지를 읽어야합니다.
우리는 1 개의 값으로 12 개의 값을 얻는 것을 선호합니다. 이것이 최적 일 것이다.
* 열기반 데이터베이스
column oriented databases primarily work on columns
all columns are treated indiviaully
this allows array processing the values of column
rows may be constructed from column values later if required
this means column store can still produce row output (table)
values from multiple coulmns need to be retreived and assembled for that, making implementation of bit more complex
query processors in columnar databases work on column too.
열 기반 데이터베이스는 주로 열에서 작동합니다.
모든 열은 개별적으로 취급됩니다.
이것은 배열이 컬럼의 값을 처리하도록 허용한다.
필요한 경우 나중에 행을 열 값으로 구성 할 수 있습니다.
이것은 열 저장소가 여전히 행 출력 (테이블)을 생성 할 수 있다는 것을 의미합니다.
여러 군데로부터의 가치를 수집하고 수집하여 좀 더 복잡한 구현을해야합니다.
열 데이터베이스의 쿼리 프로세서도 열에서 작동합니다.
column stores can greatly improve the performance of query of that only touch a small amount of columns.
this is becuase they will only access these column's particular data.
simple math : table t has a total of 10GB data with column a(4GB), column b(3GB), column c(2GB), column d(1GB).
if a query only use column d, at most 1GB of data will be processed by a column store.
in a row store, the full 10GB will be processed.
column stores store data in column-specific files
simplest case : one data file per column
row values for each column are stored continuously.
with every page read, we can read the values for many rows at once. we'll get more values per I/O than with row-storage.
this is ideal if we want to process most records anyway.
if values are fixed-length, we are also allowed random access to each record's value.
saving header information in the values file is undesired.
can save meta information separately, e.g. null bits as a bit vector per column.
모든 페이지를 읽을 때마다 한 번에 많은 행의 값을 읽을 수 있습니다. 우리는 행 스토리지보다 I / O 당 더 많은 가치를 얻을 것입니다.
대부분의 레코드를 처리하려는 경우에 이상적입니다.
값이 고정 길이이면 각 레코드의 값에 임의 액세스 할 수 있습니다.
값 파일에 헤더 정보를 저장하는 것은 바람직하지 않습니다.
메타 정보를 별도로 저장할 수 있습니다 (예 : 널 (null) 비트는 컬럼 당 비트 벡터입니다.
all data within each column datafile have the same type making it ideal for compression.
usually a much better compression factor can be achieved for single columns than for entire rows.
compression allows reducing disk I/O when reading/writing column data but has some cpu cost.
for data sets bigger than the memory size compression is often beneficial because disk access is slower than decompression.
각 열 데이터 파일 내의 모든 데이터는 동일한 유형이므로 압축에 이상적입니다.
일반적으로 전체 열보다 단일 열에 대해 훨씬 우수한 압축률을 얻을 수 있습니다.
압축을 사용하면 열 데이터를 읽거나 쓸 때 디스크 I / O를 줄일 수 있지만 CPU 비용은 약간 듭니다.
메모리 크기보다 큰 데이터 세트의 압축은 디스크 액세스가 압축 해제보다 느리기 때문에 종종 도움이됩니다.
a good use case for compression in column store is dictionary compression for variable length string values.
each unique string is assigned an integer number.
the dictionary, consisting of integer number and string value, is save as column meta data.
column values are then integers only, making them small and fixed witdh.
this can save much space if string values are non-unique.
with dictionaries stored by column value, this will also allow range queries.
컬럼 스토어에서의 압축을위한 좋은 유스 케이스는 가변 길이 문자열 값에 대한 사전 압축이다.
각 고유 문자열에는 정수가 할당됩니다.
정수형과 문자열 값으로 구성된 사전은 열 메타 데이터로 저장됩니다.
그런 다음 열 값은 정수로만 작고 고정 witdh가됩니다.
문자열 값이 고유하지 않으면 많은 공간을 절약 할 수 있습니다.
사전을 열 값으로 저장하면 범위 쿼리가 허용됩니다.
in a column database, it is relatively cheap to traverse all values of a column.
building an index on a column only requires reading that column's data, not the complete table data as in a row store.
adding or deleting columns is a relatively cheap operation too.
열 데이터베이스에서 열의 모든 값을 트래버스하는 것이 상대적으로 저렴합니다.
컬럼에 인덱스를 작성하는 것은 행 스토리지에서와 같이 전체 테이블 데이터가 아닌 해당 컬럼의 데이터를 읽는 것만을 요구합니다.
열 추가 또는 삭제는 상대적으로 저렴한 작업입니다.
column data in column stores is often grouped into segments/packets of specific size
meta data calculated and stored seperately per segment, e.g. - min value in segment
- max value in segment
- number of not null values in segment
- histograms
- compression meta data
열 저장소의 열 데이터는 종종 특정 크기의 세그먼트 / 패킷으로 그룹화됩니다
세그먼트별로 계산되고 저장되는 메타 데이터입니다
(예 : - 세그먼트의 최소값
- 세그먼트의 최대 값
- 세그먼트의 null이 아닌 값의 수
- 히스토그램
- 압축 메타 데이터
* column-oriented storage, segments
segment meta data can be checked during query processing when no indexes are available.
segment meta data may provide information about whther segment can be skipped entirely, allowing to reduce the number of values that need to be processed in the query
calculating segment meta data is a relatively cheap operation (only needs to traverse column values in segment) but still should occur infrequently
in a read-only or read-mostly workload this is tolerable
인덱스가 사용 가능하지 않을 때 쿼리 처리 중에 세그먼트 메타 데이터를 검사 할 수 있습니다.
세그먼트 메타 데이터는 전체 세그먼트를 건너 뛸 수 있다는 정보를 제공하여 쿼리에서 처리해야하는 값의 수를 줄입니다.
세그먼트 메타 데이터를 계산하는 것은 상대적으로 비용이 적게 드는 작업이지만 세그먼트에서 열 값을 트래버스해야하지만 드물게 발생해야합니다.
읽기 전용 또는 대부분 읽기 작업 부하에서 이것은 허용 가능합니다.
* column-oriented processing
column values are not processed row-at-a-time, but block-at-a-time.
this reduces the number of function calls (function call per block of values, but not per row)
operating in blocks allows complier optimisations, e.g. loop unrolling, parallelisation, piplining
column values are nomally positioned in contiguous memory locations, also allowing SIMD operations (vertorisation).
working on many subsequent memory positions also improves cache usage (multiple values are in the same cache line) and reduces pipeline stalls
all of the above make column store ideal for batch processing.
-----------------------------------------------------------------------------------------------------------------
독일 맥주 양조장에 대한 5 년간의 회계 처리를 한 실험에서이 테이블의 튜플 수는 3,400 만입니다. 기본 행 데이터베이스에서이 특정 테이블의 1 백만 개의 튜플은 약 1GB의 공간을 사용합니다. 따라서 테이블의 크기는 35GB였습니다. 컬럼을 따라 더 효율적인 수직 압축이 있었기 때문에 동등한 컬럼 스토어 테이블 크기는 8GB 밖에되지 않았습니다. 실제 응용 프로그램에서 단일 테이블의 특성 중 10 %만이 일반적으로 하나의 SQL 문에서 사용된다는 것을 고려하면 (그림 1 참조), 이는 총 값을 계산하기 위해 최대 800MB의 데이터를 액세스해야한다는 것을 의미합니다.
그림 2는 수평 압축 된 행 저장소가 경쟁 할 수 없다는 것을 (개략적으로) 보여줍니다. 처리가 세트 지향이며 열 조작이 필요한 경우 적절한 색인을 사용한다고해도 액세스되는 데이터의 양은 훨씬 더 많습니다.
(Row) 튜플 기반 테이블로 구성되며 단일 튜플은 여러 개의 열(Column, 이하 컬럼)로 구성된다. 질의에 의해 요청된 특정 컬럼에 접근하기 위하여 각 튜플의 오프셋 (헤더로부터 해당 컬럼까지의 거리)이 계산되어야 한다.
오프셋은 목표 컬럼에 선행하는 컬럼의 길이를 총합하여 구할 수 있다. 컬럼의 길이정보가 컬럼 헤더에 존재하는 경우, 목표 컬럼에 선행하는 다른 컬럼에 직접 접근하게 된다. 이러한 방식은 튜플의 길이가 수 개의 캐시라인에 이를 경우 불필요한 컬럼 데이터를 캐 시에 불러오는 상황을 발생 시킨다.
(=> 컬럼의 위치에 따라 읽기/쓰기 속도가 달라질수도 있을까?)
최악의 경우 가장뒤의 컬럼 하나에 접근하기 위해 튜플 전체가 캐시에 로드 될 수 있다.
몇 가지 흥미로운 트레이드가 있습니다.
워크로드의 액세스 패턴에 따라 열 기반 또는 행 지향 실제 레이아웃이 더 적합한 지 여부를 지정합니다.
데이터가 자기 디스크에 저장되면 쿼리가 단일 레코드 (즉, 테이블의 단일 행 속성 전체 또는 일부)에만 액세스해야하는 경우에는 열 저장소가 여러 번 검색해야합니다. 참조 된 테이블의 열 / 파일 쿼리에서)이 단일 레코드를 읽습니다.
그러나 쿼리가 많은 레코드에 액세스해야하는 경우, 그러면 전체 열의 넓은 범위를 읽을 수 있고 검색을 다른 열로 나누어 쓸 수 있습니다. 대조적으로, 기존의 행 저장소에서는 쿼리가 단일 레코드에 액세스 해야 하는 경우 전체 레코드가 연속적으로 저장되기 때문에 하나의 검색 만 필요하고 레코드의 모든 특성을 읽는 오버 헤드가 발생합니다. 현재 쿼리에서 요청한 속성)은
탐색 시간에 비하면 무시할 만하다.
그러나 점점 더 많은 기록 액세스 시간, 전송 시간이 탐색 시간을 지배하기 시작하며,
열 지향 접근법은 행 지향적 접근보다 더 나은 성능을 발휘합니다.
접근. 이러한 이유로 열 저장은 일반적으로 분석에 사용됩니다
응용 프로그램, 개별 테이블의 많은 부분을 스캔하는 쿼리
그들에 대한 집계 또는 기타 통계를 계산할 수 있습니다.
'설계 > RDBMS' 카테고리의 다른 글
MonetDB 설치 (0) | 2018.12.15 |
---|---|
MonetDB Architecture (0) | 2018.12.13 |
RDBMS 벤치마크 서버컴 환경세팅 (mysql 5.7) (0) | 2018.12.09 |
percona 테스트 진행 중 오류 (0) | 2018.12.08 |
percona 설치 및 jmeter 세팅 / ubuntu 16.04 (0) | 2018.12.08 |