Amazon Redshift Spectrum 시작하기 - Amazon Redshift

Amazon Redshift Spectrum 시작하기

이 튜토리얼에서는 Amazon Redshift Spectrum을 사용하여 Amazon S3의 파일에서 직접 데이터를 쿼리하는 방법에 대해 알아봅니다. 클러스터와 SQL 클라이언트가 이미 있다면 간단한 설정만으로 이 튜토리얼을 마칠 수 있습니다.

참고

Redshift Spectrum 쿼리에는 추가 요금이 발생합니다. 이 자습서에서 샘플 쿼리를 실행하는 요금은 정상 요금입니다. 요금에 대한 자세한 내용은 Redshift Spectrum 요금을 참조하세요.

사전 조건

Redshift Spectrum을 사용하려면 Amazon Redshift 클러스터와 SQL 명령을 실행할 수 있도록 클러스터에 연결된 SQL 클라이언트가 있어야 합니다. 클러스터와 Amazon S3의 데이터 파일은 같은 AWS 리전에 있어야 합니다.

Amazon Redshift 클러스터를 만드는 방법에 대한 자세한 내용은 Amazon Redshift 시작 안내서에서 Amazon Redshift 프로비저닝된 데이터 웨어하우스 시작하기를 참조하세요. 클러스터에 연결하는 방법에 대한 자세한 내용은 Amazon Redshift 시작 안내서Amazon Redshift 데이터 웨어하우스에 연결 단원을 참조하세요.

이어지는 예시 중 일부에서 샘플 데이터는 미국 동부(버지니아 북부) 리전(us-east-1)에 있으므로 us-east-1에 있는 클러스터가 필요합니다. 또는 Amazon S3를 사용하여 다음 버킷 및 폴더의 데이터 객체를 클러스터가 위치한 AWS 리전의 버킷에 복사할 수 있습니다.

  • s3://redshift-downloads/tickit/spectrum/customers/*

  • s3://redshift-downloads/tickit/spectrum/sales_partition/*

  • s3://redshift-downloads/tickit/spectrum/sales/*

  • s3://redshift-downloads/tickit/spectrum/salesevent/*

다음과 유사한 Amazon S3 명령을 실행하여 미국 동부 (버지니아 북부)에 있는 샘플 데이터를 AWS 리전에 복사합니다. 명령을 실행하기 전에 Amazon S3 copy 명령과 일치하도록 버킷과 폴더를 버킷에 생성합니다. Amazon S3 copy 명령의 출력은 파일이 원하는 AWS 리전의 bucket-name에 복사되었음을 알려줍니다.

aws s3 cp s3://redshift-downloads/tickit/spectrum/ s3://bucket-name/tickit/spectrum/ --copy-props none --recursive

AWS CloudFormation을 사용하여 Amazon Redshift Spectrum 시작하기

다음 단계의 대안으로 Redshift Spectrum DataLake AWS CloudFormation 템플릿에 액세스하여 쿼리할 수 있는 Amazon S3 버킷으로 스택을 생성할 수 있습니다. 자세한 내용은 AWS CloudFormation 스택을 시작한 다음 Amazon S3에서 데이터를 쿼리합니다. 단원을 참조하십시오.

단계별로 Amazon Redshift Spectrum 시작하기

Amazon Redshift Spectrum 사용을 시작하려면 다음 단계를 따르세요.

단계 1. Amazon Redshift에 대한 IAM 역할 생성

클러스터가 AWS Glue 또는 Amazon Athena에 있는 외부 Data Catalog와 Amazon S3에 있는 데이터 파일에 액세스하려면 권한 부여가 필요합니다. 이러한 권한을 부여하려면 클러스터에 연결되어 있는 AWS Identity and Access Management(IAM) 역할을 참조합니다. Amazon Redshift에서의 역할 사용에 대한 자세한 내용은 IAM 역할을 사용하여 COPY 및 UNLOAD 작업 권한 부여 섹션을 참조하세요.

참고

경우에 따라 Athena Data Catalog를 AWS Glue Data Catalog로 마이그레이션할 수 있습니다. 클러스터가 AWS Glue가 지원되는 AWS 리전에 있고 Athena Data Catalog에 Redshift Spectrum 외부 테이블이 있는 경우 이 작업을 수행할 수 있습니다. AWS Glue 데이터 카탈로그를 Redshift Spectrum과 함께 사용하려면 IAM 정책을 변경해야 할 수 있습니다. 자세한 내용은 Athena User GuideUpgrading to the AWS Glue Data Catalog 섹션을 참조하세요.

Amazon Redshift에 대한 역할을 생성할 때 다음 접근 방식 중 하나를 선택합니다.

Amazon Redshift에 대한 IAM 역할을 생성하려면
  1. IAM 콘솔을 엽니다.

  2. 탐색 창에서 역할을 선택합니다.

  3. 역할 생성을 선택합니다.

  4. AWS service(AWS 서비스)를 신뢰할 수 있는 엔터티로 선택한 다음 사용 사례로 Redshift를 선택합니다.

  5. Use case for other AWS 서비스(다른 AWS 서비스 스의 사용 사례)에서 Redshift - Customizable(Redshift - 사용자 지정)을 선택한 후 Next(다음)를 선택합니다.

  6. Add permissions policy(권한 정책 추가) 페이지가 나타납니다. AWS Glue 데이터 카탈로그를 사용하는 경우 AmazonS3ReadOnlyAccessAWSGlueConsoleFullAccess를 선택합니다. 또는 Athena Data Catalog를 사용하는 경우 AmazonAthenaFullAccess를 선택합니다. Next(다음)를 선택합니다.

    참고

    AmazonS3ReadOnlyAccess 정책은 모든 Amazon S3 버킷에 대한 읽기 전용 액세스 권한을 클러스터에 부여합니다. AWS 샘플 데이터 버킷에만 액세스 권한을 부여하려면 새 정책을 생성하고 다음 권한을 추가합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::redshift-downloads/*" } ] }
  7. Role name(역할 이름)에는 역할 이름을 입력합니다(예: myspectrum_role).

  8. 정보를 검토한 후 역할 만들기를 선택합니다.

  9. 탐색 창에서 역할(Roles)을 선택합니다. 새 역할 이름을 선택하여 요약을 본 다음 역할 ARN을 클립보드에 복사합니다. 이 값은 방금 만든 역할의 Amazon 리소스 이름(ARN)입니다. 외부 테이블을 생성해 Amazon S3에 있는 데이터 파일을 참조할 때는 이 값을 사용합니다.

AWS Lake Formation에 사용되는 AWS Glue Data Catalog로 Amazon Redshift에 대한 IAM 역할을 생성하려면
  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 Policies를 선택합니다.

    정책을 처음으로 선택하는 경우 관리형 정책 소개 페이지가 나타납니다. 시작하기(Get Started)를 선택합니다.

  3. 정책 생성을 선택합니다.

  4. JSON 탭에서 정책을 생성하도록 선택합니다.

  5. 다음 JSON 정책 문서를 붙여넣습니다. 이는 Lake Formation에 대한 액세스 권한을 부여하지만 Data Catalog에 대한 관리자 권한은 거부합니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "RedshiftPolicyForLF", "Effect": "Allow", "Action": [ "glue:*", "lakeformation:GetDataAccess" ], "Resource": "*" } ] }
  6. 작업이 완료되면 검토를 선택하여 정책을 검토합니다. 정책 검사기가 모든 구문 오류를 보고합니다.

  7. 정책 검토 페이지의 이름myspectrum_policy를 입력하여 생성 중인 정책의 이름을 지정합니다. 설명을 입력합니다(선택 사항). 정책 요약을 검토하여 정책이 부여한 권한을 확인합니다. 그런 다음 정책 생성을 선택하여 작업을 저장합니다.

    정책을 생성한 후 사용자에게 연결할 수 있습니다.

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가하세요:

  • AWS IAM Identity Center의 사용자 및 그룹:

    권한 세트를 생성합니다. AWS IAM Identity Center 사용 설명서권한 세트 생성의 지침을 따릅니다.

  • 보안 인증 공급자를 통해 IAM에서 관리되는 사용자:

    ID 페더레이션을 위한 역할을 생성합니다. IAM 사용 설명서서드 파티 자격 증명 공급자의 역할 만들기(페더레이션)의 지침을 따릅니다.

  • IAM 사용자:

    • 사용자가 맡을 수 있는 역할을 생성합니다. IAM 사용 설명서에서 IAM 사용자의 역할 생성의 지침을 따릅니다.

    • (권장되지 않음)정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. IAM 사용 설명서에서 사용자(콘솔)에 권한 추가의 지침을 따르십시오.

Lake Formation 데이터베이스에서 쿼리할 테이블에 대한 SELECT 권한을 부여하려면
  1. Lake Formation 콘솔(https://console.aws.amazon.com/lakeformation/)을 엽니다.

  2. 탐색 창에서 데이터 레이크 권한을 선택한 다음 권한 부여를 선택합니다.

  3. AWS Lake Formation 개발자 안내서의 명명된 리소스 방법을 사용하여 테이블 권한 부여의 지침을 따르세요. 다음 정보를 제공합니다.

    • [IAM 역할(IAM role)]에서 생성한 IAM 역할인 myspectrum_role을 선택합니다. Amazon Redshift 쿼리 편집기를 실행할 때 데이터에 대한 권한으로 이 IAM 역할을 사용합니다.

      참고

      Lake Formation 사용 Data Catalog에서 쿼리할 테이블에 대해 SELECT 권한을 부여하려면 다음을 수행합니다.

      • Lake Formation에서 데이터의 경로를 등록합니다.

      • Lake Formation에서 사용자에게 해당 경로에 대한 권한을 부여합니다.

      • 생성된 테이블은 Lake Formation에 등록된 경로에서 찾을 수 있습니다.

  4. 권한 부여를 선택합니다.

중요

Lake Formation 권한을 통해 기본 Amazon S3 객체에 대한 액세스 권한만 허용하는 것이 좋습니다. 승인되지 않은 액세스를 방지하려면 Lake Formation 외부의 Amazon S3 객체에 대해 부여된 권한을 제거합니다. Lake Formation,을 설정하기 전에 Amazon S3 객체에 액세스한 경우 이전에 설정된 버킷 권한 또는 IAM 정책을 제거합니다. 자세한 내용은 Upgrading AWS Glue Data Permissions to the AWS Lake Formation ModelLake Formation Permissions 섹션을 참조하세요.

2단계: IAM 역할을 클러스터와 연결

이제 Amazon Redshift가 외부 Data Catalog 및 Amazon S3에 액세스할 수 있는 권한을 부여하는 IAM 역할이 있습니다. 이때 해당 역할을 Amazon Redshift 클러스터와 연결해야 합니다.

IAM 역할을 클러스터와 연결하려면
  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/redshiftv2/에서 Amazon Redshift 콘솔을 엽니다.

  2. 탐색 메뉴에서 클러스터(Clusters)를 선택한 후 업데이트할 클러스터의 이름을 선택합니다.

  3. 작업(Actions)에서 IAM 역할 관리(Manage IAM roles)를 선택합니다. IAM 역할 페이지가 나타납니다.

  4. Enter ARN(ARN 입력)을 선택한 다음 ARN 또는 IAM 역할을 입력하거나 목록에서 IAM 역할을 선택합니다. 그런 다음 Add IAM role(IAM 역할 추가)을 선택하여 Attached IAM roles(연결된 IAM 역할) 목록에 추가합니다.

  5. 완료를 선택하여 IAM 역할을 클러스터에 연결합니다. 변경이 완료되도록 클러스터가 수정되었습니다.

3단계: 외부 스키마와 외부 테이블 생성

외부 스키마에서 외부 테이블을 생성합니다. 외부 스키마는 외부 데이터 카탈로그에 있는 데이터베이스를 참조하며, 사용자를 대신하여 Amazon S3에 액세스하도록 클러스터에 권한을 부여하는 IAM 역할 ARN을 제공합니다. 외부 데이터베이스는 Amazon Athena Data Catalog, AWS Glue Data Catalog 또는 Amazon EMR과 같은 Apache Hive 메타스토어에서 생성할 수 있습니다. 이 예제에서는 외부 스키마 Amazon Redshift를 생성할 때 Amazon Athena Data Catalog에 외부 데이터베이스를 생성합니다. 자세한 내용은 Amazon Redshift Spectrum의 외부 스키마 단원을 참조하십시오.

외부 스키마와 외부 테이블을 생성하려면
  1. 외부 스키마를 만들려면 다음 명령에서 IAM 역할 ARN을 1단계에서 만든 역할 ARN으로 대체합니다. 그런 다음 SQL 클라이언트에서 명령을 실행합니다.

    create external schema myspectrum_schema from data catalog database 'myspectrum_db' iam_role 'arn:aws:iam::123456789012:role/myspectrum_role' create external database if not exists;
  2. 외부 테이블을 만들려면 다음 CREATE EXTERNAL TABLE 명령을 실행합니다.

    참고

    클러스터와 Amazon S3 버킷이 동일한 AWS 리전에 있어야 합니다. 예로 제시된 CREATE EXTERNAL TABLE 명령의 경우 샘플 데이터가 들어 있는 Amazon S3 버킷이 미국 동부(버지니아 북부) AWS 리전에 있습니다. 소스 데이터를 보려면 sales_ts.000 파일을 다운로드합니다.

    이 예를 다른 AWS 리전에서 실행하도록 수정할 수 있습니다. 원하는 AWS 리전에 Amazon S3 버킷을 생성합니다. Amazon S3 copy 명령을 사용하여 판매 데이터를 복사합니다. 그런 다음, 예로 제시된 CREATE EXTERNAL TABLE 명령에서 버킷의 위치를 업데이트합니다.

    aws s3 cp s3://redshift-downloads/tickit/spectrum/sales/ s3://bucket-name/tickit/spectrum/sales/ --copy-props none --recursive

    Amazon S3 copy 명령의 출력은 파일이 원하는 AWS 리전의 bucket-name에 복사되었음을 알려줍니다.

    copy: s3://redshift-downloads/tickit/spectrum/sales/sales_ts.000 to s3://bucket-name/tickit/spectrum/sales/sales_ts.000
    create external table myspectrum_schema.sales( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/' table properties ('numRows'='172000');

4단계: Amazon S3에서 데이터 쿼리

외부 테이블이 생성된 후에는 다른 Amazon Redshift 테이블을 쿼리할 때와 같은 SELECT 문을 사용하여 외부 테이블을 쿼리할 수 있습니다. 이 SELECT 문 쿼리에는 테이블 조인, 데이터 집계, 조건자 필터링이 포함됩니다.

Amazon S3에서 데이터를 쿼리하려면
  1. MYSPECTRUM_SCHEMA.SALES 테이블의 행 수를 가져옵니다.

    select count(*) from myspectrum_schema.sales;
    count 
    ------
    172462
  2. 큰 팩트 테이블은 Amazon S3에 두고 작은 차원 테이블은 Amazon Redshift에 두는 것이 모범 사례입니다. 데이터 로드에서 샘플 데이터를 로드한 경우 데이터베이스에 EVENT라는 테이블이 있습니다. 그렇지 않다면 다음 명령을 사용하여 EVENT 테이블을 생성합니다.

    create table event( eventid integer not null distkey, venueid smallint not null, catid smallint not null, dateid smallint not null sortkey, eventname varchar(200), starttime timestamp);
  3. 다음 COPY 명령에서 IAM 역할 ARN을 단계 1. Amazon Redshift에 대한 IAM 역할 생성에서 만든 역할 ARN으로 대체하여 EVENT 테이블을 로드합니다. 원한다면 AWS 리전 us-east-1의 Amazon S3 버킷에서 allevents_pipe.txt의 소스 데이터를 다운로드하여 볼 수 있습니다.

    copy event from 's3://redshift-downloads/tickit/allevents_pipe.txt' iam_role 'arn:aws:iam::123456789012:role/myspectrum_role' delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-east-1';

    다음 예는 상위 10개 이벤트의 총 매출을 찾기 위해 외부 Amazon S3 테이블 MYSPECTRUM_SCHEMA.SALES와 로컬 Amazon Redshift 테이블 EVENT를 조인합니다.

    select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
    eventid | sum     
    --------+---------
        289 | 51846.00
       7895 | 51049.00
       1602 | 50301.00
        851 | 49956.00
       7315 | 49823.00
       6471 | 47997.00
       2118 | 47863.00
        984 | 46780.00
       7851 | 46661.00
       5638 | 46280.00
  4. 이전 쿼리의 쿼리 계획을 확인합니다. Amazon S3의 데이터에 대해 실행된 S3 Seq Scan, S3 HashAggregateS3 Query Scan 단계를 메모합니다.

    explain select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
    QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan myspectrum_schema.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)

AWS CloudFormation 스택을 시작한 다음 Amazon S3에서 데이터를 쿼리합니다.

Amazon Redshift 클러스터를 생성하고 클러스터에 연결한 후 Redshift Spectrum DataLake AWS CloudFormation 템플릿을 설치한 다음 데이터를 쿼리할 수 있습니다.

CloudFormation은 Redshift Spectrum 시작하기 DataLake 템플릿을 설치하고 다음을 포함하는 스택을 생성합니다.

  • Redshift 클러스터와 연결된 myspectrum_role이라는 역할

  • myspectrum_schema라는 외부 스키마

  • Amazon S3 버킷의 sales라는 외부 테이블

  • 데이터가 로드된 event라는 Redshift 테이블

Redshift Spectrum 시작하기 DataLake CloudFormation 스택을 시작하려면
  1. CFN 스택 시작(Launch CFN stack)을 선택합니다. DataLake.yml 템플릿이 선택된 CloudFormation 콘솔이 열립니다.

    또한 Redshift Spectrum 시작하기 DataLake CloudFormation CFN 템플릿을 다운로드하고 사용자 지정한 다음 CloudFormation 콘솔(https://console.aws.amazon.com/cloudformation)을 열고 사용자 지정한 템플릿으로 스택을 생성할 수 있습니다.

  2. 다음(Next)을 선택합니다.

  3. 파라미터(Parameters)에서 Amazon Redshift 클러스터 이름, 데이터베이스 이름 및 데이터베이스 사용자 이름을 입력합니다.

  4. Next(다음)를 선택합니다.

    스택 옵션이 나타납니다.

  5. 다음(Next)을 선택하여 기본 설정을 적용합니다.

  6. 정보를 검토하고 기능(Capabilities)에서 AWS CloudFormation에서 IAM 리소스를 생성할 수 있음 확인(I acknowledge that might create IAM resources)을 선택합니다.

  7. 스택 생성(Create stack)을 선택합니다.

스택이 생성되는 동안 오류가 발생하면 다음 정보를 확인합니다.

  • 오류 해결에 도움이 되는 정보는 CloudFormation 이벤트(Events) 탭을 참조합니다.

  • 작업을 다시 시도하기 전에 DataLake CloudFormation 스택을 삭제합니다.

  • Amazon Redshift 데이터베이스에 연결되어 있는지 확인합니다.

  • Amazon Redshift 클러스터 이름, 데이터베이스 이름 및 데이터베이스 사용자 이름을 제대로 입력했는지 확인합니다.

Amazon S3에서 데이터 쿼리

다른 Amazon Redshift 테이블을 쿼리할 때와 같은 SELECT 문을 사용하여 외부 테이블을 쿼리합니다. 이 SELECT 문 쿼리에는 테이블 조인, 데이터 집계, 조건자 필터링이 포함됩니다.

다음 쿼리는 myspectrum_schema.sales 외부 테이블의 행 수를 반환합니다.

select count(*) from myspectrum_schema.sales;
count 
------
172462

로컬 테이블과 외부 테이블 조인

다음 예는 상위 10개 이벤트의 총 매출을 찾기 위해 외부 테이블 myspectrum_schema.sales와 로컬 테이블 event를 조인합니다.

select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
eventid | sum     
--------+---------
    289 | 51846.00
   7895 | 51049.00
   1602 | 50301.00
    851 | 49956.00
   7315 | 49823.00
   6471 | 47997.00
   2118 | 47863.00
    984 | 46780.00
   7851 | 46661.00
   5638 | 46280.00

쿼리 계획 보기

이전 쿼리의 쿼리 계획을 확인합니다. Amazon S3의 데이터에 대해 실행된 S3 Seq Scan, S3 HashAggregateS3 Query Scan 단계를 메모합니다.

explain select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)