RailsConf 2019 – Optimizing your app by understanding your PostgreSQL database by Samay Sharma

(밝은 팝 음악) -이 이야기는 앱 최적화입니다 Postgres 데이터베이스를 이해하면됩니다

제목에서 알 수 있습니다 내가 원했던 것 이 이야기에서 우리는 문제를 다룰 것입니다 당신은 응용 프로그램 사용자의 얼굴, 그들이 성과에 관하여 만드는 불평, 내 쿼리가 느리다는 말 또는 응용 프로그램 개발자로서 어떤 문제가 발생했는지 이해하기 응용 프로그램이 느린하고 다시 묶어 Postgres 데이터베이스에 저장합니다 그래서, Postgres가 당신에게주는 통계의 종류는 무엇입니까? 그래서 당신은 정확히 무슨 일이 일어나는지 알아낼 수 있습니다 무엇이 잘못 되었습니까? 그리고 그것을 고치는 법도 있습니다

그래서, 나 자신에 대해 조금 나는 사 메이다 나는 Citus의 엔지니어로 일하고 있습니다 Citus는 기본적으로 오픈 소스 확장 기능입니다 여러 컴퓨터에서 Postgres를 수평 확장 할 수 있습니다

그래서, 여러분이 단일 노드 Postgres 데이터베이스를 가지고있을 때 성능 문제가 발생하기 시작합니다 따라갈 수없는 당신이 싣고있는 작업 부하의 양과 함께, Citus를 사용하여 여러 서버로 확장 할 수 있습니다 저는 솔루션 엔지니어 팀을 관리합니다 그래서 우리가하는 일은 고객과 함께 일하는 것입니다 우리에게 오는 응용 프로그램 개발자 그들의 응용에 문제가있다

성능 관점에서, 확장 성 관점에서 그리고 그들은 그들의 데이터베이스를 키우기를 원한다 몇 테라 바이트, 수십 테라 바이트, 계속하는 동안 수백 테라 바이트 Postgres의 모든 이점을 유지합니다 그래서 저는 고객들과 함께 도움을줍니다 그들은 그들의 응용 프로그램을 모델링하고, 그들에게 데이터 모델링 등에 관한 권고안을 제시한다 데이터베이스를 확장하는 데 도움이됩니다

나는 나 자신에 관한 재미있는 사실을 포함하고 싶다 내 모든 슬라이드에 최근에 결혼 했어 약 4 개월 전 어떤 사람들은 나에게 재미있는 사실이라고 말하고있다 지금은 잠시 후 재미있는 사실이 아닐 수도 있습니다

(청중 웃음) 그래서 우리는 그것이 얼마나 재미있는지를 보게 될 것입니다 앞서 언급했듯이, Citus는 오픈 소스이며, 당신은 실제로 GitHub citusdata / citus에 갈 수 있습니다 그리고 우리를 그냥 주저하지 Citus에 대해 더 자세히 알고 싶다면, 나는 회의에서 주변에있을거야 우리는 그것에 대해 대화 할 수 있습니다

그러나이 이야기는 Citus에 관한 것이 아닙니다 이 이야기는 주로 Postgres에 관한 것입니다 제가 적용 할 얘기가 뭐든간에, 그것의 모두는 당신의 정상적인 Postgres 데이터베이스에 적용됩니다 그래서 때로는 당신이 직면하는 도전 각 문제와 관련이있다 데이터베이스 내에서 무슨 일이 일어나고 있는지

따라서 애플리케이션 관점에서 느린 쿼리가 표시 될 수 있습니다 또는 사용자가 올 수도 있습니다 내 앱 페이지가 가능한 빨리 로딩되지 않는다고 말하면, 등등 당신은 모니터링 도구 또는 귀하의 디버깅 등등, 문제가 데이터베이스에 있다는 것을 알 수 있습니다 데이터베이스가 느려짐의 원인입니다 자, 어떻게 그 문제가 무엇인지 발견합니까? 근본 원인을 어떻게 묶어 줍니까? 그리고 어떻게 그 문제를 해결할 수 있습니까? 그 문제를 해결하는 가장 간단한 방법 Postgres가 공개하는 통계를 사용하고 있습니다

그래서 Postgres는 실제로 많은 통계를 캡처합니다 ANALYZE를 실행할 때 데이터에 대해 또는 Postgres가 자동으로 ANALYZE를 실행하면, 그것은 많은 통계를 포착하려고합니다 귀하의 데이터에 대해 말하자면, 사용자가 이것을 필터로서 입력하는 경우, 선택도 비율은 어떻게 될 것인가? 따라서 모든 열에 대한 데이터를 추적합니다 또한 데이터베이스에 대해서도 마찬가지입니다 그것은 또한 당신에게 노출됩니다

활동에 대한 데이터를 수집하고이를 사용자에게 노출합니다 나는 통계를 여기에서 모니터링하는 것으로 버킷으로 만들고있다 기본적으로 쿼리 란 무엇입니까? 지금 시스템에서 실행 중입니까? 얼마나 많은 연결이 데이터베이스에 들어 옵니까? 어떤 인덱스가 사용되고 있습니까? 어떤 인덱스가 사용되고 있지 않은가? 얼마나 많은 IO가 수행되고 있습니까? 모든 정보가 실제로 캡처됩니다 Postgres 내의 다른 테이블에서 당신에게 노출되면 당신은 그것들을 정규 표로 질문한다 필요한 정보를 얻으십시오

그리고 몇 가지 관리 통계가 있습니다 관리 서비스를 사용하는 경우 당신은 그들에 대해 조금 신경을 써야합니다 하지만 당신은 관리 서비스 공급자 서버 관리 통계에 신경을 써야합니다 복제는 어떻게 유지됩니까? 데이터베이스의 크기는 얼마입니까? 다른 테이블의 크기는 얼마입니까? 이렇게 자, 내가하려고 할 것은 시작부터 시작하는 것입니다

매우 일반적인 문제, 즉 내 응용 프로그램이 느리다 그리고 모든 사람들이 매번 그 느낌을 갖게 될 것이라고 확신합니다 나는 아무도 말한다라고 생각하지 않는다, 나의 신청은 훌륭하다 항상 빠릅니다 그래서 우리는 그 문제부터 시작할 것입니다

우리가 데이터베이스에 묶여 있다는 것을 알아 냈다고 가정 해 봅시다 우리는 어떻게 거기에 도착합니까? 그래서, 문제는, 내 응용 프로그램이 느립니다 증상, 응용 프로그램 사용자 느린 성능에 대해 불평하고 있습니다 어떤 모니터링 도구를 사용하든, 그것은오고 대부분의 시간을 지적한다 데이터베이스 호출이 진행 중입니다

어쩌면 일정량의 데이터베이스 호출 일 수도 있습니다 어쩌면 그것은 데이터베이스 전체 일 것입니다 그리고 그들이 로딩하고있는 페이지가 무엇이든간에, 모든 것이 천천히 진행되고 있습니다 그리고 당신의 페이지는 만들고 있습니다 수백 개의 데이터베이스 호출을 가정 해 봅시다

어떤 쿼리가 느린 지 알지 못합니다 당신은 정확히 무슨 일이 벌어지고 있는지 모른다 그래서, 어떻게 거기에서 시작합니까? 좋은 출발점 데이터베이스 캐시 적중률을 조사하는 것입니다 따라서 캐시 히트 비율은 실제로 어떤 비율입니까? 얼마나 많은 검색어를 캐시에서 서비스되고 있습니다 대다수가 그것으로부터 오는 것인가, 디스크에서 읽어야한다고 가정 해 봅시다

느낌을 얻는 좋은 방법입니다 데이터베이스가 있어야하는 위치와 데이터베이스가 꺼져있는 위치 거래용 앱의 경우 실제로 원하지 않는 가장 일반적인 작동을 위해 디스크를 쳤을 때, 그래서 당신은 95 % 이상이되고 싶습니다 이상 적으로 캐시 적중률 99 % 또는 귀하의 트랜잭션 애플 리케이션을위한 이제 응용 프로그램에 따라, 애널리틱스 애플리케이션이있는 경우 어디 실제로 저장하는, 10 테라 바이트의 데이터를 가정 해 봅시다

10 테라 바이트의 메모리를 사는 것은 비쌀거야 캐시 히트 비율을 낮추는 것이 좋습니다 하지만 일반적으로 트랜잭션 애플리케이션의 경우는 그렇지 않습니다 자, 질문은, 어떻게 이것을 측정합니까? 어떻게 내가 그걸 지켜 볼 수 있니? 이 연설을 통해 나는 몇 가지 Postgres 테이블을 다룰 것이다 다른 정보가 무엇인지를 통해 이야기하십시오

그들이 제공 할 수있는 방법을 차례로 사용할 수 있습니다 응용 프로그램 성능을 향상시킵니다 pg_statio_user_tables에서 배울 수있는 간단한 쿼리 이건 내가 이야기 할 테이블 중 하나야 얼마나 많은 힙 블록을 읽었는지 계산합니다

전문 용어 관점 힙은 실제로 Postgres가 데이터를 저장하는 곳입니다 인덱스는 인덱스입니다 그래서 그들은 반드시 힙의 일부가 아닙니다 내가 힙 블록을 읽을 때 기본적으로 얼마나 많은 블록을 읽었는가? 힙에서 몇 블록을 맞았습니까? 그리고 그 비율, 블록의 수가 너무 많아서 숫자로 나눈 힙 + 읽기, 종류는 당신에게 비율을 준다

그래서 당신은이 비율을 보았습니다 그것은 pg_statio_user_tables를 사용하고있다 이 데이터의 출처로 테이블이 포착하는 정보를 살펴 보겠습니다 이 테이블의 예제 행에 불과합니다 내가 만든 테이블 중 하나에서

그래서, 테이블의 이름은 무엇입니까? 이드는 뭐니? 스키마 란 무엇입니까? 나는 그게 전부라고 생각합니다 단지 표준적인 것입니다 힙에 대한 정보를 유지한다는 것을 알 수 있습니다 또한 인덱스에 대한 정보를 유지합니다 색인 블록을 읽은 횟수를 알려줍니다 Postgres 버퍼 캐시에서 대, 그것은 버퍼 캐시에서 해당 레코드를 찾을 수 없습니다 그래서 그 기록을 읽어야했습니다

테이블 히트 비율을 얻는 것 외에도 이 테이블에서 인덱스 적중률을 얻을 수도 있습니다 어쩌면 인덱스가 메모리에 맞지 않을 수도 있습니다 그게 당신이 풀어야 할 문제입니다 이들 둘 모두에 따라, 이 테이블에서 그 정보를 찾아 낼 수 있습니다 토스트와 같은 다른 정보도 있습니다

토스트 (Toast)는 매우 큰 기둥이있는 경우입니다 Postgres는 실제로 그들을 압축합니다 별도의 장소에 보관합니다 그래서 그것에 대해서도 측정 할 수 있습니다 거대한 JSON BLOB가 있다고 가정 해 보겠습니다 당신이 Postgres 테이블에 그리고 너는 알아 내고 싶어

디스크에서 읽는 것이 주요 병목입니다 이걸 알아 내면 비율을 구할 수 있습니다 그들 중 어떤 사람이이 문제를 일으키는 지 확인하십시오 캐시 적중률이 낮다는 것을 아는 것만으로도, 캐시 히트 비율이 낮다고 가정 해 봅시다 실제로 많은 것을 의미 할 수 있습니다

그게 네가 할 수있는 것이 아니라는거야 버퍼 캐시에서 작업 부하를 제공하는 방법 하지만 왜 디스크에 갈 필요가 있니? 그리고 그것으로 가능한 문제점은 무엇입니까? 여러 가지 원인이있을 수 있습니다 처음 두 점은 팽창과 자동 진공에 대해 이야기합니다 얼마나 많은 사람들이 자동 진공관에 익숙합니까? 좋아요 기본적으로 Postgres에서 행을 업데이트하거나 삭제할 때마다, Postgres는 반드시 동시에 삭제하지 않습니다

행에 표시되지 않는 것으로 표시합니다 거래를 시작하자 거래 후 그리고 나서 진공이라는 프로세스가 있습니다 와서 모든 행을 정리합니다 그리고, Postgres에는 자동 진공 장치가 있습니다

자동으로 트리거됩니다 수동으로 진공을 트리거 할 수 있습니다 말하자면 모든 행을 정리하자 더 이상 사용되지 않는 하지만 기본적으로 Postgres에는 자동 진공 장치가 있습니다 당신은 그것을 공격적으로 조정할 수 있습니다

또는 덜 공격적이어야합니다 그리고 나서, 당신의 자동 진공관이 충분히 잘 조정되지 않았습니다 그래서 늙은 행을 정리하지 않는거야 그래서 당신은 매우 나쁜 히트 비율을 얻고 있습니다 귀하의 캐시에서

실제로 Bloat은 사용되지 않은 데이터의 덩어리입니다 그것은 일반적으로 부 풀리는 것으로 알려져 있습니다 그래서 당신은 말할 것입니다, 좋아요 테라 바이트의 데이터는 200GB에 불과할 것입니다 실제로 사용할 수있는 데이터입니다

그것의 나머지는 단지 autovacuum이 그것을 깨끗하게 할 수 없다는 것입니다, 그래서 800 기가는 부 풀릴뿐입니다 그리고 그걸 정리하면 많은 공간을 절약 할 수 있습니다 관련 데이터 만 메모리에 저장해야합니다 쿼리가 최적화되지 않았을 수 있습니다 그리고 순차적 스캔을 많이하고 있습니다

Postgres가 데이터를 스캔하는 방법, 일반적으로 순차 스캔 또는 인덱스 스캔 데이터베이스에 인덱스가있는 경우 인덱스를 사용하여 행을 검색합니다 검색어에 대한 관련 행만 이벤트를 저장하는 테이블이 있다고 가정 해 보겠습니다 타임 스탬프에 인덱스를 만들면 마지막 날에 대한 쿼리를 실행하면 Postgres는 해당 색인을 사용합니다 마지막 날의 결과 만 반환하는 것 나머지 데이터는 스캔하지 않습니다 색인을 적절하게 작성하지 않은 경우, 어쩌면 당신은 단지 스캔하고 있습니다 항상 전체 데이터베이스 훨씬 더 정확한 쿼리가 필요합니다

대부분의 프레임 워크는 기본 키를 생성합니다 기본 색인 만 하지만 더 복잡한 쿼리를 수행하는 경우 스스로 색인을 작성해야 할 수도 있습니다 그 문제의 다른 측면은 어쩌면 사용하지 않은 색인이 많이있을 수도 있습니다 그래서 당신은 Postgres가 필요로하는 많은 인덱스를 가지고 있습니다 행을 삽입 할 때마다 포스트그레스는 그 행을 삽입해야합니다

테이블에있는 모든 색인에 네가 많은 걸 가지고 있고 그들이 사용되지 않는다면 전체 데이터 양을 늘릴 수 있습니다 당신은 당신의 데이터베이스에 있습니다 그런 다음 올바른 쿼리에 사용할 수 없게됩니다 다시 말하지만 단일 노드 Postgres를 최대한으로 최적화하려고 시도하십시오 그 이후에 대해 생각하고 싶다면 Citus를 사용하여 샤딩 또는 스케일 아웃 그게 말이되는 때입니다

성능 문제가 발생하는대로 제안하지 않겠습니다 더 많은 하드웨어를 구입하십시오 그리고 그 문제를 해결하려고 노력합니다 네가 할 수있는 일이있다 그러나 한 지점이 지나면 어려워진다

Postgres를 조정하고 볼 수 있습니다 Citus와 같은 다른 기술로 확장 할 수 있습니다 나는 3 개 또는 4 개의 테이블을 파헤 칠 것이다 실제로 도움이 될 것입니다 이 문제들 중 어느 것이 우리 데이터베이스에서 계속되고 있는지

우리는 표준 하나부터 시작할 것입니다 전체 데이터베이스를 포함 이것은 pg_stat_database라고 불린다 다시 한 번 특정 행을 선택했습니다 이 데이터베이스에 대해 그것은 꽤 많은 정보를 제공합니다

백엔드 수, 데이터베이스 이름, 데이터베이스 ID 여기에서 더 중요한 분야 트랜잭션 커밋, xact 커밋 및 xact 롤백 그래서 그것은 얼마나 많은 트랜잭션을 알려줍니다 커밋 된 및 데이터베이스에서 롤백 된, 얼마나 많은 블록이 읽혔는지 알려줍니다 얼마나 많은 블록이 맞았는지 비교합니다 우리는 그 정보를 보았습니다 또한 얼마나 많은 튜플이 있는지 알려줍니다

귀하의 데이터베이스에 삽입, 업데이트, 삭제되었습니다 당신이 많이있을 수도 있습니다 너는 묻는 사람들에 대해 들었을 것이다 너는 좋아, 너의 질문은 너의 데이터베이스 야 삽입 무거운 데이터베이스? 많은 업데이트가 있습니까? 당신은 많은 삭제를합니까? 이러한 질문에 대한 답을 찾으려면, 당신은 여기 올 수 있고 실제로 통계를 얻을 수 있습니다

무엇에, 기본적으로 그 질문들에 대한 답은 무엇입니까? 유스 케이스는 무엇입니까? 일반적으로이 테이블을 사용합니다 for는 가져온 행 수를 찾습니다 데이터베이스에 대한 쿼리에 의해 반환됩니다 자,이 두 용어는 서로 다릅니다 Postgres는 사실이 컬럼들을 약간 재미있게 이름 지었다

하지만 반환 된 튜플을 보면 실제로 얼마나 많은 튜플이 리턴되었는지입니다 그리고 나서 가져온 것은 실제로 얼마나 많은가? 쿼리를 렌더링하는 데 필요한 그래서, 아마도 많은 쿼리를 반환했을 것입니다 하지만 당신은 좋은 지표가 없었어요 불필요하게 많은 행을 반환했습니다 이 비율은,이 특별한 경우를 보면, 당신은 볼 수 있습니다, 나는 0의 숫자가 무엇인지 모르겠다

3 억 6,700 만 명이 튜플을 가져 왔다고 생각합니다 675가 반환되었습니다 그래서 튜플의 반은 실제로 반환되었습니다 그것들은 반환 될 필요가 없었다 그래서 당신은 예를 들어 그것에 인덱스를 넣어서

또 다른 예는 데이터베이스의 삽입, 갱신, h 제 비율 벤치 마크를 할 때, 특정 병목 지점을 찾으려고 할 때, 당신은 알아 내고 싶어합니다 좋아, 내가 삭제 작업량을 조정해야합니까? 삽입 파이프 라인을 조정해야합니까? 업데이트를 조정해야합니까? 이 비율을 찾는 것이 도움이됩니다 그리고 분명히 처리량을 얻을 수 있습니다 어떤 처리량을 찾고 있습니까? 어떤 보장을 하시겠습니까? 귀하의 응용 프로그램 사용자에게? 그리고, 당신을 제공 할 수있는 데이터베이스는 무엇입니까? 그래서, xact 커밋을 보면 너는 알아낼 수있을거야

얼마나 많은 커밋, 얼마나 많은 트랜잭션 이 통계를 재설정 할 수 있습니다 그래서 더 정확한 숫자를 원한다면 특정 날이나 무언가를 위해 이 통계를 재설정 할 수 있습니다 그런 다음 다시 가져 오십시오 이것은 전체 데이터베이스를위한 것이 었습니다 지금 일반적으로 이것은 당신에게 좋은 아이디어를 준다

찾을 곳 그러나 그것은 충분하지 않습니다 내가 너에게 말하면, 알았어 거래가 많다 귀하의 데이터베이스에서 계속, 그건별로 말하지 않습니다 거기에 일부 문제는 처리량, 너 알아 내고 싶어, 알았어

내 작업 부하 중 어느 부분이 원인입니까? 다른 테이블 세트가 있습니다 테이블 정보를 제공합니다 이것은 pg_stat_user_tables라고 불립니다 열이 많아서 읽을 시간이 조금 부족합니다 그러나 더 중요한 것들은 여기에있다

얼마나 많은 시간을 알려주지? 순차적 스캔을 시작했습니다 그 테이블에 몇 번 대 스캔을 시작하고 색인화합니다 그리고 얼마나 많은 튜플 각각을 읽어야 만했는지 그래서, 그것은 매우 유용한 정보입니다 색인이 필요한지 아닌지, 당신이 있다면, 나는 때때로 개발자들과 이야기를 나눴습니다

그들은 좋아, 실제로, 내 데이터베이스와 같다 순차적 스캔을해서는 안됩니다 우리는 한 번에 5 행 이상을 스캔하지 않습니다 그런 다음 우리는 데이터베이스에 간다 그리고 매우 다른 경우 데이터베이스의 그림

데이터베이스는 항상 순차적 스캔을 수행합니다 왜냐하면 당신이 5 열을 요구하고 있기 때문에, 데이터베이스에 알려주는 색인이 없을 수도 있습니다 5 개의 행을 스캔하면됩니다 당신에게 그 정보를 얻기 위해서 그것이 당신에게 말해주는 다른 것은 튜플의 수입니다

삽입, 업데이트, 삭제됨, 다시 비슷한 통계 테이블 기준 라이브 튜플의 수, 죽은 튜플의 수, 저것은 부 풀리는 곳과 자동 진공관이 오는 곳입니다 이것은 매우 깨끗한 데이터베이스였습니다 그래서 그것은 가지고 있지 않으며 죽은 튜플 하지만 아마도 그럴 일은 없을거야 이걸 데이터베이스에서 실행할 때

죽은 튜플의 수는 기본적으로 더 이상 사용할 수없는 튜플 그러나 Postgres는 그들을 정리하려고하지 않았습니다 그렇게하면 부 풀릴 생각이 생기므로, 부 풀리는 Postgres를 검색하면 매우 복잡한 쿼리가 생성됩니다 기본적으로이 표와 같이 너에게 저 정보를 줄 광고 몇 다른 테이블 기가 바이트 또는 테라 바이트의 관점에서, Postgres 데이터베이스에 얼마나 부 풀었습니까? 테이블 등으로 무너지고, 정확한 질문을하고 싶지 않았습니다 너희들이 관심이 있다면 유용한 쿼리를 추가 할 수 있습니다 슬라이드 부록에 그래서 당신들은 복사, 붙이기, 실행 만 할 수 있습니다

귀하의 데이터베이스에 유용하고 있는지 확인하십시오 그리고, 그것은 또한 여러분에게 마지막 진공 상태를 보여줍니다 자동 진공, 마지막 분석, 자동 분석, 그래서 내가 말했듯이 Postgres에는 자동 진공 장치가있다 가끔씩 올라 오는 실제로 진공을 실행하고 데이터베이스를 분석합니다 진공 청소기는 팽창을 청소하는 것입니까? 분석 대상은 통계를 캡처하는 것입니다

쿼리에서 이러한 통계를 사용할 수 있습니다 그 정도면 충분하지 않다면 또는 당신이 괜찮은 느낌이 든다면, 내 자동 진공관처럼 충분히 조정해야합니다 그 모든 부 풀기를 제거하기 위해, 아마도 그렇지 않다 알다시피, 17 일, 좋아, 내가 씨앗 데이터베이스 어디서 같은, 1 년 동안 테이블에 자동 진공이 공급되지 않았습니다 데이터베이스 크기는 2TB이고, 진공 상태가되면 700 기가가됩니다

일반적으로 이것은 발생하지 않을 것이며, 이것은 또한 극단적 인 경우이다 하지만 기본적으로 Postgres autovacuumes 당신의 테이블이 20 % 바뀌었다 일반적으로 충분하지 않은 기본값입니다 대형 데이터베이스의 경우 데이터베이스에 10 억 개의 행이 있다고 가정 해 보겠습니다 너까지 기다리고있어

당신은 2 억 행의 부 풀림을합니다 실제로 그것을 치우기 위해 그것은 사실이 아닐 수도있다 대부분의 내가 이야기하는 Postgres 사용자는 큰 데이터를 가지고 있으며, 그래서 그들이 Citus를보고 있습니다 이러한 문제는 매우 자주 발생합니다 네가 가질 때, 아주 자주 와라

큰 데이터베이스가있을 때 Pg_stat_user_tables, 당신은 무엇을 할 수 있습니까? 대략의 라이브, 데드 튜플 수 당신에게 얼마나 부 풀리는지를 알려줍니다 표가 삽입, 갱신, 삭제 여부를 확인하십시오 실제로 우리에게는 본질적으로, 그들의 작업 부하의 60 % 이상이 업데이트되었습니다 그리고 나서 그것은 막 온 것입니다

앱의 한 문장에서 그들은 마치 "이 업데이트가 있다는 것을 알았 더라면 주요한 문제이다 " 그들은 작업량을 약 90 %까지 줄일 수있었습니다 앱 핵심 부분 만 수정하면됩니다 업데이트 횟수를 줄입니다 당신이 당신의 기대치를 당신의 데이터베이스에서 찾아낸다면

나는 좋아, 나는 많은 질문을하지 않을 것이다 때로는 활성 레코드가 당신을 위해 쿼리를하고있을 수도 있습니다 그리고 당신은 깨닫지 못할 수도 있습니다 코드를 특정 방식으로 작성한 것 데이터베이스에서 훨씬 더 많은 트래픽을 발생시킵니다 분명히 autovacuum, autoanalyze, 너의 테이블이 있는지 알아봐

충분히 진공 청소기로 채워지는지 여부 그리고 이것은 정말 유용하다고 생각합니다 순차 스캔 수와 인덱스 스캔 수입니다 트랜잭션 형 앱의 경우 순차 스캔 일반적으로 필요한 경우가 아니면 전체 데이터 세트에서 분석을 수행하고 있습니다 다수의 순차적 스캔을 볼 경우 깃발을 들어야합니다 인덱스에 대해서도 비슷한 통계가 있습니다

색인, 색인 스캔이 있습니다 해당 테이블에서 인덱스 스캔을 몇 번 시작 했습니까? 일반적으로 당신은 쓰기 문제가 많습니다 쓰기 처리량이 충족되지 않습니다 당신은 많은 색인을 가지고 있기 때문에, 테이블에 15 개의 인덱스가 있습니다 너가 가서 얼마나 많은 것을 보았을 때

이러한 인덱스 중 사용중인 당신은 그들 중 7 명이 심지어 사용되지 않는다는 것을 깨닫는다 귀하의 질문에 의해 인덱스는 항상 저장 공간간에 균형을 유지합니다 쓰기 처리량 및 읽기 처리량을 제공합니다 그리고 그것이 의미가있는 시점이 있습니다

실제로 비용을 들여 인덱스를 생성한다 드라이브 속도 저하 그러나 당신이 모든 것에 단지 색인을 가지고 있다면 실행할 수있는 쿼리 실제로 데이터베이스가 손상됩니다 도움이되는 것 이상 아마도 불필요한 부분이 많이 생기기 때문입니다 데이터베이스에 계속 씁니다 그것은 가장 유용한 것들입니다

다시 말해서, 튜플을 읽거나 튜플을 반입했다는 것을 알려줍니다 이것은 완벽한 지표였습니다 그래서 당신이 읽을 필요가있는 것을 독서하는 것 하지만 때로는 쿼리를 실행하는 경우 3, 4 개의 필터 당신은 그들 중 하나에 대해서만 색인을 가지고 있습니다 그럼 당신은 차이점을 발견 할 것입니다 이것들과 인덱스가있는 것을 보면 그냥 너무 많은 행을 읽고있다

그것이 필요한 많은 것보다, 더 구체적인 색인으로 만들 수 있습니다 그것을 복합 색인으로 만들어서 두 개의 열 또는 세 개의 열로 구성됩니다 그것들은 pg_stat_user_indexes입니다 자, 우리가 처음에 해결했던 문제로 되돌아 와서, 이는 캐시 적중률이 좋지 않음을 나타냅니다 실제로 정보를 사용할 수 있습니다

이 세 가지 모두에서 테이블과 더 많은 것들이 있습니다 하지만이 3, 4 가장 좋은 출발점이다 눈부신 모든 문제를 발견 한 곳 어떤 것이 있다면 왜 그랬는지 이해합니다 당신은 나쁜 타격 률을 보였습니다 그래서, 실제로, 나는 응용 패턴을 말해야합니다

하지만 당신은 데이터베이스 패턴을 본다 애플리케이션 측면과 일치하지 않는 그래서 많은 업데이트를하지 말아야한다고 생각합니다 하지만 그것은 당신의 데이터베이스 메인 워크로드를 밝혀냅니다 알았어, 나는이 테이블을 생각해 작아야한다, 나는 그것이 너무 크다는 것을 깨닫는다

이 테이블에 죽은 줄을 써서는 안됩니다 그래서 이것은 당신이 가정을 점검하는 데 도움이됩니다 더 깊이 들어가서 고칠 수 있습니다 부 풀리는 것이 많으면, 당신의 더 큰 테이블 인 테이블이 있습니다 그러나 그들은 매우 적은 진공 청소기로 청소됩니다

실제로 자동 진공관을 튜닝 할 수 있습니다 변경의 2 %에서 트리거합니다 당신은 내 테이블의 2 %가 바뀌면, 테이블에 진공을 일으킨다 이것은 매우 유용합니다 실제로 대형 테이블의 경우 약 2 %를 권장합니다

그래서 당신은 그것으로 시작할 수 있습니다 실제로 증가시킬 수도 있습니다 autovacuum이 사용하고있는 프로세스의 수 그것은 당신이 할 수있는 또 다른 일입니다 그래서 자동 진공이 충분히 빈번하게 시작됩니다

그러나 그것은 변화의 속도를 따라 잡을 수 없습니다 그런 다음 더 많은 코어를 제공해야 할 수도 있습니다 유지하려면 자동 진공 장치에 연결하십시오 어쩌면 순차적 스캔을 많이하고있는 것일 수 있습니다 그게 문제라면 몇 가지 색인을 만들어야합니다

어쩌면 불필요한 색인이 많이있을 수도 있습니다 나는 3 가지를 함축하고 4 가지를 함축하려하지 않는다 모든 것이 있지만 일부는 있을지도 모른다 불필요한 항목을 삭제할 수 있습니다 좋은 성능을위한 색인

이 모든 것들은보다 일반적이며, 나는 특정 쿼리를 보지 않는다는 것을 의미한다 특정 검색어를 최적화하지 않고 그래서 이것은 일반적으로 시작하는 데 유용합니다 그런 다음 좋아하기 시작합니다 좋습니다, 이것들이 문제의 종류입니다 하지만, 당신이이 일을 너는 좋은 색인을 가지고있다

또는 캐시 적중률이 낮아서 성능이 저하 될 수 있습니다 특정 쿼리가 충분히 잘되고 있습니다 특정 검색어는 여전히 실적이 좋지 않습니다 특정 웹 페이지가 여전히 느립니다 어떻게 분리합니까, 느린 쿼리는 무엇입니까? 이것은 pg_stat_statement와 같습니다

그 질문에 대한 답입니다 그리고 그것은 실제로 내 동료 중 하나입니다, Claire는 FOSDEM에 있었고 가장 일반적인 조언이었습니다 기본적으로 pg_stat_statements를 사용합니다 그래서 pg_stat_statements는 무엇을 하는가? Postgres의 확장 기능입니다 이 실행 통계 서버가 실행 한 모든 SQL 문 중 하나

실제로 쿼리를 정규화하고 함께 그룹화합니다 그래서 각각의 모든 쿼리는 실행되지 않을 것입니다 이 형식의 모든 쿼리에 대해서는 저장됩니다 이것에 관한 통계입니다 모든 특정 통계를 살펴 보겠습니다

내보내고 사용자에게 내 보냅니다 놀랍게도보기를 사용하여 pg_stat_statements라고도 부릅니다 다시 쿼리 할 수 ​​있습니다 정기적 인 Postgres 테이블처럼 테이블에서 통계를 얻으십시오 그래서, 그 견해에는 무엇이 포함되어 있습니까? user_id, db_id, query_id 및 쿼리 텍스트가 있으며, 그리고 그것이 데이터베이스에서 실행 된 횟수

한 쿼리가 느린 경우 하지만 5 일에 1 번 실행됩니다 괜찮을거야하지만 쿼리가 있다면 5, 10, 15 밀리 초를 절약 할 수있는 것과 같습니다 하지만 그것은 하루에 수천 번 실행됩니다 실제로 최적화하는 것이 더 유용합니다

또한, 일종의, 같은 시간, 최소 시간은 얼마입니까? 이 유형의 쿼리를 실행하는 데 걸렸습니다 Max_time, mean, 그것은 또한 표준 편차를 제공합니다 당신이 이해할 수 있도록, 좋아, 아마도 한 두 가지의 나쁜 사건 하지만 항상 나쁜,이 쿼리를 수행 무엇입니까? 그리고 그것이 실행 된 횟수를 알려줍니다 두 조각을 서로 연관 지을 수 있습니다 또한 IO에 대한 정보를 알려줍니다

공유 된 블록의 수 쓰다, 쓰다, 더러워 졌어? 얼마나 많은 지역 블록이 쳤고, 쓰여지고, 더러워 졌습니까? 또한 블록 읽기 및 쓰기에 소요 된 총 시간 몇 가지 예를 들어 보겠습니다 당신이이 정보로 무엇을 할 수 있는지 가장 일반적인 쿼리 중 일부입니다 데이터베이스를 즉시 실행합니다

시간이 많이 걸리는 상위 10 개 쿼리는 무엇입니까? 당신은 내가 total_time을 사용하고 있음을 알아 차리고, 나는 one_time을 사용하지 않으므로 이것이 당신에게 알려줍니다 데이터베이스에 대한 쿼리는 무엇입니까? 그 시간의 대부분을 보내고 있습니다 사실 total_time이기 때문에 본질적으로 mean_time에 전화를 곱한 결과입니다 그래서 그것은 단지 전화를 보는 것과 반대되는 좋은 측정입니다 이것이 가장 일반적인 쿼리라고 말합니다

하지만 밀리 초만에 실행하면 괜찮습니다 또는 쿼리 시간 만 사용하면됩니다 하지만 어쩌면 매우 일찍 실행될 수도 있습니다 이것은 일반적으로 좋은 방법입니다 때로는 예를 들어, 나쁜 캐시 적중률의 예에서, 너는 너가하고있는 걸 알지

많은 디스크가 당신이 알아 내고 싶은 것을 읽을 정도로 읽습니다 상위 10 개 검색어는 무엇입니까? 디스크 읽기에 대부분의 시간을 소비 모니터링 도구에서 알 수 있듯이, 알다시피 내 시간이 많이 갈거야 디스크 읽기에서는 쿼리 만 찾습니다 당신은 그 쿼리 만합니다 아니면, 그냥 가고 싶다

가장 많이 사용되는 상위 10 개 검색어는 무엇입니까? 당신이 일종의 일을 할 때 유용합니다 벤치마킹 등의 당신은 벤치 마크하고 싶지 않아 좋아, 최악의 쿼리를 벤치마킹하고 싶다 하지만 가장 일반적인 쿼리를 벤치마킹하려고합니다 이 모든 정보를 가져올 수 있습니다

너의 시선을 정확하게 말하다 정확히 무엇을 튜닝해야할까요? 일반적으로 최적화를 수행하는 것이 아닙니다 좋은 모범 사례를 기본으로 수행 한 후에 이것은 내가 강력하게 추천하는 질문이다 데이터베이스에서 실행되어 어느 것을 찾아야하는지 너는보고 있어야한다 이 블로그 게시물 중 하나입니다

pg_stat_statements에 표시되므로 가장 중요한 것은 무엇입니까? 그것은 당신에게 통화, total_time, mean_time, max_time 및 표준 편차 시간 그것은 또한 당신의 질문을 좋아합니다 화면에서보기 좋게 보이도록 당신은 쉽게 그것을보고 디버깅 할 수 있습니다 그것은 현재 사용자의 쿼리만을 보여줍니다 그것은한다

현재 사용자가 아니라, 백업 사용자가 아닌 모든 것 그래서 때로는 백업 일이 나타날 것입니다 그리고 나서 상위 15 개 검색어를 찾습니다 평균 시간으로 정렬 이것은 일반적으로 실행할 좋은 쿼리입니다

그리고 좋은 출발점 그것은 당신에게 많은 것을 보여줍니다 이 예제를 보면 그것은 말한다, 좋아, 데이터베이스가 실행 된 total_time 이 쿼리에 소요 된 시간은 약 121 초입니다 mean_time은 실제로 86one입니다 max_time은 3 초, 3

7 초입니다 이것은 표준 편차이며, 이 많은 행이 이것으로부터 리턴됩니다 자, 가서 데이터베이스에서 실행하십시오 흥미로운 것들을 찾을거야 그것에서 나오는

자, 당신이 알아 냈다고 가정 해 봅시다 느린 쿼리는 무엇입니까? 자, 당신은 그들을 조정하기 위해 무엇을합니까? 그건, 여러 번 이야기 할 수 있다고 생각합니다 여러 워크샵을 자체적으로 진행합니다 그러나 그것의 아주 기본 EXPLAIN ANALYZE를 수행하여 시작하는 것입니다 그래서, 당신이 쿼리를 데리러, EXPLAIN ANALYZE를 수행합니다

알고있는 것이 유용하고 이것은 공통점입니다 사람들은 일반적으로 EXPLAIN을 수행합니다 EXPLAIN은 Postgres가 생각하는 것만을 제공합니다 그것의 세계관의 그러나 실제적으로 일어날지도 모른 무엇이 아닙니다 쿼리를 실행할 때 EXPLAIN을 보면 그리고 당신은 그것이 당신에게 말하는 비용을 보았습니다 이것이 더 복잡한 계획이라면 당신은 더 많은 비용을 볼 수 있습니다

그리고 그 Postgres 견적 이거 오래 걸릴거야 실제로는 전혀 사실이 아닐 수도 있습니다 보길 원하는 것 EXPLAIN ANALYZE를보고있을 때 실제 시간입니다 오른쪽에는 실제 시간이 표시됩니다 다음과 같은 경우를 보여줍니다

행이 출력되었고, 출력 된 행 수 이것은 매우 간단한 쿼리입니다 모든 행을 선택하는 것입니다 여기서 특정 열 값은 1입니다 그것은 당신에게 보여줍니다, 그것은 약 9,584 행을 반환 할 것으로 예상됩니다, 실제로 약 10,000 행을 반환합니다

따라서 꽤 가깝습니다 예상치는 꽤 가깝습니다 그런 다음 쿼리 계획을 읽습니다 그런 다음 계획의 어느 부분을 파악하는지 가장 많은 시간을 들이고 있습니다 실제 시간에는 추정치가 아니라 그런 다음 색인 생성을 통해 조정할 수 있습니다

또는 다른 Postgres 튜닝 매개 변수를 조정하여 자, 그건 단지 표준적인 부분입니다 아시다시피, 당신이 분석을 할 때, 쿼리에서 가장 느린 부분 조정 하지만 Postgres는 실제로 당신에게 알려줍니다 EXPLAIN의 몇 가지 흥미로운 점도 있습니다 이 쿼리를 살펴 보겠습니다

그래서, 나는 테이블에서 선택하고있다 여기서 열 1은 1이고 열 2는 0입니다 당신이 이것을 보게된다면, 당신은 알 것입니다 쿼리 계획을 조정할 수 있지만 실제로 거기에는 불일치가있다 중요한 불일치는 100 배 이상입니다

Postgres가이 쿼리가 반환 할 것이라고 생각하는 측면에서, 그래서 Postgres는 100 행을 반환 할 것으로 추정합니다 실제로 데이터베이스는 10,000 개의 행을 반환합니다 그리고 그것은 정말로 벗어났다 그래서, 만약 당신이이 계획보다 위의 것을 가졌다면, 그래서 집계를한다면, 조인을하고 있다면, Postgres가 실제로 선택할 계획 좋지 않을거야 그것은 단지 100 개의 행만 믿기 때문입니다

스캔에서 올거야 하지만 실제로는 1 만 행이 올 것입니다 스캔에서 실제로주의해야 할 것이 있습니다 Postgres 튜닝에 대한 많은 조언이 있다고 생각합니다

한 번 당신이 EXPLAIN ANALYZE를 본 것처럼 그것에 대해가는 방법 그러나 그 다음 거기에있다 고려해야 할 중요한 것 느린 쿼리가 항상 그런 것은 아닙니다 인덱스를 추가하고 작업 속도를 높일 수 있습니다 때때로 Postgres에 잘못된 통계가있을 수 있습니다 또는 충분한 데이터를 보지 못했습니다 데이터에 대한 올바른 통계를 얻을 수 있습니다

이것을 보면, 문제는 이것 이후에 일어나는 일, 나쁜 실행 계획처럼 매우 나쁠 수도 있습니다 그리고 그건 당신이 창조하지 않았기 때문이 아닙니다 올바른 색인 또는 다른 것, 그것은 단지 Postgres 무언가가 올거라 생각했다 이 특정 스캔에서 행 수가 훨씬 더 많았습니다 나쁜 통계가 표시되는 첫 번째 단계 높은 것으로 다시 분석하는 것입니다

기본 통계 대상 실제로 행 수 Postgres 데이터 분포를 추정하는 데 사용됩니다 그래서, 알겠습니다 Postgres가 더 많은 행을 스캔하기 때문에 더 비쌉니다 그 통계를 얻으려고하지만 통계를 만든다

훨씬 더 정확합니다 그게 처음 시작하는거야 그러나 여기의 문제는 사실 그 것이 아닙니다 당신이 어떻게 할 수 있는지에 대한 예를 한 가지만 골라 둡니다 통계가 일치하지 않으면 Postgres에게 실제로 어떻게 말할 수 있습니까? 통계 수정 Postgres가 어떻게 통계를 향상시킬 수 있는지에 대해 설명합니다

여기에 문제가있는 이유는 이 특별한 스키마에있다 제 1 열 및 제 2 열은 서로 상관된다 실제로 두 번째 열, 두 번째 열의 값, 내가 아는 데이터를 채웠다 실제로 열 1을 10으로 나눈 값입니다 그래서, 당신이 칼럼 1을 안다면, 실제로 가치를 결정하는 데 충분합니다

열 2의하지만 포스트그레스는 그것에 대해 아무것도 몰라요 기본적으로 Postgres는 통계 만 캡처합니다 독립적으로 단일 열에 대해 그래서 그것은 말합니다, 아마도 1 만 줄이 될 것입니다 1 열에서 반환, 2 열에서 10,000 이제 두 필터가 함께 적용됩니다

그러면 아마 100 줄을 얻을 수있을 것입니다 따라서 선택도를 사용하여 예상치를 발행합니다 이 숫자를 생각해 내야합니다 하지만 실제로 이것은 생산하지 않을 것입니다 인덱스에 관계없이 올바른 결과 Postgres에 말하지 않으면 아무 것도 추가하지 않습니다

이 둘 사이의 상관 관계에 대해서 그래서 Postgres는 멀티 컬럼 통계를 선언 할 수있게 해주 며, 그것은 기본적으로 그것을하지 않습니다 그것이 그것을 할 것이기 때문에 모든 열 (row)의 순열 (permutations)과 조합 (combination) 당신의 테이블에있는 모든 칼럼들, ANALYZE는 너무 오래 걸릴 것입니다 하지만 Postgres에 두 개의 열이 서로 연관되어 있음을 알 수 있습니다 그것에 대한 통계를 작성합니다

그래서 그것은 구문입니다 우리는 그것에 들어갈 필요가 없지만, 궤도 의존 통계 제 1 열, 제 2 열 일단 그 정보가 있으면 당신은 이것이 정확히 같은 쿼리라는 것을 알 수 있습니다 나는 테이블을 분석 한 후 다시 실행했다 그리고 Postgres에게 캡처하도록 알려줍니다 볼 수있는 상관 관계 통계 순차 스캔이 있습니다

현재 9,584 개의 행을 예측합니다 100 대신에 그리고 훨씬 더 정확합니다 이것 이후에 일어날 일들은 훨씬 더 효율적입니다 실제로,이 통계가 아주 보이는 것처럼 보입니다 사람들이 그렇게 생각하지 않아요

실제로 큰 영향을 미칩니다 이것은 사실 7 월에 작년에 내가 트위터에 올린 것입니다 우리는 고객을 보았습니다 수천 배 빠른 성능 그리고 나는 그것이 같아 보인다는 것을 안다, 이 SQL 쿼리를 실행해야했습니다 1000 배 더 나은 성능을 얻으려면 그러나 그것은 일어난다

잘못된 쿼리 계획 견적 이것은 간단한 쿼리입니다 더 복잡한 쿼리 인 경우 너는 많은 이슈가있을거야 Postgres가 생각하기에 행 수는 다릅니다 그것이 실제로있는 것에서 따라서 이것을 요약하기 위해 pg_stat_statements 최적화 할 수있는 적절한 쿼리 집합을 찾고, EXPLAIN ANALYZE를 사용하고 가장 느린 부분을 튜닝하고, 다시 ANALYZE에 중점을두고, EXPLAIN을보고 가정하지 마라

Postgres가 할거야, 우리는 EXPLAIN이 매우 다른 것을 보았습니다 어떤 경우에는 실제로 일어나는 일로부터 차이점을 눈여겨 보아라 견적 및 실제 수정 방법을 찾고, Postgres에게 통계를 수정하도록 알려주십시오 항상 정확하지 않을 수 있기 때문입니다 그래서, 그것은 기본적으로 내 이야기의 주요 내용입니다

빠른 견적에 보너스를 추가했습니다 그래서 이것은 반드시 필요한 것은 아닙니다 나머지 이야기와 관련있다 성능 조정 및 기타 측면에서 하지만 Postgres 캡처를 사용하면 실제로 많은 좋은 견적을 얻을 수 있습니다 어떤 것들에 대해서, 지금 당장 매우 비싼 쿼리를 실행하고있을 수 있습니다

그걸 알아 내려고 그것은 pg_stats에 캡처됩니다 각 열에 대한 정보를 수집합니다 Postgres는 그것에 대해 생각합니다 이것을 보면 널 (Null) 부분을 알 수 있습니다

처음부터, 그것은 당신에게 명백한 가치의 수를 알려주고, 여기에는 고정 된 수의 고유 한 값이 있습니다 그래서 천을 말한다 때로는 비율을 알려주므로 말할 수 있습니다 오케이, 20 %의 테이블 분명한 가치의 숫자가 될 것입니다 때때로 이해하는 것이 유용합니다

가장 흥미로운 것들 나는 해키 스크립트를 써서, 가장 일반적인 값이며 가장 일반적인 빈도입니다 에 대한 견적을 위해, 좋아, 우리 10 대 고객, 당신은 실제로 그들로부터 좋은 견적을 찾을 것입니다 가장 일반적인 가치관에서 그렇게 말할 것입니다 알았어, 가장 일반적인 값은 다음과 같다 이 고객에 대해 가지고있는 행 수 대부분의 일반적인 주파수에서 말하자면 말입니다

그래서, 이것이 실제로 무엇을 말하는지, 가치 945에 대한 것입니다0017 데이터베이스의 행 수로, 특정 ID가 갖는 행 수입니다 그래서 당신은 그것을 위해 사용할 수 있습니다 근본적으로 근사하고, 당신이 알아 내고 싶다고 말하는 것처럼, 당신의 테이블이 있다고 가정 해 봅시다

네트워크 바이트와 당신이 알아 내고 싶어 어느 장치가 실제로 많은 양의 바이트를주고 있는지를 나타냅니다 가장 많은 양의 바이트를 방출하는 장치, 당신은 복잡한, 그것이 복잡하지 않더라도, 확실히 비싼 계정 별개의 쿼리입니다 그것을 알아 내기 위해, 나는 여기에 갈 것이다 Postgres에 상위 10 개 기기에 대한 통계가 있는지 확인하십시오 그리고 그걸 사용해서 알아낼 수 있습니다

알았어, 얼마나 많은 패킷이 방금 시스템을 통과했는지, 우물 Postgres는 그것을위한 견적을 가지고 있습니다 거친 공 공원을 줄 수 있어요 이것들은 당신이 할 수있는 것들입니다 2 천 1 백만 건, 345 천건 중 한 건의 결과, 너는 그들에게 실제로 말할 필요가 없다 정확한 숫자는 얼마입니까? 당신은 이것에 대해 많이 말할 수 있습니다

다른 유용한 통계는 얻을 수 있습니다 그 히스토그램 범위도 마찬가지입니다 특정 가정이 있다면 데이터가 어떻게 퍼져 나가야하는지 당신은 분명히 그것을 확인할 수 있습니다 내가 이것을 사용하는 근사값은 다음과 같습니다 특정 열의 널 비율은 얼마입니까? 대략적인 숫자는 무엇입니까? 한 값에 대해 고유 한 값이 있습니까? 당신은 카운트를 구별 할 필요가 없다는 것을 알았습니다

반드시 그것을 알아내는 것 너는 여기를보고 얻을 수있다 그것이 무엇인지에 대한 대략적인 아이디어 그리고 가장 일반적인 가치는 무엇입니까? 란을 위해 그 행을 가진 대략적인 수 근사치 이것은 내가 일반적으로하는 또 다른 것입니다

당신이 매우 큰 데이터베이스를 가지고있는 것처럼, Postgres는 카운트 스캔을 캐시하지 않습니다 그래서 사람들은 카운트 스타가 매우 기대하고 있습니다 저렴한 쿼리, 그것은 Postgres에 없습니다 실제로 전체 테이블을 스캔해야합니다 각 행을 계산합니다

그래서 나는 10 억 줄의 테이블을 가지고있을 때 그걸 좋아하지 않습니다 그래서 나는 이것에 가서 거친 공 공원을 얻는다 이 테이블은 얼마나 큰가요? 이 테이블에서 어떤 작업을 할 수 있습니까? 내가 알면, 너는 갈 수있어 pg_class라는 테이블이 있습니다 당신은 거기에 가서 진짜 튜플을 찾을 수 있습니다

Postgres의 추정치 얼마나 많은 튜플이 있는지 요약하면, Postgres는 꽤 많은 통계를 보여줍니다 이 강의에서 우리는 주로 다루었습니다 성능과 관련된 것들 어떤 종류의 장소를합니까? 성능 문제를 조사하고 싶습니다

마찬가지로 포인터는 무엇입니까? 그것은 당신을 깊게 파고들 것을 가르쳐줍니다 Pg_stat 테이블 일반적으로 어떤 색인을 찾을 수 있도록 도와줍니다 인덱스, 테이블에 대한 통계 IO 통계, 진공 통계 Pg_stat_statements는 느린 쿼리를 찾는 데 도움이되며, EXPLAIN ANALYZE를 사용하거나 사실 더 좋을 것입니다 EXPLAIN ANALYZE 버퍼가 어떤 종류의 IO인지 확인하십시오

그래서 그것은 얼마나 많은, 이 검색어와 마찬가지로 조회수 비율은 얼마입니까? 그 중 얼마나 많은 것들이 디스크를 통해 가져와야하는지, 그리고 마지막으로 pg_stats, pg_class를 사용할 수 있습니다 좋은 근사를 얻으려고 Postgres가 귀하의 데이터에 대해 어떻게 이해하는지 이해하십시오 나는 말할 마지막 한가지가있다 그래서 당신이 그 소식을 듣지 않았다면, Citus 데이터는 Microsoft에서 인수했습니다 그래서 우리는 실제로 작업하고 있습니다

Azure에서 Citus를 시작했습니다 관심있는 사람이 있으면 시터스를 보면서 Azure에서 사용할 수 있습니다 당신은이 링크에 가서 흥미를 표현할 수 있습니다 우리는 당신을 그 고리에 계속 묶을 것입니다 그리고 그게 내 이야기 ​​야

나는 2 초 남았고 그래서 제 시간에 맞았습니다 (군중 박수)

RailsConf 2018: Giving your Heroku App highly-available PostgreSQL by Jake Varghese

(테크노 음악) – 다들 제이크 제이크

Compose와 함께 있고 오늘은 이전 방법을 알려 드리겠습니다 IBM의 클라우드 HA PostgreSQL에 대한 Heroku 응용 프로그램 우리가 이야기하기 전에, 나는 이야기하고 싶다 실제로 고 가용성을 달성하는 방법에 대해 알아보십시오 우리가하는 일은 앱을 사용하는 것입니다

우리는 주지사라고 불렀습니다 주지사는 etcd의 위에 앉아있다, 이는 우리 유통 코디네이터입니다 Etcd는 두 개의 PostgreSQL 노드에 연결됩니다 리더 / 팔로어 포맷 Etcd가 리더이자 추종자 형식이며 우리는 벽 문자열 복제를 사용하여 노드를 동기화 상태로 유지합니다

두 노드 앞에 HA 프록시로드 밸런서가 있습니다 이로드 밸런서는 두 노드에 모두 연결됩니다 그리고 주지사에게, 어느 것이 지도자인지 알기 위해 그리고 어느 것이 추종자인지 노드에 변경이 발생하면 프록시가 유지합니다 새로운 리더가 나타날 때까지 요청

따라서 앱에서 오류 초과 사용량이 전혀 인식되지 않습니다 그것이 일어났다; 이것이 우리가 중단 시간을 제로로 유지하는 방법입니다 앱이 실제로 HA 프록시 노드에 연결됩니다 그래서 우리는 이것을 얼마 전에 오픈 소스에 공개했습니다 그리고 그것은 몇 번 갈래 왔습니다

최신 포크 중 하나가 Patroni입니다 Patroni는 주지사에게 Zookeeper 사용을 허용함으로써 주지사를 추가합니다 귀하의 유통 코디네이터로 영사를 임명하십시오 그리고 그것은 매우 안정적이고 아주 좋습니다 그리고 실제로 우리는 실제로 Patroni를 모든 PG 배포에 사용하십시오

이것이 바로 우리가 실제로 고 가용성을 얻는 방법입니다 따라서 우리가 이전하기 위해 만든 데모를 보여 드리겠습니다 내가 만든이 데모는 인공 지능 그것은 완전히 진짜이고 전혀 만들어지지 않았습니다 그리고이 지능이하는 일은 이미지를 찍을 것입니다 4 명의 스타 트랙 선장 포스터 중 하나에 붙여야합니다

그래서 당신의 이미지를 받아 거기에 넣습니다 그러면 어떻게 생겼는지 살펴 보겠습니다 그래서 나는 여기에 이미지를 업로드 할 것이다, 빵! 피카르드입니다 나는 Sisko 사람의 안에서 더 많다 그러나 이것은 그렇게 나쁘지 않다

저것은 방법 더 낫다; 나는 계속 지킬거야 그 하나는 내 벽지로 그리고 분명히 다른 두 명의 주장이 있습니다 커크, 내가 좋아하지 않는 사람 알았어

나는 헤어 라인을 좋아하지만, 훨씬 좋네요 그러나 우리는 Janeway에 간다 그리고 분명히 인공 지능은 비틀기를 필요로한다 이것이 우리 앱입니다 운 좋게 우리는 아무것도 할 필요가 없다

우리가 오늘 보여주고 자하는 것에 대한 인공 지능의 비틀기에 대해 오늘을 위해 우리는 프로덕션 캡틴 리의 데이터 우리의 구성된 클라우드 PostgreSQL에 그래서 우리가 그렇게 할거야 우리가 할 일은 당기는거야 Heroku에서 백업 및 캡처 그러니 계속 진행해보고 다운로드하면됩니다

다행히 오래 걸리지 않기를 바랍니다 – [청중 회원] 데이터베이스의 이미지입니까? – 전에 보여 줬던 멋진 이미지들? 아니, 그건 완전히 진짜야 인공 지능으로 확실하게 우리의 굉장한 디자이너 중 한 명이 아닙니다 자, 이제 우리는 여기에서 다운로드를 빠르게 진행할 것입니다 이제는 내보내기가 다운로드됩니다

그리고 PostgreSQL 설정으로 넘어갈 것입니다 세부 정보 페이지; 내가 진짜 빨리 거기에 가자 여기 PostgreSQL 배포에 대한 세부 정보 페이지가 있습니다 IBM Cloud에서 설정했습니다 다음은 연결 문자열입니다

내가 지적하고 싶은 한 가지는, 우리의 배치는 전체 서버와 함께 제공됩니다 따라서 원하는만큼 많은 데이터베이스를 배치 할 수 있습니다 우리는 모든 PG 배포를로드합니다 Compose라는 기본 데이터베이스가 있습니다 이것에는 몇 가지가 있습니다

귀하의 관리자처럼, 다른 것들도 있습니다 그리고 나는 Captainly staging을 이미 만들었습니다 및 Captainly 프로덕션 데이터베이스를 사용합니다 그래서 우리는 PG 복원을 사용하여 복원 할 것입니다 그래서 바로 여기에 표준 PG 복원이 있습니다

무주택자를위한 몇 가지 옵션 다음은 연결 문자열의 호스트입니다 우리의 모든 배치는 비표준 포트를 사용합니다 보안상의 이유로, 당신은 빼기 P 옵션을 사용합니다 그런 다음 사용자 이름으로 관리자를 갖게됩니다

Captainly staging으로 가져올거야 그리고 우리가 수입하고자하는 덤프 암호를 복사하여 붙여 넣기하겠습니다 그게 나 한테 물어볼거야 멋지다

그래서 지금 가져오고있다, 우리가 필요로 할 것이 하나있다 스테이징에서 우리가 떨어질 필요가있다 Heroku PostgreSQL 애드온 그 이유는 데이터베이스 밑줄 URL 구성 변수는 자동으로 생성됩니다 그것을 사용하는 애드온에 첨부됩니다

따라서 애드온으로 실제로 다시 구성 할 수는 없습니다 따라서 애드온을 제거해야합니다 그리고 우리는 그 사실을 빨리 제거 할 것입니다 좋아, 이제 두 번 확인해 보자 좋아, 그래서 데이터베이스 URL이 없어 졌어

이제 우리는 데이터베이스 URL을 설정할 수 있습니다 그리고 나서 모든 사람들은 내가 얼마나 잘못 입력했는지 알 수 있습니다 기본적으로 똑같은 연결 문자열을 사용합니다 우리가이 마지막 부분을 바꿀 거라는 걸 제외하고 Captainly Staging으로 가서 보자, 괜찮아, 여전히 데이터 처리가 거의 완료되었습니다 멋지다, 우리는 순서대로있다

이제 우리는이 문제를 해결할 수 있습니다 오, 나는 ST를 설정해야 해 멋지다 그래서 두 번 확인해 보자 좋아요, 그래서 데이터베이스가 이미 설정되었습니다

그럼 콘솔에 들어가 봅시다 연결이 제대로 작동하는지 확인하십시오 멋지다, 임포트가 끝났어 완벽한, 그래서 지금 우리는 데이터를 가지고, 모든 연결되어 있습니다 마지막으로 수표를 준비하면 Captainly Staging에 들어갈 것입니다

새로 고침을하면 오류가 발생하지 않도록하십시오 완전한 그래서 우리의 스테이징 테스트가 완료되었습니다 이제 우리가해야 할 모든 것입니다 물건을 생산에 끌어들입니다

우리가 이미 스테이징 한 이후로 꽤 쉬울 것입니다 우리가해야 할 일은 바로이 부분을 여기에서 바꾸는 것뿐입니다 생산에 가져 가서 그 수입을 암호를 얻어야 해 좋아요, 똑같은 일을 할게요 Captainly Production Heroku 인스턴스와 함께

그리고 우리는 제거 할 것입니다 좋아, 두 번 확인해 보자 알았어, 데이터베이스 URL이 없어 졌어 이제 우리는 그것을 설정할 수 있습니다 그리고 다시, 우리는 기본적으로 똑같은 것을 사용할 것입니다

우리는 빼기 전에 R을 우리는 이것을 생산으로 바꿀 것입니다 이제 콘솔을 실행 해 보겠습니다 우리가 얼마나 멀리 여기에 왔어? 아, 나쁘지 않아 이제 콘솔을 두 번 확인해 봅시다 완벽한, 그래서 지금 우리는 생산을 끌어 당겼다

이제 앱에서 한번 더 두 번 확인해 보겠습니다 그리고 그게 다야; 모든 데이터를 이전했습니다 새로운 배치; 그것이 우리가해야 할 전부입니다 – [청중 회원] 방법이 있을까요? 가동 중단없이 그렇게하려면? – 어떤 앱에 다운 타임이 없습니까? – [잠재 고객 회원] 이전 된 앱입니다 내가 큰 작품을 가지고있는 것처럼 – – 권리

config 변수 스위치를 사용해야합니다 그래서 당신에게 약간의 중단 시간을 줄거야 그러나 데이터베이스를 채우면서, 그 시점에서 전환 할 필요가 없습니다 모든 것이 완료 될 때까지 기다릴 수 있습니다 그런 다음 전환하십시오

큰 Heroku 앱이 얼마나 빨리 전환 될지 모르겠습니다 모든 구성 변수에 대해 모든 서버에 적용됩니다 무엇부터 중단 시간이 없어야합니다 나는 Heroku를 기억하지만, 나는 할 수 없다 – [청중 회원] 그럼 내가 할 수 있을까요? 프로덕션 환경에서 클라우드에 파일을 설정 하시겠습니까? 그 동안, 나는 새로운 데이터를 얻고있다

– 그래, 네가 할 수있어 우리 배포 중 하나를 동기화 할 수 있다고 생각합니다 다른 배치로 나는 그것을 두 번 확인해야 할 것이다 우리가 구성을 설정하는 방식 때문에, 그게 실제로 잘 작동하는지 모르겠다

하나는 지도자가 될 것이고 하나는 추종자가 될 것이기 때문에, 그 다음에 다른 지도자에게서 들어와, 모든 것을 버릴 수도 있습니다 그래서 그것에 대해 너무 확신하지 않습니다 하지만 부스에서 나를 때리면 나는 물을 수있다 우리가 거기에 도착했을 때 기술 녀석 중의 1 명 그래, 그래,이 일이 끝났어

그래서 수색은 어디서 볼 수 있니? 이 앱에서 지금 검색 할 항목이 없습니다 하지만 검색을 추가하고 싶다고합시다 슈퍼 간단한 경우, 난 그냥 스캔 것 PostgreSQL 테이블을 통해 그러나 그것보다 더 어려운 것이 있다면, 아마 내 자신의 인덱서를 원할거야 그리고 여기서 클라우드로 들어와 리소스를 만들 수 있습니다

그리고 탄력적 인 검색을 해 봅시다 그리고 우리는 미국 남부에 놓을 것입니다 늦은 것이 좋습니다 그런 다음 생성을 클릭하기 만하면됩니다 나는 지금 창조를 클릭하지 않을 것이다, 진짜 신축성있는 검색을 제공하고 싶지 않기 때문에

그러나 생성을 클릭하면 보일 것입니다 일단 그렇게되면 그리고 이것이 개요가 될 것입니다 탄력적 인 검색 배포, 연결 문자열이있는 ES 밑줄 URL 또는 신축성있는 검색 URL에 넣으려면, 앱의 설정 변수가 무엇이든간에 그리고 그래, 근본적으로 모든 것이 있습니다 앱을 이전하는 것; 그게 다야

그러니 더 이상 질문이 있으면 알려주세요 그래, 그거야, 그래서 우리는 후원을 한 이후로 매우 짧게 유지하려했습니다 우리는 단지 당신을 팔고 모든 것을 던지고 싶지 않습니다 그래서 우리는 당신에게 그것이 할 수있는 것을 보여 주기로 결정했습니다 그게 전부 야

좋아, 고마워! (wooshing과 땡땡이 치기)

RailsConf 2014 – Biggish Data With Rails and Postgresql by Starr Horne

STARR 혼 : 그래서 주셔서 너희들을 감사합니다 이 거 굉장한 이야기가 될 것입니다

당신이 이제까지들을 수 아마도 가장 좋은 이야기 당신의 인생이다 뭐? 사실이 내장 탈출 해치 여기, 그래서 일을 시작하는 경우는 잘못된 것 난 그냥 구제 수 있습니다 네 그래서 어쨌든 몇 주 전에, 나는 잘했다 나는 종류의 약 공황 발작이 있었다 이 프레젠테이션, 나는 프로그래머, 내 자연이기 때문에 어두운 곳의 어떤 종류의보고에 서식지이다 스크린

그것은이 이야기 아니에요, 아니에요 조명, 같은 사람들의 무리 무엇에 달려 이? 나는 그래서, 나는이의 중간에 있었다 공황 발작과 나는 산책을 나갔다 항상 내 마음을 지 웁니다 원인 나는 듣고 있었다 팟 캐스트합니다 내가 좋아하는 팟 캐스트 그것은 하드 코어라고 역사

내가보기 엔 그것을하는 것이 좋습니다 네 오 누군가가 좋아 그것 네! 그래서 하드 코어에 대한이,이 특정 에피소드의에서 하드 코어 역사는 포 에니 전쟁에 대해이었다

그리고에서 당신은 포 에니 전쟁에 대해 들어하지 않은 경우,하지 이야기를 알고, 난 그냥, 등, 당신을 줄 것이다 간단한 개요 기본적으로, 오래, 오래 전,이 로마이라는 곳이었다 그리고, 그들은 결정 그들은 세계를 정복해야한다고 그리고 대부분의 경우, 그들은했다 그러나이 있었다 자신의 측면에서 가시이었다 한 국가 Carthidge이라는 긴 시간 동안

그리고 그들은 싸웠 앞뒤로 모든 전쟁 그것은 친절했다 오래된 친구의 그리고 어느 날, 때, 나는 어쩌면 몰라 그는 화재 신에게 희생을 만들고 있었다 또는 무엇 이건, 한니발라는 이름의이 남자는이 위대한 있었다 생각 그는 내가거야처럼, 나는 거 리드 야했다 이 로마에 몰래 공격, 나는거야 그렇게 알프스를 통해 내 군대를 행진하여 어느 것, 꽤 멋지다

나는 꽤 나쁜 것을 의미 나귀 하지만, 나는 가장 멋진 부분을 생각한다 이야기의 나를 위해, 적어도이다 멋쟁이는 전쟁 코끼리가 있었다 그래서, 난, 난 몰라 슬라이드에서 볼 수 있는지 알고, 실제로 전쟁 코끼리가있다 그것은이 종류의,의 의, 나는 그것을 아래 가지의 몰라 G 그리고 많은 사람들이 의심했다 이야기, 당신이 알고, 지난 몇 년 동안

그래서,에 1959 년, 영국의 엔지니어가 누구인지, A의 바 내기, 점보라는 이름의 서커스 코끼리를 빌려 도, 알프스를 가로 질러를 행진했다 그래서, 난 내 지점 여기 모르겠어요, 정말 나는 코끼리를 과소 평가하지 않는 것 같아요 그들은하지 않기 때문에 그것을 좋아하고 오랫동안 기억을 가지고있다 그래서 확인 이 이야기는 약간 큰 데이터에 대해 정말이다

그럼, 도대체 약간 큰 데이터가 무엇인지 그 아니, 무엇입니까? 우와, 나는이 하나있어 소지품 그것은 빅 데이터 아니다 그것은 당신에 대해 아니에요 이 이야기는거야 하둡 클러스터에 대한하지 알고 및 서버 팜 및 모든 물건 즉 그건,이다 내 머리 방법

그것은 공상 아키텍처에 대해 아니에요 나는 야 쇼 아니에요 당신은 어떻게 할 멀티 오른쪽 포스트 그레스 클러스터를 만들려면 자동 샤딩 물건 내 말은, 그게 전부 같은입니다 악인 멋진,하지만 우리가 거 ​​얘기하는지 아니다 약 대신, 내가 생각하는 무언가에 대한 거 얘기 해요 , 것은 더 실용적이며, 가지 더 나에게 흥미로운하고, 즉, 어떻게 할 생산 데이터 세트가 성장함에 따라 응용 프로그램은 작업을 계속? 그리고 약간 큰 데이터 영역으로 성장? 그리고 이것은 매우 간단합니다 이것은 매우 간단합니다 발생합니다

당신은 파이어 호스가 없더라도 오는 데이터의 실행할 경우하는 인기있는 전자 상거래 사이트 또는 그냥 사이트 년의 과정을 통해 사용자의 많은 당신 데이터의 톤을 축적 할 수 있습니다 그리고이 같은 데이터는 사이트 성능이가는 것을 발견, 축적 내리막 종류의 점진적 방법으로 당신이 그렇지 않은 알다 그래서 약간 큰 데이터 무엇입니까? 이 이야기는 기반 Honeybadger에서 내 경험에

경우 당신이하지 않은 그것을 듣고 우리의, 우리는 예외 성능입니다 및 가동 시간 모니터링 회사입니다 그것은 우리가 본질적 의미 새로운 데이터의 파이어 호스 모든오고있다 일 지금 우리의 테라 바이트에 대해이 우리의 데이타베이스 오류 세상은 많이있다 오류 너희들은 같은 일을 시작해야합니다 더 나은 일

그리고, 우리에 대해 얻을, 우리는 두 기가 바이트 얻을 새로운 하루에 오류, 약 그리고이 모든 일반 바닐라 포스트 그레스 데이터베이스로 전환, 그것은이다 꽤 일반을 백업하는, 제공 바닐라 레일 응용 프로그램입니다 음, 좋은 소식은 포스트 그레스 처리 할 수 ​​있다는 것입니다 이 아주 쉽게 POSTGRES는 덮여 가지고있다 당신이 조작하지 않았다면 나쁜 소식은,이다 당신의 응용 프로그램은있어, 데이터의 수준을 처리하는 종류의 나사

그리고 그 이유는있는 백메가바이트 데이터베이스 동작 하나보다 근본적으로 다른 테라 바이트의 데이터베이스 그리고 규칙을 많이하는 우리가 레일에서하는 일반적인 많은 것 이 많이있을 때 응용 프로그램은 작동이 중지 데이터 예 이것은 실제로 라이브 피드입니다 이 쿼리 오늘 아침부터 실행되었다

내가 배운 뭔가, 거의 모든 매김 시스템 중단 페이지처럼, 2000 년에도 당신, 당신은 같은거야, 사랑하는 하나님,이 스톱을, 난 그냥 원하는 반 내 데이터를 삭제합니다 당신은 당신이 가만히 끝장,있어, 데이터를 삭제하는 것은 시간이 많이 걸리기 때문에 지금, 나는이 모든 것을 설명 할 거있어 나는거야 이것은 당신이 해결할 수있는 방법, 발생 이유를 설명 그것은, 당신은에서 쿼리를 최적화하는 방법 자신의 데이터베이스와는 스택을 최적화 할 수 있습니다 그러나,에 정말 이해, 우리는 조금 걸릴 수있어 1978 년 여름에, 시간을 거슬러 여행

디스코, 무료 사랑의 여름, 그리고 VT-100 단말기 VT-100은 모양 컴퓨터의 첫 번째 정렬했다 당신이 실제 기업에서 살 수있는 것은 하고 있음을 증명하기 위해 책상에 앉아 사무실의 알파 괴상한했다 그것은이었다 또한 오라클 1 점 0 시간이었다 개발중인 제 데이터베이스 중 하나이었다 즉, SQL 언어를 사용했다 그것은 꽤 멋지다 그것 PDP-11 어셈블리 언어로 작성 하였다

그리고, 그리고 경우에 당신은 너무 젊은 같아 지금까지 PDP-11를 보았다, 이것은 무엇이다 PDP-11처럼 보인다 네 사랑을 좀 보여 줘 플라즈마 디스플레이 패널 (11) – 자,이 꽤 굉장합니다 요즘, 우리의, 같은, 현대의 시간, 바로이 두 번째, 마케팅 아래에 그들은 그 무엇이라고 부릅니까 무엇의 presentat-? 전시 홀

지금, 주위의 모든 던지고있다 클라우드 컴퓨팅 및 플랫폼에 대한 단어의 종류 서비스와, 내가 모르는 어떤, 어떤 물건 난 아마 들어하지 않았습니다 그리고 다시 다음은 동일하지만, 버즈이었다 말은 달랐다 모두의의의 유행어 그 당시 모든 사람의 입술에 버즈 단어였다 실시간 컴퓨팅 그리고 나는, 나는, 실시간으로 주변 공기 따옴표를 사용하고 있습니다 그건 당신이 가질 수있는 의미 때문에, 당신의 오분 대신 5 일 발생보고합니다 어느 나는 확실히 꽤 굉장 해요

마찬가지로, 나는 것 그것에 대해 정말 행복했다 그러나, 당신은 알고있다, 이보고는 정말 아닌 것 같아 가지 종류의 난을 구축 할 것 오른쪽 상단에 웹 응용 프로그램? 마찬가지로, I 그래 나는, 나는에 Honeybadger 스틱 않을 것 그 그러나 재미있는 것은 과거에 무슨 일이 있었 서른, 삼십육년

일이 재미있는 일이 있다는 것입니다 무어의 법칙은 웹 스택에이했다 지금, 나는 모든 사람들이 여기 종류의, 막연하게 알고 있다는 것을 알고있다 무엇 무어의 법칙입니다 그러나 나는 그것을 생각했던 것 기술, 정확한 정의를 통해 이동하는 것이 좋을 무어의 법칙 그리고 그 워, 그입니다 즉 그 컴퓨터입니다 시간이 앞으로 갈수록 더 멋진 얻을

그거 했어 일반적으로 돌아와? 네 시간으로 앞으로 간다 과 의 awesomeness은 일반적으로 잘, 기술적으로, 수있는, 같이 정의된다 더 빨리 더 많은 물건을 할 수 있습니다 처리 할 수 ​​있다는 더 빨리 더 많은 데이터 이에 따라 그래서, 나는 것 공공 장소에서 처음으로 가정하고 싶은 – 너희들은 할 수 매우 운이 이 듣 – 공공 장소에서 처음으로, 데이터베이스로이며, 무어의 법칙에 스타의 Corelary 성장은 무어의 법칙, 당신은 문자 그대로 다시 여행을 앞지 릅니다 시각

즉,이 중이의 테드의 순간이었다 이야기 그것은 내가 너희들을들을 수 있습니다처럼, 당신의 마음을 날 려 되 그것은 버블 랩 터지는처럼 들린다 그래서, 내 기반으로, 시간 여행의 내 광범위한 연구 영화, 새로운 생존의 첫 번째 규칙 시간은 당신이 이해할 필요가있다 방법과 그에있는 사람들의 동기 시간 우리는 같은 생각을 시작해야하는 우리의 선조

그리고 우리의 조상이 매우 관심 일은 열심히 도자기했다 글쎄, 난, 난 플립 할 말은하지 않지만 난 그냥 있기 때문에, 먼저이를 가지고 싶어 당신은 데이터베이스 크기 조정 문제가 될 일이면, 앱이 바로 지금의 경우처럼 느려 데이터베이스에있는 데이터의 양이 때문에 더 크게, 그리고 앱 어디 살고 발생 EC-2라는 이름의, Linode, 나는 무엇이든, 어떤 다른 몰라 회사는, 당신은 아마 당신의 스케일링을 해결할 수 있습니다 문제 그냥 같은, 지금 바로 이동하여 및 진짜 망할 컴퓨터를 구입 네 당신은 충격을 깜짝 놀라게 할 것입니다 두 있기 때문에 데이터베이스가 잘 수행해야 할 일들이 작동하도록 많은 데이터를 고성능, 그들은이다 램을 많이해야하고, 그들이 정말 빨리 필요 디스크 IO

그리고 가상 서버는 둘의 제공 그것들 그래서, 그냥 진짜 망할 구매 갈 컴퓨터 네 당신이 그것에 인 동안, 그리고 던져 디스크의 무리입니다 나는 레이더 광선에 대해 이야기하고 있지 않다

당신은 아마 당신의 각을 원한다, 당신은 아마 각을 원한다 운영 체제, 당신의 포스트 그레스 데이터, 당신의 포스트 그레스 로그 파일, 당신은 아마로 모든 물건을 원하는 별도의 하드 드라이브에 그리고 그건 그냥 거 메이크업입니다 보다 효율적으로 정렬 할 수 운영 체제 일정 디스크 IO 그래서,이 문제를 해결하는 경우, 당신이 알고있는 경우에, 큰 천만에요 너희들은 남겨 둡니다 방 지금, 그 괜찮아요

나는 기분을 상하게하지 않습니다 당신은 당신의 지역 콜로 시설에 전화 갈 수 있습니다 작업 뭔가 부족합니다 만약, 그 문제가 해결되지 않을 경우, 이 경우에도 또는, 당신은 아마 원하는 다음 쿼리를 봐주세요 죄송합니다 – 지금, 대부분의 사람들은, 우리의 대부분은 개발합니다

안녕하세요 우리들 대부분은 좀 작은 데이터 세트에 대해 개발한다 그래서, 당신은 작은 데이터 세트에 대해 개발할 때, 당신은하지 않습니다 비효율적 인 쿼리를 확인할 수 있습니다 그냥 인생이야 그리고 책이 쿼리 최적화에 대해 작성되었습니다

그것은 매우이야이야 큰 주제는, 나는, EV 모든 것을 설명 할 수 없다 삼십 분 그래서 난 그냥 하나를 설명 할게 것, 그리고이을이라고하는 설명 다행히, POSTGRES는 우리에게 설명해라는 멋진 도구를 제공합니다, 이는 기본적으로 당신은 그것을 쿼리를 전달하고 그것을 우리에게 쿼리 계획을 제공합니다 아 그것은 기다려 둘째 즉, A의, 그 일리아드에서 장입니다

죄송합니다 그것은 우리에게 여전히 쿼리 계획을 제공합니다 종류의 일리아드에서 장처럼 보인다 그러나, 다행히도, 우리는,보고해야 하나의 메트릭 여기 우리가해야 할 유일한 것은 행 약 우려하고있다 이 이야기하십시오

그리고 여기에 우리는 매우의 예를 가지고 효율적인 쿼리, 맞아 그것은 거 인덱스를 사용하고 있어요 그것은 하나의 행에 거 모습입니다 그건 꽤 달콤한입니다 매우 빠른 이 쿼리의 유형입니다 약간 큰 데이터가 작동합니다

그러나 한 가지 알아야 할있다 행 그리고, 분명히, 더 많은 행이 당신이 상대하고있는 것을 로에게, 당신의 컴퓨터에있는 더 많은 데이터가 경색 당신이 원하는 답변을 제공합니다 그래서 전체 게임의 전체 이름 쿼리 최적화는 행의 수를 제한하는 것입니다 당신이 접촉 할 필요가있다 의 그 비효율적 인 카운트 쿼리로 돌아 가자 그래서 당신이에 설명 실행하면, 그것은 밝혀 당신이 포스트 그레스를 요청하는 경우 모든 계산하는 것을 탭, 테이블의 모든 행, 실제로 문자 그대로의 모든 행을 계산 테이블, 하나 하나

그래서 당신은 함께 중 하나를 바람 이런 일 그것은 꽤 아니다 그리고 그것은 하드 종종 있어요 이 같은 물건을 거 작물 인 경우 알고 쪽으로 예를 들어, 내가 언급 한 대부분의 페이지 매김 시스템이 페이지 1000 2000에서 휴식 그리고 그 때문이다, 또한, 오프셋 및 제한 운영자는 많은 일을 당신이 오프셋 할 경우 같은 점에서, 계산 50의, POSTGRES는 50 만 카운트 것입니다 행, 그리고 당신의 제한이있는 경우 (100)이 거 (100) 그리고 다른 카운트 것 당신이 볼 것은 그 페이지에 한 개, 두 개, 그리고 매우 빠르게 세로드 그래서 당신과 같은 개발자, 난 당신이 내 말 말할 때, 실제로 나, 실제로, 실제로이에 빠진 원인 덫

당신은 그것을 테스트 하나 또는 두 개의 같은 페이지 및 이동 그래서, 잘 작동 다음 나중에 고객에 때문에 불평 그들은 시간 초과있어 페이지 (500)에 액세스 할 수 없습니다 이에 대한 해결책은 범위를 사용하는 질문 범위 쿼리는 매우 빠르고, 나는거야 여기 당신에게 정말 바보 같은 예를 제공합니다 여기 모든 훨씬 더 상세한 분석과 링크 이 그러나 본질적으로, 당신은 범위 질의를 할 경우, 넌 인덱스를 사용할 수 있습니다

그 거 100 개 행을 터치하여 거 정말 할 수 있어요 빠른 지금, 나는 너희들이 무슨 생각을하는지 알고있다 그건 오프셋 제한 쿼리와 동일하지 않습니다 과 그게 내가 당신에게 링크를 준 이유 이전 슬라이드, 그래서 정렬

정렬은 까다 롭습니다 정렬은 악마입니다 때때로 그것은 슈퍼 빠른입니다 때때로 당신이 될 일 경우 정확히 같은 방식으로 정렬 된 데이터를 요청 인덱스가 정렬되어 있는지, 잘, 그것은 슈퍼 영웅이 될 수 있습니다 빠른 당신이 인덱스를 경우에도 다른 시간, 열에, 그것이 설정되어 있지 않은 경우 바로 또는 당신은의 데이터를 요청하는 경우 약간 특이한 방법으로, 당신은 전체를 정렬 바람거야 빌어 먹을 데이터 세트

그것은 좋지 않습니다 그래서 여기에 쿼리에 대한 개요입니다 최적화 당신은 실제 데이터 세트에 대해 개발하고자, 일을하려고 할 때, 그렇지 않으면 당신은 알 수 없습니다 때문에 잘못된 그들이 생산에 잘못 될 때까지 사용, 사용 설명 그것을 많이 사용합니다

그리고 전체 이름 여기에 게임 수를 제한하는 것입니다 당신이 접촉 행 더 행하기 때문에 당신은 터치 느린 쿼리입니다 당신은 알고있다 일반적이다 그래서, 나는, 나는 당신에 대해 알고 있지만하지 않는 처럼 그것은 단지인지를 많이했다 바로 여기에서 일어나고로드합니다 그래서 내가 원하는 사람들에게 당신에게 쿠키를 제공합니다

이 이야기의 후반을 위해, 우리는거야 종류와 관련된 문제를 많이 포함 약간 큰 데이터, 주변에 큰 데이터 세트 주변의 인프라 데이터의 firehoses 여기 있어요 들어오는 그리고, 우리는이 거 접근있어 방법의 전설 우린 그, 희망, 일종의 귀여운 그림이있어 의에 대해 뭔가 주제를 상징한다 우리는거야 주제의 이름을 가지고 있고, 우리는있어 야는에 대한 자세한 정보와 링크가 주제 당신은, 당신도 알다시피, 찾으려면, 경우 나중에 그리고 당신은 모든 링크를 작성할 필요가 없습니다 지금 아래로

프리젠 테이션의 끝에서, 맨 마지막 슬라이드에, 나는 URL을해야합니다 당신의 모든 목록을 얻을 수있는 곳 그들 그리고, 그래, 나는이 악성 코드없는 약속드립니다 그래서, 당신은 단지 돼이 내 말을 우리의 조상은 디스크 운영 체제에 정말 관심이 있었다 그들은 새 디스크를 구축 한 것 같다 운영 2 초마다 같은 시스템,하지만

무엇, 무엇이야 그 최대? 나는, 나도 몰라 이제, 우리 세 같은,있다 당신이 있다면 당신이해야 할 첫 번째 일은 리눅스를 사용하면 미리 읽기 캐시를 증가시키는 것이다 에이 미리 읽기 캐시는, 음, 내가하지 발견, 뭔가 사람이 아니 톤에 대해 알고 있지만, 그건 슈퍼 쉬운 방법은 일어나서 당신의 읽기 처리량의 두 배 그리고 이는 본질적으로 무엇을 리눅스는 당신이 만드는 요청을 검사한다는 것입니다 받는 사람, 디스크에

그리고 그것은 보는 경우 당신은 오는 블록을 많이 요구하고 있다는 오른쪽 행의 다른 후에는 거 프리로드의 RAM에 블록의 다음 세트 정상은,이에 대한 기본 같은이며, 는 이러한 블록을 접두사로 사용 256K RAM 두 개의 메가처럼 사용이를 업데이트하는 경우, 네 메가, 당신의 정말 큰 증가를 얻을 수 있습니다 읽기 성능을 현대 파일 시스템을 사용합니다 그 의미는 EXT-3은 옵션이 아닙니다

당신이 원하는 경우 링크를 체크 아웃, 이유를 알고있다 그리고, 당신은 EXT-4를 사용하는 일이 있다면 또는 XFS 내가하지 않는 그런 말을 할 수 없다 이 슈퍼 슬로우 말한다 당신이 고려하는 것이 좋습니다, 당신은 저널링 설정을 조사 할 수 있습니다 만약 당신은 완전히 별도의 하드에 데이터베이스가 드라이브, 그것은 EXT-4 실행중인 당신은 전체가 포스트 그레스는 자신의 저널링을 수행하기 때문에 데이터 저널링이 활성화 당신이 있기 때문에 넌 거기에 비 효율성을 가지고있어 저널링 두 가지

마지막으로, 또는 기다립니다 아니 마지막으로 어쨌든 당신에게 해 PG는 대한 폴 그램 말, 말에 대한 모든 당신이에서 구입 RAM, 그 멋진 새 상자 A, 정말 쉬운 방법이 설정 최대는 PG-조정 스크립트를 사용하는 것입니다

그것은 검사 컴퓨터와는, 포스트 그레스 구성 파일을 작성 그 안에 꽤, 꽤 합리적인 값이 있습니다 그리고 당신은 거기에서 그들을 조정할 수 있습니다 이 물건 모든 찾기가 정말 쉽습니다 그리고, 마지막으로, DB 관리자의의 독, 진공 명령입니다 포스트 그레스 때문에, 진공 필요 그것은 지저분한입니다

그것 때를, 당신은 쿼리를 실행할 때, 당신이 일을 삭제할 때, 당신이 일을 업데이트 할 때, 그것을 물건 취소의 많은 종류의 잎 과 그것은 그것의에서 그가 않는 것을 않습니다 그것 속도의 이름으로, 맞아 그것은 단지 쿼리의 시간에 필요한 것을 수행 당신에게 당신의 질문에 대한 답을 얻을 수 있습니다

그리고 그것은 일종의 가서 진공을 사용하여 의 자체 뒤처리 문제는이다 진공 정말 리소스를 많이 할 수 있습니다 그래서 경우 당신, 당신의 서버는 많은 미만인 경우 로드, 당신은 OK, 진공 또한, 볼 부하를 많이 일으키는, 당신은 유혹 할 수있다 진공을 해제하거나, 또는 수 있도록하는 자동 진공 밤이나 뭐 일단 어쩌면 일어날 과 그것은 일반적으로 나쁜 생각입니다 우리는 실제로 물린있어 나는 그것을 가지고 왜 자신에 의해, 그래서 그건 쪽으로

일반적으로 진공 문제에 대한 대답은에있다 더 자주 진공 청소기로 청소하지 덜 자주 괜찮아 그래서 속도 내가 정말 좋아하고 싶었다 – 나는 시간이 없었다 – 정말 원 조금 가지고, 조금 같은 트론 사람 이 작은 격자 추락 오토바이에

그러나 뭐라고 이제 우리는 몇 가지, 약거야 말거야 당신의 톤이있는 경우 중요하다는 것을 데이터가오고, 또는 읽기 요청의 톤이오고 쿼리의 톤이 들어 오면서에서 첫 번째 너무 많은 데이터베이스 연결입니다 각 데이터베이스 연결 POSTGRES는 자체 프로세스이며, 각 프로세스가 자신의 RAM 오버 헤드

따라서 제한된 수있다 당신이 당신을 갖고 싶어 연결, 데이터베이스 서버입니다 당신이 가지고있는 경우에, 나는, 천 노동자를 모르는 그리고, 웹 응용 프로그램 프로세스와 모든이, 당신을 천 데이터베이스 연결을 열려하지 않고 당신은 아마 이미 이것에 대해 알고있다 이 솔루션은 연결을 풀 수 있습니다 루비에서이 작업을 수행 할 수있는 방법이있다 ,도 있습니다 좀 더 작전-Y 접근 방식에 관심이 있다면, 당신 A는 PG-경비원, 뭔가를 확인하실 수 있습니다 루비 응용 프로그램 사이에 앉아 프록시 연결로 데이터베이스와 같은 기능, 풀

당신은 또한 너무 많은 문제로 실행할 수 있습니다 잠 깁니다 그리고 이것은이의 일종이다 당신이 정말로 어느 경우에 실행되지 않는 문제 당신은 데이터, 데이터베이스의 파이어 호스가 없습니다 온다 나는 같은, 당신이 알에 대한 모든 것을 기대하지 않습니다 그것 때문에 잠금, 그것은 매우 복잡한 주제이다 하지만이 경우, 트랜잭션 내에서 다음 사항을 알고 있어야합니다 당신이 행을 업데이트로 이동 트랜잭션입니다 이 때까지거야 행에 잠금을 넣어 끝난 거야 아무것도 쓸 수없는 말 것 해당 행에이 완료 될 때까지

그리고, 당신은 알고있다, 그 의미가 있습니다 그러나 이것은 당신이 경우입니다 물린 수있는 곳 이, 말하자면, 두 개의 레일 모델을 가지고 상상 당신 상위 모델과 하위 모델을 가지고있다 과 상위 모델은 증가 도착 카운터 – 캐시가 때마다 당신은 아이를 추가합니다 일반적으로,이입니다 더 큰 문제가 없다

사람들은 이런 종류의 작업을 수행 항상 그러나 미친 일이 일어나는 경우 누군가가 당신이 알고, 당신의 API를 포격 갑자기 당신을 만오천 아이들이 만든처럼,이, 당신이있어, 당신은거야 일부 잠금 문제가 있습니다 원하지 무슨 원인 첫 번째 쿼리입니다 잘 실행하는 것이다 아이의 거 만들어 얻을 그것은 거 카운터를 증가합니다

모든거야 괜찮을 그것은 그 일을하는 동안 그리고, 그것은 넣어 해당 행에,에 잠급니다 그래서, 한 번 첫 번째 쿼리는 이루어집니다 잠금이 제거되고, 두 번째 쿼리가 발생합니다 그리고 당신은 무한이 있다면 시간, 같은,이 모두 잘 될 것입니다 그것은 것 모든 결국 자신을 밖으로 작동합니다

그러나 무슨 일입니다 그 때까지는 당신은 쿼리 (100), 쿼리를 완료하는 것이 15, 15000은 모든 종류의 원인이되는 시간이 초과되었습니다 당신의 재미, 당신은 당신의 유니콘에, 알고 당신의 Sidekiqs 모든 것을 그것은 그래, A의, 그것은 목에 큰 고통입니다 그리고 당신은이 문제를 방지하는 방법은, 그것은, 그것은 단지 건축 일이다 당신은 단지에있는 당신이를 업데이트 할 수있는 상황을 피하기 gillion 시간 같은 데이터베이스에 동일한 레코드 초당 집중 데이터베이스 쿼리

마찬가지로, 때로는, 때로는 우리가 우리의 프로덕션 데이터베이스, 우리는 그것이 매우해야, 우리의 사용자를위한 매우 확대됨 그러나 우리는 또한 필요 어쩌면에하면 같은 데이터에 대한 몇 가지 사전을 에 온다 그리고 할 수있는 정말 간단한 방법 이에 포스트 그레스의 스트리밍 복제 기능을 사용하는 것입니다 읽기 전용 리플리 칸트를 만들 수 있습니다 그리고 당신은 할 당신의 집중이에 대한 쿼리와는 영향을주지 않습니다, 사용자에 영향을 미칩니다 그것은 매우 간단합니다

죄송합니다 I, I, 나는 종류의 바보 그것에 대해 이야기를 느낀다 이리 그러나, 거기 당신은 간다 파티셔닝은 굉장합니다 파티션은 가장 좋은 것은 같다 그것은 수 있기 때문에 지금, 당신은 극적으로 속도를 데이터 통화 및 데이터 아카이빙

당신은 설정할 수 있습니다 무엇 에서, POSTGRES의 파티션 구성표입니다 다른 날에 대한 데이터는 서로 다른 물리적으로 이동하는 데이터베이스 테이블 그리고, 당신은 알고있다, 그 모든 권리입니다 하지만 정말 멋진 것은 당신이하여 해당 데이터에 액세스한다는 것입니다 그 다음 가상 테이블의 부모 정렬 쿼리 그 아이의 모든과에서 해당 쿼리를 전파, 당신은 마술의 결과, 그리고 가래침을 수행, 알고 그들을 다시 당신에게 그래서 당신은 당신의 루비 코드를 업데이트 할 필요가 없습니다 전혀, 어떤 달콤한입니다 그리고이 방법의 경우 당신은, 말하자면, 180일의 데이터 삭제하려면 옛날, 당신은 단지와 연결된 테이블을 삭제 180일 전에

당신은 작업을 수행하는 경우 당신이 알고있는 경우, 삭제 created_at 미만 180 일 전, 당신은 아마 거 주 동안 기다리고있을 것입니다 그리고 마지막으로,하지만 적어도, 백업은 진짜 목에 통증이 큰이 데이터 세트 마찬가지로, 그 그 범죄 작업은 전체 덤프 S3에 대한 데이터베이스 및 업로드 그렇게 작동하지 않습니다 당신의 데이터베이스는 두 개의 테라 바이트 큰, 같은 때 그리고, 그래, 그건 너무 큰 S3 법안입니다 다행히도, 우리는 같은 종류의 이점을 취할 수 일의 포스트 그레스에이를 수 있도록 않는 온, 일종의 수행하기 위해 복제를 스트리밍 할 증분 백업을 비행

그리고 벽-E라는 도구가있다 이는이 매우 쉽습니다 그리고, 그것은 정말 그것은 수 있기 때문에, 그것은, 그것을 매우하게, 쿨 증분 백업을 업로드하기 쉬운에, 말, S3, 및 다음 데이터베이스를 복원 할 때, 그것을 그것은 정말 쉬운 특정을 복원하게 시간을 가리 킵니다 그래서 즉, 벽 E는 정말 굉장합니다 나는 사랑한다 그것 지금, 나는, 나는, 나는 나의 호텔 방에 머물 지난 밤

나는로 이동하지 않았다 가지 저를 얻어 먹게 무허가 것 그러나 나는, 나는 이러한 슬라이드에 일해야했다 당신은 사람들 그리고, 그리고, 나는 다 도착했을 때 이와 나는 종류의이 지점에 도달 할 때, 나는이 모든,이 슬라이드에 뒤돌아 – 및 I – 쉰네 그들처럼 거기 이런 세상에, 같았다 이것은 많은입니다 정보 네

이 많은 정보입니다 하지만 내가, 내가 스트레스 원하는 것은에서이다 이상에서, 내 경험에서,이 문제에 경향 한 번에 당신이 한 곳에서 온다 이것은 아니다 당신이 알아야 할 물건의 종류 위해 사전에이 물건의 모든 POSTGRES에서 약간 큰 데이터를 처리 것들에 올 당신이 한 번에 하나씩, 그리고 당신은 해결할 수 한 번에 하나 그리고 당신에 대한 믿음이있다

난 당신을 생각 당신이 최고이기 때문에 아무도 이야기하지 않기 때문에, 그것을 할 수 있습니다 우리는 우리가 웃는 고양이로, 같은 트랜지스터를 켤 수 있음 그러나 우리는 그것을했다 마찬가지로, 그 유형의 내가 자랑스러워 사람들은 왜 우리가, 그리고 그, 그건 RailsConf에 있어야합니다 당신은 같은에 관심이 있다면, 이것에 대해 나에게 이야기, 당신은 난 생각한다면 아마 나는 아무것도 똥이 가득 적어도 하나의 점에 불과, 그냥 그렇게 말한다 그냥 후 나에게 올 주시기 바랍니다 회의, 또는 여기 내 이야기 ​​후 나는 가지고있다 인센티브 맛있는 뜨겁고 매운 멕시코 사탕

그래서 당신이 이동합니다 당신은 물건에 대한 자세한 내용을 원한다면 I 당신이 복용하고 있는지? 당신이 원하십니까 멕시코 사탕의 사진을 찍을? 승인 승인 내가 당신에게 보낼 수 있습니다

만약 당신은 모두를 더 배우고 싶다면 이 이야기에서 참조하는 링크는이에있다 URL 및 더 많은 데에 관심이 있다면 생산 오류에 대한 가시성이, Honeybadger을 확인하기 때문에 네 우리는 레일 개발자들 사랑 해요 그리고 그게 다야 때문입니다

그것은 여기 쇼의 끝을 말한다, 그래서 그런 것 같아요 이 쇼의 끝이어야합니다

RailsConf 2016 – Multi-table Full Text Search with Postgres By Caleb Thompson

(낙관적, 신나는 음악) – 오늘 우리는 다소 약거야 말거야 검색 할 방법이 아닌 표준 응용 프로그램이다 종종, 검색 일종의에서 이루어집니다 외부 서비스의

죄송합니다 보다 나은? 보다 나은? 난 그냥 30 분 동안 같이 서 있습니다 내가 그 여분의 시간이 있었기 때문에, 이상부터, 우리는 다소 비표준에 대한거야 말거야 응용 프로그램에서 검색 방법 종종, 검색거야 어떤 종류로 할 수있다 외부 서비스의 오히려 것을하는 것보다, 우리는거야 사용하는 것 이미 저장에 대한 책임의 도구 데이터를 찾는

포스트 그레스에서 멀티 포트 테이블 전체 텍스트 검색에 오신 것을 환영합니다 나는 우리가 수요일 포옹을하고 있지 갈렙 톰슨입니다 당신은 인터넷에이 장소에서 나를 찾을 수 있습니다 이야기하는 동안 나에게 트윗 주시기 바랍니다 내가 그 똥을 사랑 해요 당신은 트위터를하지 않는 경우에, 당신의 노트북을 닫으 마십시오

여기에 코드를 많이있을거야, 아무것도 구하기 힘든 될 것 이 이야기에서 당신이보고하지 않는 경우 지금은 당신이 종료해야한다고 말했으니 당신의 노트북, 나는 자격 증명에 뛰어 좋아하지 않는다 이야기의 시작 부분에서, 당신은 이미 여기있어, 그 요점이 무엇인지의 종류입니다 우리는 우리가 바이오했다, 추상 있었다 그래서 당신은 마지막에 나에 대해 조금 더 듣게 될 것입니다, 하지만 명성 한 주장을해야합니까, 즉 내 생일이 SimpleDelegator의 DOX에 있는지의 그 그래서 당신은 내가 전문가는 아니지만 알고있다 나는 실제 기능에 대해 얘기하겠습니다

우리는 다른 옵션을 반복,을거야 우리는 우리가있어 할 때처럼 최적화 우리의 응용 프로그램의 기능을 개발하고 있습니다 우리는 전체 텍스트 검색에 대한 거 얘기입니다 그것이 무엇인지, 그것은 우리를 도울 수있는 방법 바라건대, 당신은 제목에서 그것을 짐작 할 수있다 우리는 뷰에 대한 거 이야기하고 있으며, 아니, 하지 HTML보기, 우리는 데이터베이스 뷰에 대한 거 얘기입니다

당연히, 우리는 성능에 영향을 탐구 할 무엇이든 우리는 일을하고 있습니다 그래서 우리는 몇몇의 거보고있어 성능에 미치는 영향, 어떻게 우리가 그들을 완화 할 수 있습니다 그리고 우리는 물론 구체화 전망에 대한거야 말거야 하나의 방법으로 그렇게 할 수 있습니다 우리는 할 수는 우리를하는 데 도움이 보석의 몇 가지 살펴 보자 우리는이 재미있는 물건을하고있는 동안, 물론, 우리는 다른 모든 옵션에 거 봐있어 또는 우리가 무슨 일을하는지에 대한 몇 가지 다른 옵션 좋아, 고전적인 예를의 종류를 살펴 보자

의 우리의 applicaiton에서 문서를 검색 할 수 있습니다 우리가 가능하게 할 수있는 간단한 일이 그 작품 문자열을 검색하는 것입니다 그래서, 여기에 우리는 몸이 포함 기사를 가지고, 어떻게이 찾고? 무서운? 누군가가 거기에 불을 칠 수 있습니까? 그냥 괜찮아요, 계속 어떻게 더 나은 것을입니까? 즉, 더 나은 외모, 나는 그것을 볼 수 있습니다 우리는 기사에서 거보고있어 어디 몸 일부 문자열을 포함하는 쿼리를 고정합니다

당신은 아마 응용 프로그램에서 이것을 보았다 이 작동합니다 사용자가 정확히 알고있는 경우에 그것은 작동 그들이 찾으려 그래서 만약 그들이이 검색하는 말과 글, 그 단어 책, 그들은 소문자 될 것 알고, 어딘가 문장의 중간에, 그들은 다음과 같이 검색 할 수 있습니다, 당신은에서 해당 검색의 권리를 전달할 수 있습니다 내가 말했듯이, 그 정확한 문자열을하고있어 즉, 가장 유용한 것은 아니다

그래서, 앞으로 작은 작은 단계는 우리가 취할 수 ILIKE와 같은 문자를 구분 케이스를하는 것입니다 나는 이것을 좋아하지 않는다 그러나 약간 더 좋다 좋아, 음, 떠날 수 있습니다 그것은 일종의 우리가 지금 필요하지 않습니다

우리는 문장의 위치를 ​​알 필요가 없습니다 당신이 검색하는 단어는 멋지다입니다 좋아요, 자연스럽게, 기능 확장합니다 우리는 타이틀을 기반으로 검색 할 필요가 우리의 기사 우리는 아마 오는 것을 본 적이해야 때 우리가 검색되었습니다 우리도이 문제를 처리 할 수 ​​있습니다

우리는 그저 우리가 이미 한 일을 확장 할 수 있습니다 우리는 두 번 대신 한 번 그 쿼리에 거 패스있어 우리는 여전히 같은 그 사례를 구분을 다하겠습니다 여기에서 퍼센트 기호는 그것이거야 그래서 어느 곳에서나 쿼리에 표시됩니다 어느 곳 단어입니다 그래서 당신은 문자열의 모든 종류의 하위를 가질 수 텍스트이다 그래서 지금 우리는 저자의 이름으로 검색 싶어요

이것은 당신이 알고, 좀 더 복잡해지고되지만, 다시, 아마 우리가 오는 것을 본 적이 있습니다 우리는 가서 우리의 사용자 모델에 참여합니다 나는 우리가 사용자 거 사용에있어, 사과 및 상호 교환이 이야기에서 저자의 테이블 사용자 테이블 이것은 기본적으로 같은 질문이지만, 우리는 일을하는지, 우리는 레일, arell, 조인을 처리시키는 것 그리고 우리는 당신이 알고,하고있는 사용자의 이름과 같은 두 개의 필드를 당겨 것을 우리는 이미 철수했다

즉, 쿼리, 쿼리, 쿼리는 더듬 거리는 시작 이는 우리가 정말 우리의 코드에서 원하지 않는 무언가이다 그래서 하나의 방법 우리는 다음과 같이 리팩토링 수 질의 객체에 그것을 할 것입니다 그리고이 덜 확대됨에, 그러나 틀림없이 쉽게 당신이 그것을 찾을 때 이해합니다 그것이 아래로 올 때, 우리는 여전히있어 정말 가난한 결과 우리는이 대소 문자를 구분 문자열을 검색하고, 그리고, 당신은 알고있다, 그 위대한 아니다

단어거야 복수 무엇을 할 경우, 우리는 단수가 우리가 유일한 것들에 대한 검색하는 경우 쿼리 또는 무엇 Google은 이러한 일을하는 방법을 알고, 그것은 우리의 사용자가 우리에게서 기대려고하고있는 무슨이다 우리는이 검색 기능을 구축 할 때 전체 텍스트 검색을 입력합니다 전체 텍스트 검색은 우리가 행을 조회 할 수 있습니다 자연어 검색을 기반으로 이봐, 갈렙, 자연 언어는 무엇을 찾고 있는가? 나는 당신이 물어 기뻐요

자연어 검색은 우리를 수 쿼리에서 정지 작업을 제거합니다 그래서이 모든 종류의에 나타나는 단어는 문장, 그들이 우리에게 의미 론적 의미하지 많이있다, 우리는 정말 그들을 포함되지하려면 검색 결과입니다 우리는 단어를 포함하는 모든 검색을 원하지 않는, 또는 단어를 반환 모든 기사, 우리의 검색 결과에 표시합니다 다시 말하지만, 단지 ILIKE 대 등을 좋아한다, 우리는 케이스를 제거거야 매우 간단합니다

우리는 동의어가 보여주고 싶은 그래서 우리의 사용자가 마음에 종류의 개념이있는 경우 그들은 검색하는하지만 기억하지 않습니다 정확히 무엇인지, 다음, 당신이 알고, 이들 모두는 동일한 결과를 반환해야합니다 그리고 우리는 형태소 통합하는거야, 자연 언어 검색의 또 다른 특징이며, 어떤 의미가 관련 단어, 시도, tyring 및 시도와 같은, 이들은 모두 다른 버전입니다 동일한 루트 단어, 그래서 우리는 아래를 기록 동일한 개념 우리는 우리의 검색을하고있는 후드 아래, 우리는 실제로 검색하는 대신에 그 어원 에 전달 된 특정 단어 그래서 여기에 같은 쿼리를 만드는 예입니다 우리는이 코드에서 줌거야 종류의 주변에있어 조금 우리는 더 중요한 부분을 강조합니다 그래서 여기에 우리는 텍스트를 찾고 우리가 싶은 것을 가입 할 수 있습니다

우리는, 제목, 빈 공간 있음을 사슬로 잇다 수 없다는 것 다음 몸 우리는 우리가 필요해서, 텍스트 것을 전화 할게 포스트 그레스는 행복하기 위해 이름을 지정하고, 그래서 그게 무슨, 두 개의 파이프 사업자의 을 덧붙인 있습니다 그리고 우리는 또한 저자의 이름으로 끌어거야 텍스트로 우리가 당기는 때 그리고, 당연히, 우리는 ID를 원하는 기사와 기사의 ID에서 밖으로 때 우리는 저자의 철수하고 있습니다 우리가 원하지 않기 때문에 우리는 독특한 결과를 원하는 같은 기사는 시간의 무리를 표시합니다 우리의 쿼리에서, 경우가 여러 번 나타난다 본문에, 또는이 모두를 표시하는 경우 저자 테이블과 제목이다

우리 몸에있어 좋아, 그래서는 SQL의 많은입니다 우리는 어디에서이 모든 배치해야합니까? 우리는 우리의 쿼리 객체로 그것을 다시 던질 수 우리가 마지막에서 본 우리는 몇 가지 코드를했다 기본적으로, 그냥 인라인 SQL 실행 어디서 통해 되었

범위와 같은 것 거기에 던져, 그냥 쿼리 전달 그래서, 보간,하지만, 정직하게 SQL은 RV 파일에 속하지 않는 것을 우리는 대한 확장을 가지고있다 그래서 포스트 그레스는 실제로 우리의 답이있다 뷰의 형태로 사용될 수있다 보기는 데이터베이스에 저장된 일부 쿼리입니다 즉, 선택 될 수있다 그것은 할 수 있습니다 열 집합을 반환 나중에에 대한 검색

그들이이기 때문에 뷰의 본질은,이다 기본적으로 그냥 쿼리, 그들은 여러 소스 테이블을 가질 수 있습니다 그래서 지금 우리는 사용자 / 저자 테이블을 가지고있다 우리는 기사의 테이블을 가지고, 그래서이보기 우리를 수 초록의 거리에 그냥 말을 정렬하려면 이것은 우리가 걱정하는 텍스트입니다 그리고 우리는 어디를 수행 할 수 있습니다 나중에, 우리는 우리가해야 할 무엇이든 할 수 있습니다 는 의미입니다 수 있도록 해당 쿼리를 완료 우리의 사용자에게 그들은 실제로 수행 할 때 나중에 길 아래 검색 그래서, 우리가 건설하려고한다면, 여기 예를 들어보기의 단지 종류입니다

우리는이 뷰를 생성 구문을 가지고있다 그냥 당신이 테이블 것 같은, 이름을 지정 우리는 서로 다른 사용자 ID를 선택할 수 있습니다 그래서 지금, 분명 우리가 당기는있어 사용자 최근 활동 그래서 우리는 다른 테이블의 커플거야 모양이야

우리는 사용자에 대한 모든 정보를보고 싶어 또한 마지막으로 그들은 활동했다 그래서, 우리는 각 사용자의 인스턴스를 원하는 내가 말했듯이, 우리는 사용자 테이블에서 해당 행을 모두 원하는, 우리는이 개념을 만들려고 에서 당겨 사용자의 마지막 활성 시간 활동은 열을 만들었습니다 그리고 우리는 단지, 활동이 제한거야 또는 지난 7 일 동안 활약 한 사용자 그래서, 우리는이보기를 통해 찾을 때, 그것은 테이블을 통해 무엇을 검색에 꽤 비슷 과 같을 것이다 당신은, 사용자의 모든 선택 어떤 선택 최근 활동, 순서, 당신이 무엇을 할 필요가있다

그리고, 사실, 액티브 있도록 유사 모델에 대한 백엔드로 뷰를 사용할 수 있습니다 그래서 우리가 할 수있는 것은 상당히 바닐라 모델을 만드는 것입니다, 아주 익숙하고, 우리는 그와 상호 작용할 수 있습니다 마치 우리의 데이터베이스의 테이블이었다 그래서 우리는 최근의 활동 모델이 사용자를 가지고있다 당신이 볼 수 있듯이, 그것은 액티브 서브 클래스입니다 우리는 단지 때문에, 그것을 테이블 이름을 지정거야 해당 테이블의 우리의 이름은하지 않았다 레일이 때 예상 한 것과 일치 클래스 이름을 부여하고, 우린 그에게있어 그것은 읽기 전용 있다고

그리고 이것은 엄격하게, 진실 말하기되지 않는다 하지만 그것은 단지보기 가정하는 가장 쉬운 방법 읽기 전용 것입니다 당신이 읽기 전용되지 않도록해야하는 경우, 그 몇 가지 특별한 규칙이 있습니다 즉 관객을위한 운동입니다 그러나,이 말씀, 그것은 레일을 알 수있다 아무 것도 삭제 될 수 없다, 아무것도 할 수 없다 이 표에 기록 그래서, 읽기 전용, 당신은 단지 그것에 대해 조회 할 수 있습니다

이 작품 것이다 전체 텍스트 검색을 할 것인가? 다행히, 예 우리는 우리의 첫 번째 보석, Textacular에 대해 지금 이야기하는 것입니다 Textacular는 원래 아론 패터슨에 의해 작성되었습니다 및 GitHub의에서 여기에서 살고있다 Textacular 전체 텍스트 검색 부분을 담당 쿼리의, 그리고 당신이 싶어한다고 가정 이 호출하기 때문에, 모든 텍스트 필드를 통해 검색 전체 텍스트 검색은 전체 텍스트 전체 텍스트 검색, 그래서 나는 테이블에, 기록에 같아요 그리고 그것은 당신에게 약간 변형 검색 옵션을 제공합니다 basic_search 및 퍼지 검색 및 고급 검색과 같은

우리의 목적을 위해, 우리 모두가 정말 걱정 이 basic_search이다 그리고 그것은 될거야 무엇을 가장 일반적으로 유용 당신은 하나의 필드의 종류를 구축 할 때 사용자가 다시 결과를 얻기 위해 사용하는 입력 그래서,는 다음과 같습니다 게임은 게임을 검색하는 경우, 모든 종류의 즉, 소닉, 소닉 더 헤지 호그를 포함 또는 슈퍼 소닉, 어떤, 나도 몰라 그리고 당신은 조금 더 복잡 얻을 수 있습니다 심지어 기본 검색으로, 말하기 제목 마리오, 시스템 요구 사항을 포함해야 닌텐도를 포함하지만 나는 어떤 마리오 타이틀을하려는 어떤 닌텐도 플랫폼에서

그래서 다음 간단한 유용한 물건의 일종이다 당신은 Textaculars로 할 수있다 그들을 섞는다 좋아, 그래서 다시 가서 해당 검색을 살펴 보자 우리는 썼다 이것은 이전과 같은 속편이다 어느 기사의 이름을 기반으로 제품을 얻으려면, 본문 또는 저자의 이름을 입력합니다

그래서 우리의 검색 결과는 레일 측면에 정말 간단합니다 우리는이 세 가지 라인 클래스를 만들 것입니다 우리는 Textacular을 거 포함하고 있으며, 우리는거야 ,이 기사에 속한다는 것을 그에게 우리는 그 분야의 문서 ID라는 이름 때문이다 그리고 우리가 실제로 사용 싶어 할 때, 우리 싶다면, 말, 쓴 기사를 찾아 샌디에 의해, 또는 그 샌디을 언급, 우리는 단지 샌디이 기본 검색을 수행 그리고 기사에 그 매핑합니다 당신이 조금 미친 싶었다면, 당신이 할 수있는, 당신은 셀 수를 포함 할 수있다 귀하의 기록에

셀 수는 매우 중요하고 매우 유용합니다 표준 라이브러리에 내장 된 루비의 기능, 그리고 당신이 그것에 대해 모르는 경우, 와서 나중에 나 한테 물어 주시기 바랍니다 그러나, 기본적으로는거야 당신에게 멋진 사람들을 모두 줄거야 각각의지도와 다른 모든 것들 그래서, 당신은이 클래스를 사용할 수있을 것 검색 새로운 점 결과, 쿼리, 다음 각 도트 그것이 어떤 종류 것처럼 그래서, 기본적으로, 당신은 그것을 치료할 수 다른 컬렉션 어레이 형상 컬렉션 그래서,이 뷰를 생성, 나는 지금 확신했는지 확인 해요 것을보기는 사용하기 좋은이며, 당신이 그들을 사용하고 싶습니다

을 사용하는 방법을 알고 싶으십니까? 그래서,을 만드는 것은 매우 간단합니다 당신은 액티브베이스 연결을 가지고 및 실행했습니다 그래서 이것은 이전에 당신이 할 수 실제로 바로 실행이 단축, 우리가보기 SQL을 만들 거 사용에있어 우리는 단지 화면에 있다고 그리고 그것을 드롭, 우리는 단지 말 다음 뷰의 이름을 뷰를 삭제하고 이 방법 내성을 변경하는 것입니다? 좋아, 잘, 찾아보기로 하죠

의 일부 기능 크리프를 살펴 보자, 우리는 항상 우리의 기능에 가지고 프로젝트 관리자가 다시 와서 말했다, 댓글이 기사는 쿼리와 일치 또한 결과에 표시해야한다 누군가는 코멘트에 샌디을 언급 한 경우 기사에 대한, 우리는 그에 표시하려면, 그 기사도 검색 결과에 표시합니다 그래서, 요약하자면, 우리는 지금 기사의에 검색하는 제목과 본문, 저자의 이름 및 주석 몸 그리고 이러한 것들 중 하나가에 관련된 모든 기사 검색 결과에 표시해야한다

따라서, 업데이트 된 SQL은 다음과 같습니다 업데이트 된 쿼리 그리고 새 부품이 새로운 조합이다, 매우 간단한 선택으로 우리는 본문에 당기있는 경우 및 가입 그리고 주석에서 문서 ID 그래서,이 업데이트보기 마이그레이션에 대해 알아 보겠습니다 우리가 할 수있는 일은 새로운 SQL을 던져 그 uprecord로, 단지 우리가 전에했던 좋아한다

그리고, 불행하게도, 우리는 무엇을해야 할 아래로 마이그레이션 넣어됩니다 그에보기 오래된 텍스트 마이그레이션 아래로 우리가 롤백 할 때 그래서, 레일에 데이터베이스를 넣어 어떤 상태 알고있다 즉 고통의 일종이지만, 우리는 그것을 처리 할 수 ​​있습니다 그것도 나쁘지 않다 그리고, 불행하게도, 우리는 항상 업데이트 할 수 없습니다 당신은 실제로 뷰에서 모든 열을 제거 할 수 없습니다 우리는 우리가 롤백 할 때 일을 할 일이있는 이 마이그레이션, 우리는 더 이상이 없기 때문입니다

아, 아니, 미안 해요, 아니 우리는하지 않습니다 하지만 당신이보기에 새 열을 추가 한 경우 그래서 더 많은 정보를 가지고, 말 이전부터 칼럼에서 그 활성 당신이 말한다면, 우리가 정말 필요가 없습니다 더 이상 열에서 그 활성의 그를 제거 할 수 사용자 최근 활동에서, 당신은 그냥 업데이트 그렇게 할 수 없었다 그래서, 당신은 그냥 먼저 그 볼을 드롭한다 무엇을해야, 후 다시보기를 만들 수 있습니다 그리고 다시, 우리는 전체 SQL 덤프 필요 마이그레이션에

그게 안됐다 또한, dB / schemarb에보기를 덤프 할 수 없습니다 그래서 그것의 해결책은 레일을 얘기하는 것입니다 데이터베이스 형식 거 구조 할 수 있는지, 다음은 structuresql에 거 덤프입니다 그것은거야 실제, 포스트 그레스 SQL 버전을 덤프 것 전체 데이터베이스

죄송합니다 다행히, 우리는, 관광 번째 보석을 가지고 이는 마이그레이션에 몇 가지 방법을 추가, 그리고, 뷰 dB / schemerv으로 덤프 될 수 있도록 그냥 일반적으로 기대하고, 무엇 인 함께 일할 조금 더 쉽게 볼 수 있습니다 물론,이에 작은 손을 가지고 있었다 나는 두 테이너 중 하나입니다, 다른 하나는이 보석으로,이 방에있다

그래서,이 경치 마이그레이션을 생성 매우 간단합니다 중동이 넘어 읽을 수 있지만 당신은거야 는 SQL 파일 기본적으로 그냥 쿼리 부분에 쓰기 보기의 그래서 당신이보기 구문을 만들에 대해 걱정할 필요가 없습니다, dropview 구문, 그것은 당신을 위해 처리 할 수 ​​있습니다 그리고 당신은 그것을로 쓰고 있기 때문에 당신이 실제로하는 SQL 파일로 쓰기 그래서 당신은 편집기 지원의 어떤 종류가 있어요 당신의, 당신도 알다시피, 빔 또는 TeamUp 또는 고상 사람들이 요즘 사용하는 어떤 또는, 내가하지 않습니다

당신은 당신을 제공하는 어떤 혜택을 얻을 그래서 광산은 나에게 들여 쓰기와 멋진을 제공합니다 구문 SQL에서 강조 그리고 마이그레이션의 구문, 당신은 실제로 단지,이보기를 만들 수 있습니다 가역적 인 단지 테이블을 만들 좋아 그리고 당신은 그 변화의 방법을 사용하여 다시 갈 수 있습니다 그리고 당신이보기를 변경해야하는 경우, 당신은 실제로 단지이 업데이트보기를 할 수 있습니다 , 당신은 어떤 버전 번호를 얘기하고, 알고 이름 지정 규칙에 따라 어떻게 새를 찾을 수 그리고 SQL의 이전 버전, 뷰의 SQL의

그것도 조금 기억하기 힘든, 그래서 우리는 약간의 발전기를 만들 않았다 우리는 실제로 monogenerator을 가지고, 즉, 저를 읽거나 읽기 전용 당신을 제공합니다 그리고 이름을 유추 뷰의 이름을 기준으로 모델, 그 이름이 일치 할 정도로, 그래서 당신은 세 가지 라인의 방법으로 끝낼 아니면 한 줄 방법과 같은, 파일에 다섯 줄의 총 그리고 당신은 그 SQL 파일로 작성하는 경우 그것의 첫번째적인 버전, 그래서 바로 다음과 같습니다 검색어, 우리는 그냥 쓰기 이것은 앞에서 같은 SQL이다

매우 간단하고, 그는 SQL 파일에 살고, 이 훨씬 쉽게하도록 읽고보고 당신은 당신의 편집기에있을 때 우리는 또한에 대한 뷰 생성을 해당보기를 업데이트해야합니다, 그래서 당신은 다만 수 오히려 관광 모델보다, 당신은 경치를 볼 할 수 있습니다 나는 노트를 필요가 없습니다 그리고 그것은 당신에게의 다음 버전을 줄 것이다 뷰의 다음 숫자 버전 그리고는 SQL의 이전 버전에서 덤프 당신은으로 업데이트 할 수있는 어떤 당신은 추가 할 필요가 있었다

이제, 일부 성능에 영향이 확실히있다 이 방법 내가 언급 한 바와 같이,이 쿼리는 매우 느립니다 그것은 세 가지 서로 다른 테이블을 통해 검색 할 수있다 과 열 몇은 우리에게 모든 결과를 얻을 수 있습니다 우리는 필요 그럼,이 내려 온다 위해, 실제로 크기, 속도가 느린 이러한 결과를 얻을 수 있습니다 그리고, 불행하게도, 뷰는 인덱싱 할 수 없습니다

다행히, 기본 테이블이 있습니다 그래서, 여기에 권장 사항은 인덱스를 추가 할 수 있습니다 인덱스의 몇 가지 종류가 있습니다 당신이 가장 잘 알고있는 사람은 BTREE입니다 BTREE는 열에 정확히 일치에 좋은 곳입니다 그래서 텍스트 또는 중도 같은, 문자열 일치는 BTREE와 괜찮아

당신은 그와 함께 히트 인덱스를 얻을 수 있습니다, 확실히 당신은 그냥있어 기본 키에 대한 아이디 또는 UUID를 찾고 사람들은 중대하다 전체 텍스트 검색의 경우, 우리가 관심있는 사람 GIN와 GIST 있습니다 일반화 된 역 색인을위한 GIN 스탠드, 및 GIST는 일반화 된 반전 검색 트리를 의미합니다 다시 사용하지 않을거야 몇 가지 정보가있다

GIN 조회는 일반적으로 빠른 약 3 배 GIST보다, 그들은 또한 걸릴에 대한 세 번 구축 할 이상 GIN 인덱스는 적당히 느린 GIST 인덱스보다 업데이트하려면 그들은 디스크에 두 ~ 3 배입니다 그게 무슨 뜻 이죠? 누가 무슨 상관이야? 이것은 무엇을 의미입니다 당신이없는 경우에는 GIN를 사용해야합니다 데이터베이스의 행 수십만 이상 차단 기록에 대해 걱정하지 않은 DB를, 당신은 인덱스를 추가하는 늦게 게임에서, 당신은 디스크 공간에 대해 걱정하지 않는다

아마 2016 년을 왜냐하면 그리고 당신은 우리가 최적화하고, 매우 빠른 조회를 원하므로 에 대한 읽기 무거운 우리가 같은 로그 관리자 또는 무언가를 구축한다면, 우리가 쓰기 무거운 최적화 할 것이다, 어쩌면 GIN은 올바른 해결책이 아니다 그래서 만약 당신이, 다른 한편으로는, 당신은 GIST를 사용해야합니다 매우 큰 테이블, 수백만, 기록의 수십억 거기에 당신이 인 경우에 크기 순서가있다 그 둘 사이에, 그것을 알아 내기 위해 당신에게 달려 있습니다

나는 컨설팅에서 일하고, 당신은 저를 지불 할 수 있습니다 성능에 문제가 있으면 당신은 그것을 사용해야합니다 지금, 나는 그 말을 할 때, 난 당신이 현재 성능 문제가 있다는 것을 의미, 당신이 그 미래에 우려하지 않는 것이, 당신은 성능 문제가됩니다 경우, 어떤 이유로, 그것을 사용한다 디스크 공간이 중요하다, 그것은 1994입니다 테이블은 매우 쓰기 무거운 경우 그리고 당신은 그것을 사용해야합니다 내가 말했듯이, 로그 aggravators이의 좋은 예입니다

그래서, GIN로 그 인덱스를 추가하는 것은 매우 간단합니다 다음은 우리가 사용하고 네 개의 필드입니다, 당신은 단지 GIN를 사용하여 레일이 그것을 처리하는 방법을 알고 말한다 구체화 된 뷰는 우리가 할 수있는 또 다른 방법입니다 이 성능을 향상시킬 수 있습니다 구체화 된 뷰는 도구를 미리 채울 수 있습니다 뷰의 결과 그래서, 그것은 거 실행입니다 그 전체 검색 쿼리 우리가 가진 것을, 그리고 그 모두를 저장하는 것 임시 테이블에 발생합니다

그래서 우리는 여전히, 말하자면, 400 밀리 초를 지불 때마다 우리는 테이블을 만드는,하지만 우리는 할 수 임시 테이블에 대해 쿼리, 이미에서 결과를 가지고있는, 그것은 훨씬 더 빨리, 많이입니다 그래서 우리는 그 결과 집합에 대해 쿼리, 오히려 전체 쿼리를 수행하는 것보다, 그것은 크기의 다른 순서는이다 빨리 ILIKE가에도보다 이 인덱스없이 그리고 구체화 된 뷰의 단점 , 항상 업데이트되지 점이다 그것은 그 임시 테이블에 저장되어 있기 때문이다 당신은 당신이 원하는 때 말할 필요 400 밀리 초이 업데이트가 일어나고받을 것을 지불 또는 그러나 긴 쿼리가 소요됩니다

그리고 당신은 원하는만큼 그렇게 할 수 있습니다, 당신은 SQL에서 트리거, 재 작성에 그렇게 할 수 또는 후 커밋 후크, 다음과 같습니다 또는 당신은 타이머, 아마, 그것을 할 수 있습니다 검색 결과는 항상 최신 상태로 할 필요가없는 경우, 당신이, 당신은 알고있을 수는 heropi 일정, 또는 10 분마다, 또는 시간, 또는 하루, 또는 무엇이든을한다 그래서 당신이 중 하나 포스트 그레스 트리거로 그렇게 할 수 있습니다, 독자, 또는 운동 후 후크를 저지 레일, 그것은 다음과 같습니다 음, 좋아, 무엇을 몇 가지 사전 구축 된 솔루션에 대한? 선택의 여지가 거기있다 그리고 나는 우리가 그들을 볼 것 말 했는가 우리는 어느 타이어와 elasticsearch있어 또는 질긴와 elasticsearch 레일, 당신의 모델에 얼마나 많이 알고있는 사람을 포함합니다

나는 많은입니다, 알고있다 당신은 태양 흑점하지만, 이런 젠장 통해 SOLR를 사용할 수 있습니다 ThinkingSphinx와 스핑크스 실제로 사용합니까 별도의 파일,하지만 여전히 같은, 나는이 중 하나가 무엇을 의미하는지 모른다 내가 왜 이것을 파악해야합니까? 나는 이미 내가 SQL을 알고, 일을 알고있다 좋아, 그래서 이러한 서비스에 큰 무엇 vacidid 검색입니다

검색은 하나의 상자처럼 보이지 않는 경우, 그것은 아마존의 사이드 바, 다음 전체 텍스트 검색과 같은 , 거 작업하기 좀 더 어려울 수있다 나는 인정한다 또는 포스트 그레스 '전체 텍스트 검색 이러한 다른 도구뿐만 아니라 당신을 위해 전체 텍스트 검색을한다 이 모든 것들이, 개발 컴퓨터에서 실행해야 그들은 생산 시스템에서 실행해야 그들이 실행해야 할 것을 의미한다 그들은 컴퓨터에 속도를 늦추고있어 당신은 이러한 종속성을 모두 처리해야 당신은 또한 그들과 거래해야 때마다 당신은 당신의 시스템에 업데이트를하고 있습니다

혹시 해당 버전을 변경하는 경우, 당신은 필요 확인하십시오 개발 및 produciton로 만들려면 혹시 다시 갈거야하는 경우, 모두 동일한 버전입니다, 당신은이 처리되고 있는지 확인해야합니다 엉덩이에 큰 고통 그들은 모두 테스트에서 위조 할 필요가, 당신은이를 사용하여 실제로되고 싶지 않기 때문에 가지 시험에 살고 있습니다 사실, 나는하고 있던 동료 몇이 있었다, SOLR, 내가 믿고, 훌륭한 기능을 사용하고 SOLR의 그것의 인덱스를 동기화한다는 것입니다 같은 서브맵에서 그들이 있었다 때문에 모두 작업에 앉아 자신의 작업 컴퓨터에서 같은 IP 주소를 가지고 외부 IP 주소, 자신의 테스트 인덱스 서로간에 동기화되고 있었다 그리고는 일주일 동안 많은 재미였다

이 모든 모델에 cruft에 많이 있습니다 나는 몇 가지를 말했지만, 그것은 전부입니다 그리고 데이터베이스에서 데이터 우려 제거 데이터베이스, 그래 그들은 모두 궁극적으로이 비밀의 구문을 가지고 있고, 그들은 나이 얼굴을 확인합니다

따라서, 결합하여,보기를 구체화 전체 텍스트 검색 및 레일의 마법, 우리는 정말 멋진 검색 기능이 그 새로운 종속성을 필요로하지 않습니다, 그리고 웃음이 나와 고맙습니다 (박수 갈채) (낙관적, 행복 음악)

RailsConf 2017: ​Postgres at Any Scale​ by Will Leinweber

(입문 팡파르) – 좋아, 모두 내 이야기에와 주셔서, 덕분에 오신 것을 환영합니다

나는 어떤 규모의 포스트 그레스에 대해 이야기 왔어요 일부 연락처 정보를 시작합니다 당신이 나중에 어떤 질문이 있으면, 내 트위터는 Leinweber도있다 나는 윌 Leinweber도 해요 그리고 내가 일하는 회사는 Citusdata이며, 그리고 우리의 웹 사이트가있다

저를 모르는 분들을 위해, 내 멋진 보석 번들을 설치했을 수 있습니다 어느, 그것은 모든, 그것은 들러가 필요하다 그리고 나는 오래 전에이 만든 당신이 알고 있기 때문 후에는 좌절 번들은, 등등 설치, 업데이 트를 묶어서 하지만 설치 가고 싶어 할 때, 당신은 보석이 들러를 설치해야했다 그리고 그 실수 나 자신을 질린 너무 여러 번, 나는 그냥이 보석을했다 그리고 그것은 모두는 보석 사양입니다

그래서이 가장 많은 수 있습니다 어떤 보석의 코드 라인 당 다운로드,의 그래서, 당신은 그래서 당신의 시스템에서이있을 수 있습니다 가서 그래서, 어쨌든,이 이야기, 나는거야 A의 삶의 세 가지 단계 로 시작하는 포스트 그레스 데이터베이스 당신이 막 시작하고 있으며 사용자의 데이터가 작은 경우, 어떻게 포스트 그레스의 기능을 잘 활용하려면 그 작은 규모

그리고, 당신은 중간 크기로 얻을 때, 방법 변경의 종류, 어떻게 작업을 위해 일 매체는 포스트 그레스 데이터베이스 크기 그리고 당신은 매우 큰 규모에 도착하면, 당신은 많은 양의 데이터를 처리 할 수있는 방법에 대한 몇 가지 전략 그래서, 당신은 큰 크기에 대해 이야기 할 때, 당신이 의미 할 수있는 몇 가지 다른 일이있다 포스트 그레스의 적절한 사용은 다르게에 따라 달라집니다 하고, 또한 데이터의 흐름에 대한 전체 데이터의 크기 : 당신이 시스템에 넣어 얼마나 많은 데이터, 얼마나 많은 데이터에는 시스템에서 당겨 있습니다 그 데이터의 조금을 가진 데이터베이스, 하지만 당신은 지속적으로 쓰고 읽고 데이터베이스 다르게 행동 할 것입니다 그 많은 양의 데이터가있을 수 있습니다,하지만 당신은 오직있어 어쩌면 가장 최근의 양, 같은 읽기, 그리고 당신이 정말로 오래된 물건을 만지기 아닙니다

당신이 설계보고있는 때, 이들은입니다 서버의 사용자 시스템뿐만 아니라 어떤 종류의 당신이 당신의 데이터베이스 등이 필요 그것은 모두 보는 것이 중요합니다 당신이해야 할거야 전체 크기, 당신이 가고있는 데이터 처리 사용할 수 있습니다 그래서, 당신도 시작하기 전에, 당신이 할 수있는 경우는, 계획 할 데이터베이스가 결국 어디로, 여기서 응용 프로그램이 끝날 것입니다 그리고 그것은, 물론, 당신은 알고 있어요 쉽게는 말처럼 종종 상황이 작은 시작, 그냥 통제 눈덩이처럼 불어 유지 당신이 불에서 스크램블링하는 동안 발생합니다 그리고 다음은 데이터베이스 부분을 무시하는 것은 쉽다 그것은 조금 너무 늦게 될 때까지

그래서 나는이 이야기에 일의 몇 가지 희망 그것을 위해 준비하는 데 도움이됩니다, 당신이 작은 경우 장소에서 몇 가지를 넣어 당신은 넣어의 정렬 시간이 대신에 이러한 제약의 일부 첫째, 백업을하시기 바랍니다되는 최초의 일 이제, 당신이가는 모든 데이터베이스 이야기, 사람이 같은 말 것입니다 "당신은 백업을해야합니다" 그리고 네, 당신은이 작업을 수행해야합니다 그리고 그것은뿐만 아니라 백업을 수행하는 것이 중요합니다, 뿐만 아니라 수시로 복원 그들이 좋은 것 확인합니다

당신이 막 시작 때 그리고 당신은이 작업을 수행 할 수 당신의 데이터베이스가 작은 아는의 피드백 루프 때문에 장소 도움에 당신은 좋은 백업 시스템을 가지고있다 데이터가 작은 경우는 훨씬 쉽게 전체 백업 / 복원주기 때문에 훨씬 빠릅니다 그리고 당신은 아마 많은 일이 없습니다 시스템에 비해, 당신을 방해하는 그 잠시 생산에서 실행되고있다 당신은 또한 작은있을 때, 포스트 그레스와 함께 제공되는 도구, pg_dump의, 아주 잘 작동하는 것입니다 무엇 pg_dump의가하는 것은 논리적 백업을 걸립니다

그래서, 그것은 당신이 그것을 복원해야하는 경우 의미 다른 시스템 아키텍처, 포스트 그레스의 다른 버전, 그건 그냥 잘 작동합니다 우리는 조금 나중에 얘기 할거야 라고 어떤 않습니다에 대한 다른 도구 물리적 인 백업 및 하나, 그렇게에서 동일한 버전과 일치해야합니다 그리고, 당신도 알다시피, 다시 한 번, 그것은 매우 중요하다 당신은 당신의 백업을 테스트하는 것이 당신은 전에이 말을 듣고있다 당신은 그것을 다시 듣게 될 것입니다

내가 다시 말거야, 그것을 전에 말했다 그냥 매우 중요하기 때문이다 알다시피, 그 테스트 해보십시오 당신은 상황이되고 싶지 않아 가지에 불이있는 곳, 당신이 당신의 백업이 작동하지 않는 것을 발견하면 그입니다 그래서, 난 그냥이 충분히 강조 할하시기 바랍니다 중요한 것은, 그러나, 나는 생각이 흥미 롭다 당신은 작은 크기에있을 때 포스트 그레스에 대해 생각하는 당신이 포스트 그레스 그 제약 조건을 받아 들일 수 있다는 것입니다 당신이 할 수 있습니다

그것은 당신이로 선택할 수 있습니다 제약의 거대한 숫자가 있습니다 그리고 내가이에 대해 생각하고 싶어요 당신이 가정을 적용 할 수 있다는 것입니다 당신은 당신의 데이터에 대해 가지고 지금, 당신은 저장 될 수있다, 당신은 항상 생각 나는이에 저장하고있어이 모든 정수, 같은 그것은 사용자의 연령이나 로그인 횟수입니다 당신은 항상 양수가 될 것이라고 생각할 수 있습니다 나는 당신을 보여줄거야 포스트 그레스의 방법이 있습니다 당신은이 사실로 적용 할 수있다

그 방법은, 당신의 코드에서 단지 가정이 아니다 즉, 거기에 존재하는 데이터에 의존 하지만 데이터베이스 수준에서 그것을 적용합니다 그리고 이것은 정말 벅에 가장 탕입니다 당신은 포스트 그레스에서 얻을 수 있습니다 나는 사람들이 생각 생각하지 않는다 실제로만큼 많은 포스트 그레스의 장점이있다 당신이 포스트 그레스로 할 수있는 톤이있다 팬시 공통 테이블 표현식, 인덱스 유형, 등등 비의 인덱스 유형과

그러나 나는이 포스트 그레스의 이름없는 영웅의 종류라고 생각합니다, 우리는에 갈 것입니다 그래서, 그것은 또한 나에게 긴 시간을했다 이 실현이 제한 시스템에 와서 그것만큼 강력하고 유용하다 당신은 내가 많은 사람들이 알고 확신, 알고 고유 한 열이있는 경우, 그냥 말할 충분하지 않습니다 독특하고 레일의 유효성을 검사, 이 후드 아래에 변경 될 수 있기 때문이다 그래서, 당신은 고유를 둘 필요가 데이터베이스 제약 내부 그래서, 많은 사람들은 알고있다

그러나 이러한 다른 모든 제약 조건 우리는에 갈 거라고, 어떤 이유로 또는 다른 들어, 그들은 훨씬 덜 잘 알려진 것처럼 보인다 그리고 레일에도 불구하고의 일을 대중화 수용 제약, 그런 종류의 데이터베이스 계층에서 멈췄다 그리고, 적어도 초기 몇 년 동안 이력 레일, 데이터베이스는 것처럼 처리 교체 해시있다 그리고 당신은 하나의 데이터베이스에서 다른 데이터베이스로 교환 할 수있다, 그 모든 좋아요 그러나, 그 자신을 구독하지 않습니다

난 당신이 하나의 데이터베이스를 선택할 수있는 경우라고 생각 정말 그 특징을 사용하여 자신의 제약을 받아, 및 응용 프로그램에서 그 개념을 유지 이 데이터베이스에 이르기까지, 당신은 당신의 데이터베이스가 당신을 위해 많은 것을 할 수 있습니다 그리고, 지난 몇 년 행복 있다고 해요 ORM의 활동 기록, 그리고 내가 좋아하는, SQL, 더 많은 데이터베이스 관련 기능의 이상을 사용 할 수있다, 대신 최소한의 공통 분모의, 기능은 SQL 데이터베이스의 모든 걸쳐 설정합니다 나는 이것이 매우 중요하다고 생각하는 이유 때문에, 이제 당신이 버그를 쓰기 가정 해 봅시다 일정한 속도로, 데이터베이스를 수정하는 사이, 당신의 코드를 수정 그리고 난 당신을 의미합니까 나는 버그에게 자신을 작성한 적이 없습니다

내 코드는 완벽합니다 (청중 웃음) 그러나 나는 이런 것을 이해합니다 그래서, 당신은 당신이 일정한 속도로 버그를 작성하는 것이 말한다면, 문제는 코드가 변경이다 훨씬 더 자주 당신은 당신의 데이터베이스 스키마를 변경보다 그냥 예를 들어, 내가 작업하고 애플 리케이션 중 하나, 그것은 오래된 년 조금 넘는입니다 그것은 71 마이그레이션을 받았어요, 그러나 1200 출시를 통해 있었죠

그리고, 그 자료 하나 하나에, 버그가 생산에 도입 할 수있는 기회가있다 그러나, 데이터베이스에 이렇게 몇 가지 변화가 있기 때문에입니다 그에 비해, 그것은 그 권리를 얻기 위해 쉽게 나쁜 데이터에 대해 지난 가드의 일 종류가 있습니다 그래서, 당신은 당신의 애플리케이션 코드에 뭔가를 얻을 경우 그 일부 일치하지 않는 데이터를 쓰기 시작, 어쩌면 데이터베이스가 일관성이 싫어, 하지만 응용 프로그램의 논리와 일치, 당신은이 잘못된 데이터 작성에 갈 수있다, 알고 주 동안 당신은 발견하기 전에 그리고이 끔찍한있다, 때문에 할 수있는 무서운 정리 프로세스 당신은 사실이고 무엇을하지 무엇을 알아낼 수 없습니다 그리고 그와 같은 혼란을 정리, 나는 그것이 일어날 봤어요

나는 그 통해 작업하는 사람들과 함께 일했다 그것은 정말 악몽입니다 그래서, 당신은 당신의 데이터베이스 정렬을 사용하는 경우 잘못된 데이터에 대한 방어의 마지막 줄에, 같은 물론 응용 프로그램에서 버그를 원하지 않는다, 하지만 당신은 당신의 데이터베이스를 가질 수 있다면 거부 이 잘못된 데이터의 일부, 당신은 더 나은 위치에있을 것입니다 그래서, 나쁜 데이터를 얻을하지 않습니다, 다음 또한 거부하고있는 데이터베이스와, 배포 할 때 바로 알 수 있습니다 생산 나쁜 일 당신은 당신의 응용 프로그램 로그에 오류를 받기 시작 것이기 때문에 당신의 데이터베이스는 이러한 쓰기를 거부했다 그리고 그래서 매우 간단 시작하자 이것은 어쩌면 간단한 제약 조건입니다 당신은 당신의 데이터베이스에 넣을 수 있음 null이 아닌 컬럼에 추가하고있다

어떻게 간단한이 하나가에도 불구하고, 나는 응용 프로그램으로 다시 시간과 시간을 볼 것을, 때문에 기본적으로 테이블을 만들 때, 당신은 null이 존재하게 선택해야합니다 정말 SQL 표준은 다른 방법은 주변에 바란다 모든 열은 기본적으로 널 (null)되지 않은 경우 당신은, 말을 "좋아,이 하나, 나는 널 (null)을 허용하고 싶다"했다 그러나, 불행하게도, 그것은 우리가 살고있는 세계가 아니다 그러나,이 같이 간단하게, 나는 지금 내기 당신이 당신의 응용 프로그램을 보면, 당신은 아, 물론, 내 모든 사용자가있다 "라고 말할 수 있습니다 이메일 주소 " 또는, 당신은 그런 일을 알고있다

하지만 그건 기본 키 아니라면, 그는 null되지 아니라면, 당신이 지금 찾아 가면, 거 좀 이상한 경우가 있어요 뭔가 잘못 가서 곳 NULLed 아웃됩니다 그리고 이것은만큼 간단하고, 당신이 생각하는 것 이런 것들의, "아,이 항상 있어야합니다" 즉, 데이터베이스에 그 시행 갈 수있는 기회입니다 당신이 말하는 경우 조금 더 높은 최대로되어 이동, "내 모든 사용자는 고유 이메일 주소를 거 가지고있다"고 말했다 가서 고유 색인 확인하십시오

지금, 당신은 성능 처벌의 약간을 지불 당신은 당신이 사용하지 않는 인덱스를 만드는 경우 그리고 그 유일한 방법은 당신이 할 수 있어요 고유의 열을 적용, 고유 인덱스를 갖는 것입니다 그러나 게임이 단계에서, 당신은 아주 작은 응용 프로그램있을 때, 그것은 그 성능 타격을하는 것이 좋습니다 당신이 그것을 통지하지 않을거야 때문에, 그리고 일이 고유하게 적용 할 수있다 그리고 나중에, 당신은 알고있다 신청 후가이 진행되고, 이 실제로 병목 경우, 당신이 가서 나중에 놓을 수 있습니다 그러나 가서 당신의 모든 열을 통과, 당신이 같아 당신의 모든 테이블, "이것은 고유해야합니다

" 가서 그 고유합니다 또한 매우 흥미로운 다른 것들 중 하나 포스트 그레스는 할 수 있다고는 할 당신은 두 개의 서로 다른 열에서 고유을 가질 수 있습니다 그래서, 예를 들어, 당신은 예약이있는 경우 나는 사람이하고 싶지 않아 물건의 종류 같은 사람과 같은 두 개의 예약, 같은 다른 방, 당신은 그 모두에 고유 인덱스를 만들 수 있습니다 그래서, 당신은 한 사용자가 여러 예약을 할 수 있습니다, 와 한 방에 여러 예약을 가지고, 하지만 함께, 그 순 하나의 세트입니다, 그것은 당신이하는 매우 강력한 것입니다 활용할 수 있습니다 다른 약간은 데이터 유형에 대해 생각하는 것입니다 제약으로

포스트 그레스에 대한 위대한 업적 중 하나는 것입니다 당신은 데이터 유형의 정말 다양한처럼있다 당신은 다양한 정수, 다양한 텍스트 열을 가질 수 있습니다, 그러나 당신은 또한, 같은 데이터 유형을 가질 수 있습니다 나는 하나 개의 프로젝트는 INET 데이터 형을 위해 사용 내가 MAC 주소를 저장하고 있기 때문이다 그리고 나는 확인을 할 수 있었다 만 유효 MAC 주소에있는되었다 이점 때문에 약간이 있었다 그냥 바이트 수로 저장 오히려 문자열보다 하지만 실제로, 그것은 단지 가지 좋은했다 만들 난 아무것도 잘못되면 알고 있는지, 나는 누군가의 이름을 얻을 않을거야 MAC 어드레스 컬럼 내부

마찬가지로, 그만큼 가능성, 나는 그 예방할 수 있음을 알 수 있습니다 당신이 할 수있는 또 다른 일들이있다 나는 어떤 사람에 대해 흥분하기 시작 보았다 포스트 그레스의이 부분은 쓰기 시작 자신의 데이터 유형 확장 시스템 때문에 실제로 매우 간단합니다 그래서 당신은 당신의 자신의 의미 론적 데이터 유형을 팝업 할 수 있습니다 데이터베이스에있는 좋은입니다 그리고, jsonb는 몇 살 새로운 데이터 유형입니다 그리고 이것이 대해 아주 좋은거야 당신이 JSON을 저장하는 경우, 그것은, 당신은 확실히, 첫째을 알고, 할 수있다 가 잘 형성되어 있다고 할지라도 당신은 사용하지 않는 특별 사업자의

그러나 특정 사업자의 톤이있다 당신은 내 및 데이터를 얻을 수 있습니다 그리고 다른 회담에 큰 맥락의 무리있다 데이터 형의 종류를 사용하는 방법에 대한의 jsonb, 같은해야하고, 반 구조화 된 접근 방식의 종류, 내 테이블의 대부분을에서 사용하는, 의 당신은 알고 갖는, 내 진짜 열 몇, 등이 다음 jsonb 열 내 반 구조화 종류의 모두의 장점을 얻기 위해 가방을 잡아 관계형 모델과 다음 종류의 같은 NoSQL의 모델을 반 구조화 난 정말이 슈퍼 코드 무거운 이야기되고 싶지 않아, 그러나 이것은이 하나를 과시 조금 더 많은 작업이었다 정말 멋진 범위 데이터 유형 중 하나 이는 특히 사이, 슈퍼 잘 알려져 있지 않다 개발자 레일은 다양한 데이터 유형이다 그래서, 이것은 시작과 끝을 저장 함께 하나의 열이다

그리고 당신은 같은 정말 멋진 일을 할 수있다 , 시작이 끝나기 전에 항상 있는지 확인 같은, 그것은 단지 당신을 위해 일 그렇지 않으면, 그것을 다시 실행됩니다 이 독점 범위라고 말할 수 있습니다, 가 포함 또는 끝을 제외하면 당신은 알고있다 당신은 번호로 사용할 수 있습니다 나는 오직, 타임 스탬프를 사용했습니다 종류의 일을합니다 그리고 이것은 우리의 청구서 테이블에서 직접 사실이다

당신이 우리와 함께 형성을 만들 때 우리가 할 것은,이다 당신이 그것을 만들 때 우리는 저장, 다음, 종료 시간, 우리는 포스트 그레스로 저장 당신이 무한 타임 스탬프를 처리 할 수 ​​있습니다 그래서, 우리는 무한으로 끝을 저장합니다 그리고 당신은 그것을 다음 프로비저닝을 해제 할 때, 우리가 표시 그 마지막 기간으로, 그리고 우리는 확인 할 수 있습니다 몇 가지 추가 작업의 작은 비트, 이 기간에는 중복이 없다는 것을 그래서, 어떤이라고하는 것은 제외 제약 조건입니다 그래서, 우리는 우리가 결코 실수를하지 않으려는 말할 수 같은 형성에 두 번 사람을 청구합니다

따라서, 예를 들어, 우리는 뭔가 가격을 변경하는 경우, 우리는 이전을 종료하고 새로운 일을 시작합니다 그들은 모두 중복 경우 그것은 재앙이 될 것입니다 그리고, 물론, 우리는 코드에서 검사를 가질 수 확실히 발생하지 않도록합니다 하지만이 데이터베이스에서 수정 한 내 마음 오프 너무 많은 무게이었다 데이터베이스가 거부 할 것이라는 것을 알고 초래 사물의 모든 종류의 잘못 사람을 청구 여기에서 약간의 트릭이있다

우리는 우리의 차 열에 대한 UUID를 사용하고 있습니다 그리고, 불행하게도, 당신은 쉽게 UUID를 사용할 수 없습니다 제외 제약한다 그리고 우리는이 작은 해킹을 발견했다 그리고 어떤이가하는 것은 포스트 그레스의 내부 방법입니다입니다 즉 UUID 소요 단지 바이트 어레이로 송출한다 그리고 바이트 배열은 절제 제약에서 작동합니까, 그래서, 그것은 당신이해야 할 것은 불행한 일이다 하지만 좋은 약간의 트릭입니다

그리고, 열거 이 사람, 나는 매우 자신에 판매하고 있지 않다 마찬가지로, 지금 그들에게 점점 더 사용하고 있습니다 예를 들어, 그들은 같은 매우 좋은 것 당신이하지 않은 키 작은 세트 가는 너무 많은 변화한다 따라서, 예를 들어, 내가 AWS 지역을 위해 그들을 사용하고, 확실하기 때문에, 그들은 시간이 지남에 이상의 영역을 추가하려면, 하지만 그것은 종종있다

그리고 이것은 단지, 같은 작은 오타를 방지 나는 한 번 내가 대신 "WEST"의 "USWAST1"고 말했다 알고, 같은 수동으로 IRB는 다음 저장되었다가, 그것은 추적하기 어려웠다 그래서,있는 것은이 작은 작은 오류를 방지 할 수 있습니다 그리고, 모두가 충분하지 않은 경우, 나는 많이했다 알고있다 하지만 그건 충분하지 않습니다 경우, 포스트 그레스는,이 마지막 일을 가지고 이는 정말 굉장합니다, 점검 제한 조건이라고합니다 그래서, 당신은 기능을 대개 PL / SQL 및 포스트 그레스에서, 그러나 나는 또한 PL / V8이 짓을했는지, 이는 당신이 포스트 그레스 내에서 자바 스크립트를 실행할 수 있습니다 내 점검 제한 조건에 대한 것을 사용합니다

그리고 어떤이는 것은 당신이 정의하는 기능이며, 모든 시간은 쓰기를 수행 삽입, 갱신, 다만, 그 일이 당신의 행을 실행 그리고 당신은 "이 좋은 또는 나쁜가요?"라고 말할 수 있습니다 그리고, 이러한 방법으로, 당신은 같은 일을 할 수 당신은 양수 원하는 것을 말할 수있다 아마, 어떤 이유로, 당신은 단지 원하는 피보나치 수를 저장합니다 당신은 그런 검사를 할 수 있습니다 마찬가지로, 정말, 당신은 지정 유효성 검사의 어떤 종류를 알고 당신이 원하는 것을, 당신은 할 수 있습니다 솔직히,하지만,이 종류의에 아마 점감 돌아갑니다

마찬가지로,이 같은 종류의 것입니다, 나는 어떤 점검 제한 조건을 사용하고 생각하지 않는다 지금 생산한다 그것이 있다는 걸 알고 좋은 데요, 그러나 이것은 어쩌면 너무 멀리 조금을 받고있다 그리고 그 작은 크기에 그것을합니다 중간 크기에 대한 자세한 생각, 이것은 당신이 시작 어쩌면 때, 당신은 알고있다 100 기가 이상 받고, 또는 당신은 쓰기를 많이하고 시작합니다 이 기간에 대한 흥미로운 것은, 내가 함께 이야기를 가하고 때, 나는 대부분의 사람들은 지출하지 않는 것을 깨달았다이다 여기에 시간이 훨씬

하나는 작은 유지하는 응용 프로그램은이다 아니면 그냥 바로를 통해 촬영하는 것 하나입니다 큰 스케일까지 매체 하지만 여전히 데이터베이스 보는 몇 번있다 이 단계에서 몇 가지 개선을합니다 그래서, 희망 당신은 좋은 위치에있어 제약 및 데이터 유형 및 이전의 모든 것들 되지 않은 경우,이 검토를 갈 수있는 좋은 시간이며, 다음 몇 가지 숙제를 우리가 볼한다면, 우리는 좋은 공간에 걸 저희 데이터베이스의 구조와, 가장 큰 차이는 여기 당신은 당신의 데이터베이스에 RAM이 부족 시작 캐시 된 모든 것을 유지합니다

그래서, 당신은 오래된 데이터를 삭제하는 등의 몇 가지 전략을 수행 할 수 있습니다 즉 가지, 도움 하지만 그냥 가지 문제를 연기하는 경향이있다 당신이 pgdump 논리적 백업을 수행 할 때입니다 꽤 더 이상 작동하지 않습니다, 여기에이 도구, 월마트-E, 저와이 쓴 내 동료에게, 우리는 5 년 Heroku가 포스트 그레스 보냈다 우리는 모든 단일 데이터베이스 클러스터에서이 작업을 실행 Heroku가에, 우리는 오늘을 사용하고 있습니다 그것은 모든 오픈 소스입니다 당신이 직접 데이터베이스를 실행하는 경우, , 월마트-E를 사용하십시오 제발, 제발

그것이 무엇을하는 것은 그것은 쓰기 앞서 로그 파일을 소요 포스트 그레스 생성하고 그것을 보내는 기계 떨어져 S3합니다 다른 다시 플러그인 끝이있다, 당신이 그렇게 푸른 또는 GCE 또는 무언가를 사용하는 경우, 그것을 할 수있는 끝 다른 다시 거기에, 하지만 대부분의 사람들이 사용하는 주요 한 S3입니다 그리고 무엇 이것에 대해 좋은 것은 기계 경우입니다 완전히 인터넷의 얼굴 떨어져 사라했다, 이들은 미리 쓰기 로그 파일에서 당신은 모든 것을 복원 할 수 있습니다 그리고 다행스럽게도, 다시 2011 년, 바로 이러한 크고, 큰 아마존 정전 중 하나 전에, 우리는 단지 Heroku가 포스트 그레스의 모든 내용에 장소에 넣어 것 같은 바로 몇 주와 같은 정전 전에 그가 아니었다면, 나는 아마 아직도 일을 할 것이다 하지만 데이터베이스 팀 봤는데 얼마나 잘 모르겠어요

그것은 나쁜했을 것이다 그래서, 월마트-E를 사용하십시오 제발, 제발 다시 말하지만,이 테스트를하는 것이 중요합니다 우리가 할 것은 우리가 월마트 – 전자 인프라를 사용하다 에 대한 우리가 지금의 추종자 또는를 만들 때, 같은, 우리는 같은 인프라 모든 시간을 사용하고 그런 식으로, 우리가 알고있는, 암시, 이러한 백업은 좋은 유효한지 당신이 생각을 시작할 때이다 뜨거운 대기를 가진 약

그래서, 당신이 알고, 지속적으로이 실행을 가지고, 당신의 중요한 것은이가는 경우 그래서, 당신은 그것을 넘어 싶다 당신은 작은 크기에있을 때, 그 중요하지 않아 그냥 신속하게 복원 할 수 있기 때문에 백업의 어떤 종류에서 하지만 많은 양의 데이터를 얻기 시작할 때, 단지 시간이 네트워크를 통해 데이터를 전송하는 데 걸리는 그것을 복원 시작, 그것은 단지 더 길고 더 이상 복용을 시작합니다 그래서, 뜨거운 대기까지있는 것은 매우 좋다 포스트 그레스가 가지고있는 좋은 점 중 하나는, 다시, 슈퍼 개발자 커뮤니티에 잘 알려져 있지 않다 비동기 복제입니다 거래별로 거래에, 당신이 중요한 거래이다 "라고 말할 수 있습니다

나는 이것이 동기가되고 싶어요 " 마찬가지로,의 그것 가입 새 사용자 말할 수 있습니다 그것이 가질 때까지 그리고 그 하나는 반환하지 않습니다 복제본에 작성 그러나, 거래의 대부분을위한, 당신은 그와 같은 비동기 모드를 종료 할 수 있습니다 그것은 바로 돌아갑니다 당신은 그냥 결국 거기를 만들 것입니다 믿습니다

그리고 중요한을위한 두 혼합 할 수있는 와 같은,하지 중요한 데이터는 매우 강력하다 다시 말하지만, 당신은 모니터링 및 경고에 투자해야합니다 그리고이 모든 사람들이 말합니다 또 다른 것입니다 당신은 무엇을해야하지만, 사람들이하는 경향이 너무 늦었 조금의 유일한 때까지 그리고,이 이러한 것들의 많은 테마의 일종이다 내가 함께이 이야기를 가하고 때, 같은, 이런 일들이 많이, 등이있다 나는 여기에 일어나서 말할 수 "아,이 작업을 수행해야합니다, 당신은이 작업을 수행해야합니다

" 이 경우 왜, 나는 생각하려고했던 그 모두가 당신이 그것을 어떻게해야 말한다, 하지만 아무도 실제로 그 일을하지 것으로 나타났다 그리고 나는 내가 본이 이야기를 생각 나게했다 의 유튜브 비디오 용지의 이름이 재해로되어 유혹, 다음 이야기는 "단지의 탄력성했다 적응 시스템 " 당신은 GitHub의에 그 찾아보실 수 있습니다 그리고 여기의 일부를 다시거야 내가 무슨 생각 때문이었다 이것은 아마도 이유를 설명했다 사람들은 그들이 행해야하지 않습니다

그래서, 당신은 당신이 가지고이라고 생각하면, 시스템의 경계 중 하나는 경제적 경계입니다 그리고 당신은 그것을 향해 갈 수있는, 당신이지나 가면 당신의 회사가 실패 할 때,이다 및 사업을 간다 그래서, 자연 구배, 거기에있다 때문에 그렇지 않으면 멀리 경제 경계에서 당신을 밀어 당신의 회사는 사업을 갈 것입니다 그래서, 당신은 라인에 올라가 그리고 당신은 아래로 잘 버틸 워크로드 경계의 또 다른 경계가있다

이것은 당신이 당신의 직원을 작동 할 수있는 금액입니다 귀하의 회사에서 그리고 다시, 당신은 너무 멀리 밀어 경우, 그들은 밖으로 연소 종료 얻을 그리고 다시, 멀리 거기에서 자연스럽게 그라데이션이있다 그리고, 마지막으로, 성능 경계있다 그리고 이것은 우리의 시스템에 대한 흥미로운의 일종이다

문제는 당신이 어디 있는지 없다는 것입니다 성능 경계는 실제로 당신은지나 갈 때까지 그래서 우리가 할 것은 우리가이 오류 마진을 설정합니다 그리고 우리는 우리 만 작동 할거야 "당신이 알고, 말을 우리 이 용량에서 시스템, 또는이 얼마나 많은 요청입니다 초당 우리는 타격 싶지 않고, 그보다 더 " 문제는 당신이 그것을 통해 이동하는 경향이있다, 그리고 당신은 종류의, 흥분 당신은 "아", 이동 그리고 당신은 그것을 다시 가져 당신은 그 위에 가서 다시 계속

그러나, 그 후, 몇 번 발생 "왜 우리가 너무 많은 현실에서 도피하고있다?"처럼 당신이있어 "이 시스템의 운영 벌금,의 다시 경계를 밀어 수 있습니다" 문제는 당신이 실제로 몰라 그 실제 경계가 결국 때까지 어디 있는지 가서 당신이 알고, 당신은 큰 정전 있습니다 그리고 그것은 문제입니다 그리고, 내가 전에 화재 일을 사용할 수 없었어 그래서 난 그냥, 내가 한 번 더하고 싶어하고 싶다

(청중 웃음) 그건 좋은 데요 그리고, 어쨌든, 그래서 당신은 큰 정전 있습니다 그리고, 모두가 밖으로 괴물, 당신은 같은거야 "좋아, 우리는 다시는 일어나지 싶지 않아요" 그리고 당신은 당신이 알고, 밀어, "나는 비용이 얼마나 많은 돈을 상관하지 않습니다 나는 우리가 일을 얼마나 걱정하지 않는다

이제 다시 당황 중단하지 않아도 보자 " 그래서 당신은 모든 방법에 대해 밀어 넣습니다 그러나 문제는, 시간이 지남에, 당신은 같은 생각을 시작한다 "아, 그래, 당신은 정전 기억 년 전에 몇에서? " "오, 그래, 하, 하, 하, 나쁜이었다" 그리고, 당신은 잘 돌아 왔구나, 또 다시 반복 그리고 나는 모든이 왜 정말 설명 생각 당신은 당신이 일을해야 알고 이런 일, 당신이 그런 식으로 충돌 할 때까지하지만, 그게 무슨입니다

내가 처음이를봤을 때 내가 정말 기억 처음 나는이 이야기를보고 이동하는 것이 좋습니다 그것은 단지, 유튜브에 어쩌면 20-25분을 좋아하는 것 그는, 난 그냥보다 그것을 설명의 더 나은 일을 하지만 난 정말 그에게 흥미로운 방법이라고 생각 시스템에 대해 생각합니다 그래서 마지막으로, 당신이 밖으로 실행을 시작, 당신이 알고, 아무리 당신이 어떤 전략을, 당신은 장소에 두지 결국, 데이터가 계속 성장하는 경우, 당신은 지점 어디에서 온거야 그것은 단지 더 이상 하나의 기계에 맞지 않을 수 있습니다 그래서, 당신이 무엇을 할 수 있는지, 매우 인기있는 방법, 샤딩이다

그리고,이 대신 응용 프로그램을 필요로한다 스타 인, 하나의 거대한 데이터베이스에 이야기 당신은 조금 작은 데이터베이스를 많이 만들 그들 모두에 대한 응용 프로그램 이야기가 있습니다 당신은 사람들이 오랜 시간 동안 샤딩을하고있다, 알고있다 홈 방사 방법이 많이있다 많은 사람들이 자신의 응용 프로그램 계층에서이 작업을 수행 그러나 이것은 당신이 알고있는 곳이며,이 회사는 내가 년 전 가입 종류의 도움을 의미한다

그래서, Citus는 오픈 소스 포스트 그레스의 확장 당신은 포스트 그레스에 설치하는 것이 당신은, 포스트 그레스의 몇 가지 다른 노드에 설치 그것은 분산, 분산됩니다 데이터베이스로 변환합니다 그리고 그래, 그래서 그것은 오픈 소스입니다 알다시피, 당신은 그것을 확인해 갈 환영합니다 그리고 스스로를 실행합니다 즉시 당신은 단일 노드 포스트 그레스를 빨리 성장으로, 무엇 Citus가하는 것은뿐만 아니라 돌봐입니다 단지 샤딩, 그래서 당신은 쓰기를 수행 할 때, 그것은 올바른 노드로 이동합니다

그러나 또한 읽기, 그 밖으로 배포 할 수 있습니다 모든 기계 클러스터의 등등에 대하여 이것은 그것의 복잡한 뷰의 일종이다 하지만 우리가 가지고 접근 사실이다 실제로 매우 단순하고 간단합니다 그래서, 우리는 노동자와 파편의 이러한 생각을 가지고, 하지만 정말로 그들은 포스트 그레스 서버와 테이블은된다 그래서, 당신은 내부 이러한 모든 것들에 피크를 갈 수있는, 그리고 그것은 단지 표준 포스트 그레스있어 그는 저장 사용되고 따라서, 예를 들어, 나는이 두 개의 테이블이있다

하나는 CloudWatch를 측정이고, 다른 하나는 그냥 일반적인 이벤트 테이블 그리고 그들은 모두 분산됩니다 테이블입니다 그래서, 내 응용 프로그램에서이 볼 때, 그것은 단지 하나 개의 테이블처럼 보인다 내 응용 프로그램 것을 알 필요가 없습니다 아무것도 재미가 진행된다 그것은 단지, 일반 포스트 그레스를 통해 연결 그것은 하나 개의 테이블입니다

하지만 뒤쪽에 이러한 노동자의에 연결하는 경우, 당신은 정말로 무슨 일하는 것이이 있음을 볼 수있다 테이블의 많은 여기에 있습니다, 해당 서버에 해당 테이블의 각각의 하나는 파편이다 그리고, 당신도 알다시피, 다른 서버는해야 할 것입니다 그래서 다른 파편의 설정합니다 그래서, 쓰기가 올 때, 당신이, 당신이 알고 있다고,이 테이블 중 하나, 이것은 내 샤드 열쇠입니다 우리는 가서 그에 해시 함수를 실행합니다 우리는 그것을에 가서 무슨 일이 일어나고 있는지 샤딩 알고 그리고 우리는 그 하나 개의 파편에 기록 그리고 그냥 어떻게 작동하는지 보여 대부분의 포스트 그레스 물건은 소위 이루어집니다 후드하에 탈 함수 다소 당신에게서 숨겨

그래서, 우리는 여기 카탈로그 테이블이 즉, 각각의 시작과 끝 범위를 도시 그것이 만들어지는 파편 중 하나 그래서, 우리는 해시 함수를 실행합니다 우리는 intmin에서, 당신은 알고 있는지 알고 intmin 이상 조금합니다 이제 우리는에 들어가 어떤 파편 알고, 다음, 당신은, 그래서 다음 세트를 알고있다 그리고 그것은 쓰기가 작동하는 방법입니다

하지만 당신은 archetect하는 방법에 대해 생각 할 때 활용을위한 응용 프로그램, 당신이 알고, 포스트 그레스 분산 방법 정말 두 종류가 있어요 것을 당신은 그것에 대해 생각할 수 있습니다 하나는 같은 이벤트 데이터에 실시간으로 속편에 대한 더 많은 것이다 자, 당신은 클릭이나 페이지 뷰를 추적하는 가정 해 봅시다 그래서 시스템이나 측정 그리고 다른 하나는 멀티 테넌트 (multi-tenant) 모델의 더 이는 내가 처음에 시작 할거야입니다 멀티 테넌트 모델은 더,의 말을하게됩니다 당신은, 세일즈 포스와 같은 응용 프로그램을 작성하고 세일즈 포스의 각 고객은 자신이 어디에 데이터의 설정, 그리고 고객에게 고객으로부터 이동하지 않습니다

이 회사의 많은위한 모델이다, 여기서 고객의 데이터가 서로 혼합하지 않습니다 그리고 무엇 이것에 대해 좋은 것은 그것이로 마이그레이션 할 쉽게 수 있습니다 그것은 포스트 그레스의 모든 기능을하기 때문에 유지하기 위해 쉽게 우리가 전에 이야기 한 것을 : 백업, 월마트 전자 연속 쓰기 위해 미리 보호를 기록합니다 작품 확장, 당신은 모두가 더 큰 개별 노드 얻을 수있는, 당신은 시스템에 등 더 많은 노드를 추가 할 수 있습니다 그리고이 작동하는 방식이며, 이 경우 모든 테이블은, 그것을 조금 해제 정상화 그리고 각 테이블 하나에 고객 또는 세입자의 ID를 추가, 쿼리가 들어올 때,이 곳이 한로 고객 ID, 또는 여기서 ORD_ID = 3, 우리는 모든 데이터가 단지 될거야 것을 알고있다 하나 개의 특정 노드에서, 그래서 우리는이 모든 쿼리를 보낼 수 있습니다

그리고 정확히 단일 노드 포스트 그레스처럼 동작 그 시점에서, 그것은 걱정하지 않습니다 모든 다른 고객의 다른 모든 데이터 그리고 당신은 다시 결과를 얻을 수 있습니다 그리고 이것은 더, 당신이 자신을 샤딩하려고한다면, 당신이 말을하려고한다면, "아, 내가 응용 프로그램을 구축 할 필요가 내가 필요 샤딩 "이 아마 훨씬처럼 할 당신은 당신의 자신의 응용 프로그램 코드에서 무엇을 할 것입니다 그러나이 방법은, 모든주의를 찍은 것 당신은 유지 보수 할 필요가 없습니다 응용 프로그램의 모든 코드입니다 그러나 사람들이 샤딩에 대한 생각에 더 유사합니다

다른 모델은 더 병렬 모델입니다 그리고 어떤 여기에 대한 좋은 것은 당신이 할 수 있다는 것입니다 데이터가 아닌, 한 곳에서 삽입 할 수있는, 하지만, 쿼리, 그들은 언제 와서 그들은, 모든 노드에 분산 취득 클러스터의 모든 시스템 무엇 이것에 대해 좋은 것은 그것이 포스트 그레스의 것을 하나입니다 그래서, 당신은 포스트 그레스 시작하면, 당신은 언제 당신이 더 큰 규모에 도달 할 필요가 없습니다 당신은 너무 많은 시스템을 다시 설계 할 필요가 없습니다 다른 모델을 사용합니다 또한 수, 당신이 당신의 회사의 포스트 그레스 팀이있는 경우, 사람들은 그것을 경험 그들은 운영 및 유지 관리하는 방법을 알아 갈 필요가 없습니다 완전히 다른 데이터베이스

그리고 또한이 포스트 그레스, 때문에 포스트 그레스는 새로운 기능이 나올 때마다 이러한 몇 년 전 jsonb로, 그냥 확장이기 때문에 모든 것을 당신을 위해 온다 포스트 그레스의 상단에 그래, 그래서 쿼리가 오면, 내가 말한 것처럼, 우리는 분산 쿼리를 수행 모든 노드가 맞고 단계의 종류, 다음은, 데이터를 다시 온다 그리고, 또한, 이것에 대해 좋은거야 누군가의 쿼리가 CPU 바인딩 것을 매우 일반적인 아닙니다 보통 나는 고객, 포스트 그레스 사용자가 볼 때, 그것은 더 바인딩 메모리 같아요 그러나 때때로, 당신은 CPU-바인딩 된 쿼리를해야합니다

포스트 그레스, 때, 물론, 연결 그것은 백엔드를 포크와는 크게 단일 스레드입니다 일부 진보, 96 및 다음 버전이있었습니다, 여기서 순차 스캔하는 것은 병렬로 수행되는 하지만 대부분, 당신은 하나의 스레드가 될 것입니다 그러나,이 때문에 모든 노드에 노력하고 있습니다 클러스터에서, 당신은 한꺼번에 CPU 모두를 사용하여 얻을 그래서, 나는 500 ~ 700 배 개선의 경우를 본 적이 그것은 한 번에 모든 CPU를 사용할 수 있기 때문이다

우리는 또한, Citus MX의 한 예를 이는 어떤 단일 노드에 연결할 수 있습니다 대신 하나 개의 코디네이터 노드의 그리고 야후 클라우드 봉사 벤치 마크를 사용하여, 우리는 초당 50 만 쓰기에 대해 얻을 수있어 32 노드 클러스터에서 우리는 대량 삽입을하고 있던 때, 칠백 만 같았다 대량 삽입이 아니기 때문에 그러나 그것은 종류의 속임수 보통 사람들의 워크로드 패턴 그리고 이것은 우리가 해결할 방법 정말 멋진 방법입니다 당신은 어떤 노드에 연결할 수 있습니다 이 라운드 로빈을하는 DNS 항목입니다

그래서 당신이 연결할 때, 그것은 단지로 이동 후원 노드 중 하나, 그리고 그들은 서로 통신합니다 그리고 마지막으로, 우리는 당신이 사용할 수있는 보석이 당신은 멀티 테넌트 (multi-tenant) 모델을 사용하는 경우 그리고 대신 말하는 "에 속하는"당신은 말 사용자의 "나는 멀티 테넌트 (multi-tenant)이야" 그리고, 코드 상자 안에, 당신은 블록이 그것을 포장 할 수 있습니다 그리고 그것은 확실히 활성 기록 있다고한다 그 적절한 조직 ID로 모든 쿼리를 스코프 그리고 무엇 이것에 대해 좋은 것은 당신이 사용할 수 있다는 것입니다 당신은 Citus 사용을 시작도하기 전에

한 테이블이 그 열을 가지고, 당신은 장소에있을 수 있습니다 다음은 수평 확장 할 필요가있을 때, 모든 것이 갈 준비가되어 있습니다 그게 내가 당신을 위해 모두이다 대단히 감사합니다 우리는, 당신은 알고 있나요 나는 지금 아마 몇 가지 질문에 대답 할 수 시간을보고, 또한, 우리가 부스를해야합니까, 나는이 이야기를 도와 드리겠습니다 그러나, 대단히 감사합니다

(청중 박수) 그래서, 질문은 : 일 대신 정수로 UUID를 사용하여 그래서, 나는 그것을 많이 좋아한다 내 더 포스트 그레스 DBA 동료 중 일부는 그것에 대하여 경고 그것은 더 많은 공간을 차지 않기 때문에 조인은 조금 느립니다 그러나 정말 모든 곳에서 UUID를 사용하여 같은 I, 내가 그 일을 알고해서, 내가 URL을 단축 않는 경우에, 나는 비밀을 노출하고 있지 않다 내 시스템에 대한 그리고, 또한, 나는 그것이 좋은 생각합니다

그러나 성능 병목이 될 수 있습니다 그것은 알고 있어야 뭔가, 하지만 내가 먼저 ID를 같은 UUID를 함께 이동하는 경향이있다, 다음, 나는 그것에 대해 만 생각할 수 있다면, 정말 문제가 될 것 어쩌면 정수로 이동합니다 또한, 당신이 당신의 열의 정수를 사용하는 경우, BIGINT를 사용합니다 실제로 데이터베이스 크기의 같은 양을 차지 상기 일 메모리 어쨌든 64 비트에 정렬되기 때문에 그것은 당신의 공간을 절약 할 수있는 유일한 시간은 경우입니다 함께 때문에 bitpacking 두 개의 32 비트 형식 어떤 당신은 아마 필요가 없습니다 그래서, bigints를 사용 제발, 제발, 그렇지 않으면 당신은 정말이거야 불쾌한 마이그레이션 문제는 32,000,000 후 당신을 놀라게

그래서, bigints을 사용하십시오 음, 그래, 그래서, 1 테라 바이트 큰지기 시작한다, 그래서 질문은 : 당신이 1 테라 바이트에있어 한 번 마이그레이션하는 방법을 쉽게? 당신은 다운 타임을 취할 수 있다면, 덤프처럼 / 복원은 매우 신속하게 할 수있다 때문에 / 복원 작업을 덤프 방법 그들은 헤더 프레임 데이터를 많이 방출되고, 그래서오고 단지 튜플이다 난 그냥 덤프를 가지고 그 걸리는 시간을 볼 것이다 그것은 허용 다운 타임의 경우 그러나 일반적으로 응용 프로그램 계층에 약간의 변화가있다, 하지만 여전히 Postcres 때문에, 그 부분은 아니지만 보통은 사람들이 이주 단지 가동 중지 시간입니다 걱정이다 변경 실제 코드는 괜찮 경향이있다 일부 쿼리는, 당신은 다시 작성해야 할 수도 있습니다 하지만 보통은 그렇게 나쁘지 않다 특히이 멀티 테넌트 (multi-tenant)의 경우 즉, 많이 더 쉽게 만든다

그래서 질문은 : 당신이 중간 크기 인 경우에, 성능 샤딩은 무엇입니까? 주님은 당신이 CPU 바인딩 쿼리를 할 특히이 될 수 있습니다 다른 점은 시작 항상 쉽게입니다 모든 전에 샤딩은 불에있다 당신이 큰 점점 시작하면 있기 때문에, 그것은 더 스크램블링처럼, 그래서, 다시 어렵다 때문에 재해 것은 유혹의, 그것은 고통스러운 전에 사람들이 그것을 할 수 어렵다, 하지만, 데이터 성장을 전망 할 와, 같이 볼 시간을 거슬러 작업 때 당신은 그것을 할 필요 시작합니다 네, 그래서 나는 과거에 사용되는 것을 데이터베이스의 테스트를 할까? 그리고 대부분, 그 백업 및 복원을 위해이었다 대부분 그냥 내가 좋은 도구처럼 발견하지 않았습니다 당신이 사용할 수 그것은 주로 단지 스크립트의 몇 가지를 쓰고, 다음 하루에 한 번 실행, 시도하고 복원 않았다 있는지 확인하십시오

어떤 선반 도구 오프 좋은이 있는지 모르겠어요 하지만 당신의 인증을받을만큼 어디에서 백업을 다운로드하려면, 당신은 아마 20 선 루비 스크립트에서 찾고 어쩌면 그것은 작동하지 않았다 후 이메일을 보냅니다 네, 대부분 해키, 홈 방사 물건이었다 좋아, 그게 것 같습니다 대단히 감사합니다

부스에서 우리를 확인하시기 바랍니다 당신은 더 이상 질문이있는 경우 (청중 박수) (날카로운 음향 출구)