← R2 SQL / r2-sql / reference
Omezení a doporučené postupy
Tato stránka shrnuje podporované funkce, omezení a osvědčené postupy.
Stručný přehled
| Funkce | Podporováno | Poznámky |
|---|---|---|
| SELECT, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT | Ano | |
Aliasy sloupců (AS) |
Ano | |
| Výrazy (CASE, CAST, LIKE, BETWEEN, IN, aritmetické operace) | Ano | Plná podpora výrazů |
| EXPLAIN | Ano | Vrátí prováděcí plán jako text nebo JSON |
| Skalární funkce | Ano | Matematické, řetězcové, datum a čas, regulární výrazy, kryptografické, pole, mapy, struktury, JSON |
| Agregační funkce | Ano | Základní, přibližné, statistické, bitové, booleovské, poziční |
| Přibližné agregace | Ano | approx_distinct, approx_median, approx_percentile_cont, approx_top_k |
| Typy sloupců Struct / Array / Map | Ano | Notace v hranatých závorkách, get_field(), funkce pro pole, funkce pro mapy |
CTE (WITH ... AS) |
Ano | Mohou odkazovat na různé tabulky a obsahovat JOIN |
| Spojení JOIN (INNER, LEFT, RIGHT, FULL OUTER, CROSS) | Ano | Všechny standardní typy spojení |
| Implicitní spojení (čárka ve FROM) | Ano | |
Poddotazy (IN, NOT IN) |
Ano | NOT IN není podporováno u sloupců, které mohou obsahovat NULL, použijte NOT EXISTS místo toho |
Poddotazy (EXISTS, NOT EXISTS) |
Ano | vzory semi-join a anti-join |
| Skalární poddotazy | Ano | V SELECT, WHERE, HAVING |
| Odvozené tabulky (poddotazy ve FROM) | Ano | Lze je vnořovat a spojovat. LATERAL odvozené tabulky nejsou podporovány. |
| Self joiny | Ano | Stejná tabulka s různými aliasy |
Okenní funkce (OVER) |
Ano | Vložené OVER (...) pouze, pojmenované WINDOW klauzule není podporována |
QUALIFY |
Ano | Filtrování podle výsledku okenní funkce |
SELECT DISTINCT / DISTINCT ON |
Ano | |
func(DISTINCT ...) |
Ano | COUNT, SUM, AVG, a další agregace |
Množinové operace (UNION, UNION ALL, INTERSECT, EXCEPT) |
Ano | |
GROUPING SETS / ROLLUP / CUBE |
Ano | |
OFFSET |
Ne | |
INSERT / UPDATE / DELETE |
Ne | Pouze pro čtení |
CREATE / DROP / ALTER |
Ne | Pouze pro čtení |
Úplnou syntaxi SQL najdete v reference SQL.
Nepodporované funkce SQL
| Funkce | Chyba |
|---|---|
OFFSET |
unsupported feature: OFFSET clause is not supported |
Pojmenované WINDOW klauzule |
unsupported feature: WINDOW clause is not supported |
INSERT / UPDATE / DELETE |
only read-only queries are allowed |
CREATE / DROP / ALTER |
only read-only queries are allowed |
UNNEST / PIVOT / UNPIVOT |
Není podporováno |
Zástupné modifikátory (ILIKE, EXCLUDE, EXCEPT, REPLACE, RENAME na *) |
Není podporováno |
| Vnořená (uzávorkovaná) spojení | Není podporováno |
LATERAL odvozené tabulky / LATERAL VIEW |
Není podporováno |
PERCENTILE_DISC |
Nepodporováno: použijte PERCENTILE_CONT |
Nepodporované vzory výrazů
| Vzor | Alternativa |
|---|---|
NOT IN poddotaz u sloupců, které mohou obsahovat NULL |
Použijte NOT EXISTS s korelovaným poddotazem |
Přesné agregace, jako například COUNT(DISTINCT ...), MEDIAN, PERCENTILE_CONT, ARRAY_AGG, a STRING_AGG jsou podporovány. U velkých datových sad dávejte přednost přibližným alternativám (approx_distinct, approx_median, approx_percentile_cont) pro nižší nároky na paměť a výpočetní výkon. Více informací najdete v Agregační funkce.
Omezení za běhu
| Omezení | Podrobnosti |
|---|---|
| Dotazy náročné na zdroje | Během otevřené bety mohou dotazy náročné na paměť nebo výpočetní výkon vypršet. Patří sem i spojení více tabulek najednou (tři a více velkých tabulek), COUNT(DISTINCT) a další func(DISTINCT ...) napříč joiny nebo sloupci s vysokou kardinalitou, ARRAY_AGG / STRING_AGG, množinové operace, které deduplikují velké vstupy, okenní funkce nad velkými oddíly a rozsáhlá řazení nebo vysoce kardinální GROUP BY. Přidejte WHERE filtry a LIMIT, a upřednostněte approx_* agregací, čímž snížíte riziko vypršení časového limitu. |
| Funkce omezené rozpočtem | MEDIAN, PERCENTILE_CONT, ARRAY_AGG, STRING_AGG, NTH_VALUE použitý jako agregace, jakákoli agregace s DISTINCT, a okenní funkce (včetně těch používaných prostřednictvím QUALIFY) mají paměťový limit stanovený předem. R2 SQL před spuštěním dotazu odhadne potřebnou paměť a v případě překročení limitu dotaz odmítne s chybou 400 chybu, pokud by bylo nutné projít příliš mnoho dat. Přidejte GROUP BY nebo WHERE filtry, abyste omezili počet zpracovávaných řádků. |
| Dotazy nad více tabulkami | Podporována jsou spojení JOIN, poddotazy (IN, EXISTS, skalární, odvozené tabulky) i vícetabulkové CTE. Výkon závisí na velikosti mezivýsledku, proto pomocí filtrů WHERE řiďte selektivitu spojení. |
| Tabulky s oddíly a bez oddílů | Podporovány jsou tabulky Iceberg s oddíly i bez oddílů. |
| Pouze formát Parquet | Žádné CSV, JSON ani jiné formáty. |
| Pouze pro čtení | R2 SQL je dotazovací engine, ne databáze. Nepodporuje zápis. |
now() / current_time() přesnost |
Kvantováno na hranice 10 ms a vynuceno na UTC. |
Běžné chybové kódy
| Kód | Význam |
|---|---|
| 40003 | Neplatná syntaxe SQL |
| 40004 | Neplatný dotaz (nepodporovaná funkce, neznámý sloupec, neshoda typů) |
| 80001 | Selhání připojení edge služby (opakování) |
Osvědčené postupy
- Zahrňte filtry časového rozsahu do
WHEREk omezení prohledávaných dat. - Použijte konkrétní názvy sloupců místo
SELECT *pro lepší výkon. - Použijte
LIMITk řízení velikosti výsledné sady. - Použijte přibližné agregační funkce (
approx_distinct,approx_median,approx_percentile_cont) místo přesných alternativ u velkých datových sad. - Povolte kompaktaci v R2 Data Catalog, abyste snížili počet souborů prohledávaných při každém dotazu.
- Použijte
EXPLAINk prozkoumání plánu provádění a ověření použití predicate pushdown. - Použijte
WHEREfiltry s vícenásobnými joiny, abyste zmenšili velikost mezivýsledků. Spojení tří a více velkých tabulek bez filtrů může překročit limity zdrojů. - Velké faktové tabulky spojujte přes dimenzní tabulky, ne přímým spojením dvou velkých faktových tabulek. Například spojte
http_requestsnafirewall_eventsprostřednictvím sdílenéhozonesdimenzi, místo abyste obě faktové tabulky spojovali křížovým joinem. - Buďte opatrní s
COUNT(DISTINCT)napříč vícenásobnými joiny. Tato kombinace může vést k velmi rozsáhlým mezivýsledkům. Zvažte použitíapprox_distinct()nebo rozdělením dotazu na menší kroky. - Použijte explicitní
JOINsyntaxe místo implicitních spojení (oddělených čárkamiFROM) kvůli čitelnosti a aby optimalizátor mohl zvolit optimální pořadí spojení.