Wie kann die Leistung von GeoIP-Abfragen in BigQuery verbessert werden?

Ich habe meine Anwendungsprotokolle in BigQuery geladen und muss das Land anhand der IP-Adresse aus diesen Protokollen berechnen.

Ich habe eine Verknüpfungsabfrage zwischen meiner Tabelle und einer GeoIP-Zuordnungstabelle geschrieben, von der ich heruntergeladen habeMaxMind.

Eine ideale Abfrage wäreOUTER JOIN mit Bereichsfilter jedochBQ unterstützt nur= in Join-Bedingungen. Also macht die Abfrage eineINNER JOIN und behandelt fehlende Werte auf jeder Seite desJOIN.

Ich habe meine ursprüngliche Abfrage so geändert, dass sie im öffentlichen Wikipedia-Datensatz ausgeführt werden kann.

Kann mir bitte jemand helfen, das schneller zu machen?

SELECT id, client_ip, client_ip_code, B.Country_Name as Country_Name

FROM
    (SELECT id, contributor_ip as client_ip, INTEGER(PARSE_IP(contributor_ip)) AS client_ip_code, 1 AS One
    FROM [publicdata:samples.wikipedia] Limit 1000) AS A1

JOIN 
    (SELECT From_IP_Code, To_IP_Code, Country_Name, 1 AS One
    FROM

        -- 3 IP sets: 1.valid ranges, 2.Gaps, 3. Gap at the end of the set
        -- all Ranges of valid IPs:
        (SELECT From_IP_Code, To_IP_Code, Country_Name FROM [QA_DATASET.GeoIP])

        -- Missing rages lower from From_IP 
        ,(SELECT
            PriorRangeEndIP + 1 From_IP_Code, 
            From_IP_Code - 1 AS To_IP_Code, 
            'NA' AS Country_Name
        FROM

            -- use of LAG function to find prior valid range
            (SELECT 
                From_IP_Code, 
                To_IP_Code, Country_Name, 
                LAG(To_IP_Code, 1, INTEGER(0)) 
                OVER(ORDER BY From_IP_Code asc) PriorRangeEndIP                 
            FROM [QA_DATASET.GeoIP]) A

            -- If gap from prior valid range is > 1 than its a gap to fill
            WHERE From_IP_Code > PriorRangeEndIP + 1)

        -- Missing rages higher tan Max To_IP
        ,(SELECT MAX(To_IP_Code) + 1 as From_IP_Code, INTEGER(4311810304) as To_IP_Code, 'NA' AS Country_Name
        FROM [QA_DATASET.GeoIP])
    ) AS B
ON A1.ONE = B.ONE    -- fake join condition to overcome allowed use of only = in joins

-- Join condition where valid IP exists on left
WHERE
    A1.client_ip_code >= B.From_IP_Code
    AND A1.client_ip_code <= B.To_IP_Code
    OR (A1.client_ip_code IS NULL 
    AND B.From_IP_Code = 1)    -- where there is no valid IP on left contributor_ip

Antworten auf die Frage(2)

Ihre Antwort auf die Frage