Panduan penerjemahan SQL Teradata
Dokumen ini menjelaskan persamaan dan perbedaan sintaksis SQL antara Teradata dan BigQuery untuk membantu Anda merencanakan migrasi. Gunakan terjemahan SQL batch untuk memigrasikan skrip SQL secara massal, atau terjemahan SQL interaktif untuk menerjemahkan kueri ad hoc.
Jenis data
Bagian ini menunjukkan padanan di antara jenis data di Teradata dan di BigQuery.
Teradata | BigQuery | Catatan |
---|---|---|
INTEGER |
INT64 |
|
SMALLINT |
INT64 |
|
BYTEINT |
INT64 |
|
BIGINT |
INT64 |
|
DECIMAL |
Gunakan Gunakan jenis data desimal berparameter BigQuery jika Anda perlu menerapkan batas (batasan) digit atau skala kustom. Teradata memungkinkan Anda menyisipkan nilai dengan presisi yang lebih tinggi dengan membulatkan nilai yang disimpan; namun, hal ini mempertahankan presisi tinggi dalam penghitungan. Hal ini dapat menyebabkan perilaku pembulatan yang tidak terduga dibandingkan dengan standar ANSI. |
|
FLOAT |
FLOAT64 |
|
NUMERIC |
Gunakan Gunakan jenis data desimal berparameter BigQuery jika Anda perlu menerapkan batas digit atau skala kustom (batasan). Teradata memungkinkan Anda menyisipkan nilai dengan presisi yang lebih tinggi dengan membulatkan nilai yang disimpan; namun, hal ini akan mempertahankan presisi tinggi dalam penghitungan. Hal ini dapat menyebabkan perilaku pembulatan yang tidak terduga dibandingkan dengan standar ANSI. |
|
NUMBER |
Gunakan Gunakan jenis data desimal berparameter BigQuery jika Anda perlu menerapkan batas digit atau skala kustom (batasan). Teradata memungkinkan Anda menyisipkan nilai dengan presisi yang lebih tinggi dengan membulatkan nilai yang disimpan; namun, hal ini mempertahankan presisi tinggi dalam penghitungan. Hal ini dapat menyebabkan perilaku pembulatan yang tidak terduga dibandingkan dengan standar ANSI. |
|
REAL |
FLOAT64 |
|
CHAR/CHARACTER |
STRING |
Gunakan jenis data |
VARCHAR |
STRING |
Gunakan jenis data |
CLOB |
STRING |
|
JSON |
JSON |
|
BLOB |
BYTES |
|
BYTE |
BYTES |
|
VARBYTE |
BYTES |
|
DATE |
DATE |
BigQuery tidak mendukung pemformatan kustom yang serupa dengan yang didukung Teradata dengan DataForm di SDF. |
TIME |
TIME |
|
TIME WITH TIME ZONE |
TIME |
Teradata menyimpan jenis data TIME dalam UTC dan memungkinkan Anda meneruskan offset dari UTC menggunakan sintaksis WITH TIME ZONE .
Jenis data TIME di BigQuery
mewakili waktu yang tidak bergantung pada tanggal
atau zona waktu mana pun. |
TIMESTAMP |
TIMESTAMP |
Jenis data Teradata dan BigQuery
TIMESTAMP
memiliki presisi mikrodetik (tetapi Teradata mendukung detik kabisat, sedangkan
BigQuery tidak).Jenis data Teradata dan BigQuery biasanya dikaitkan dengan zona waktu UTC (detail). |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP |
Teradata TIMESTAMP dapat ditetapkan ke zona waktu yang berbeda
di seluruh sistem, per pengguna atau per kolom (menggunakan
WITH TIME ZONE ).BigQuery TIMESTAMP jenis ini mengasumsikan UTC jika Anda tidak secara eksplisit menetapkan zona waktu. Pastikan Anda mengekspor informasi zona waktu dengan benar (jangan menggabungkan nilai DATE dan TIME tanpa informasi zona waktu) agar BigQuery dapat mengonversinya saat diimpor. Atau pastikan Anda
mengonversi informasi zona waktu ke UTC sebelum mengekspor.BigQuery memiliki DATETIME untuk abstraksi
antara waktu sipil, yang tidak menampilkan zona waktu saat output, dan
TIMESTAMP , yang merupakan titik waktu akurat yang selalu menunjukkan
zona waktu UTC. |
ARRAY |
ARRAY |
|
MULTI-DIMENSIONAL ARRAY |
ARRAY |
Di BigQuery, gunakan array struct, dengan setiap struct yang berisi kolom jenis ARRAY (Untuk mengetahui detailnya, lihat Dokumentasi BigQuery). |
INTERVAL HOUR |
INT64 |
|
INTERVAL MINUTE |
INT64 |
|
INTERVAL SECOND |
INT64 |
|
INTERVAL DAY |
INT64 |
|
INTERVAL MONTH |
INT64 |
|
INTERVAL YEAR |
INT64 |
|
PERIOD(DATE) |
DATE ,
DATE |
PERIOD(DATE) harus dikonversi menjadi dua kolom DATE
yang berisi tanggal mulai dan tanggal akhir agar dapat digunakan
dengan fungsi jendela. |
PERIOD(TIMESTAMP WITH TIME ZONE) |
TIMESTAMP ,
TIMESTAMP |
|
PERIOD(TIMESTAMP) |
TIMESTAMP ,
TIMESTAMP |
|
PERIOD(TIME) |
TIME ,
TIME |
|
PERIOD(TIME WITH TIME ZONE) |
TIME ,
TIME |
|
UDT |
STRING |
|
XML |
STRING |
|
TD_ANYTYPE |
STRING |
Untuk informasi selengkapnya tentang transmisi jenis, lihat bagian berikutnya.
Pemformatan jenis teradata
Teradata SQL menggunakan sekumpulan format default untuk menampilkan ekspresi dan
data kolom, serta untuk konversi di antara jenis data. Misalnya, jenis data PERIOD(DATE)
dalam mode INTEGERDATE
diformat sebagai YY/MM/DD
secara default. Jika memungkinkan, sebaiknya gunakan mode ANSIDATE untuk memastikan
kepatuhan ANSI SQL, dan gunakan kesempatan ini untuk menghapus format lama.
Teradata memungkinkan penerapan otomatis format kustom menggunakan
klausa
FORMAT
, tanpa mengubah penyimpanan yang mendasarinya, baik sebagai atribut jenis data
saat Anda membuat tabel menggunakan DDL, atau dalam ekspresi turunan. Misalnya, spesifikasi FORMAT
9.99
membulatkan nilai FLOAT
apa pun ke dua digit.
Di BigQuery, fungsionalitas ini harus dikonversi menggunakan fungsi ROUND()
.
Fungsionalitas ini memerlukan penanganan kasus ekstrem yang rumit. Misalnya,
saat klausa FORMAT
diterapkan ke kolom NUMERIC
, Anda harus mempertimbangkan
aturan pembulatan dan pemformatan khusus.
Klausa FORMAT
dapat digunakan untuk mentransmisikan nilai epoch INTEGER
secara implisit ke
format DATE
. Atau, spesifikasi FORMAT
, X(6)
di kolom VARCHAR
, akan memotong nilai kolom, sehingga Anda harus melakukan konversi ke fungsi SUBSTR()
. Perilaku ini tidak sesuai dengan ANSI SQL. Oleh karena itu, sebaiknya jangan
migrasikan format kolom ke BigQuery.
Jika format kolom benar-benar diperlukan, gunakan View atau fungsi yang ditentukan pengguna (UDF).
Untuk mengetahui informasi tentang format default yang digunakan Teradata SQL untuk setiap jenis data, lihat dokumentasi Pemformatan default Teradata.
Pemformatan jenis tanggal dan stempel waktu
Tabel berikut merangkum perbedaan dalam elemen pemformatan stempel waktu dan tanggal antara Teradata SQL dan GoogleSQL.
Format teradata | Deskripsi teradata | BigQuery |
---|---|---|
CURRENT_TIMESTAMP
|
Informasi TIME dan TIMESTAMP di Teradata dapat memiliki informasi zona waktu yang berbeda, yang ditentukan menggunakan WITH
TIME ZONE .
|
Jika memungkinkan, gunakan CURRENT_TIMESTAMP() , yang diformat dalam
format ISO. Namun, format output selalu menampilkan zona waktu UTC.
(Secara internal, BigQuery tidak memiliki zona waktu.)Perhatikan detail berikut tentang perbedaan dalam format ISO. DATETIME diformat berdasarkan konvensi saluran output. Di
alat command line BigQuery dan konsol
BigQuery, format menggunakan pemisah T menurut RFC
3339. Namun, dalam Python dan JDBC Java, spasi digunakan sebagai
pemisah.Jika Anda ingin menggunakan format eksplisit, gunakan FORMAT_DATETIME() ,
yang membuat string eksplisit. Misalnya, ekspresi
berikut selalu menampilkan pemisah spasi:CAST(CURRENT_DATETIME() AS STRING) Teradata mendukung Kata kunci DEFAULT
di kolom TIME untuk menetapkan waktu saat ini (stempel waktu);
hal ini tidak digunakan dalam BigQuery.
|
CURRENT_DATE |
Tanggal disimpan dalam Teradata sebagai INT64 menggunakan formula berikut:(YEAR - 1900) * 10000 + (MONTH * 100) + DAY Tanggal dapat diformat sebagai bilangan bulat. |
BigQuery memiliki format DATE terpisah yang selalu
menampilkan tanggal dalam format ISO 8601.DATE_FROM_UNIX_DATE tidak dapat digunakan karena
berbasis tahun 1970.Teradata mendukung kata kunci DEFAULT
di kolom DATE untuk menetapkan tanggal saat ini; ID ini tidak digunakan di BigQuery.
|
CURRENT_DATE-3 |
Nilai tanggal direpresentasikan sebagai bilangan bulat. Teradata mendukung operator aritmatika untuk jenis tanggal. |
Untuk jenis tanggal, gunakan DATE_ADD()
atau
DATE_SUB() .BigQuery menggunakan operator aritmatika untuk jenis data: INT64 , NUMERIC , dan FLOAT64 .
|
SYS_CALENDAR.CALENDAR |
Teradata menyediakan tampilan untuk operasi kalender yang lebih dari sekadar operasi bilangan bulat. | Tidak digunakan di BigQuery. |
SET SESSION DATEFORM=ANSIDATE |
Tetapkan format tanggal sesi atau sistem ke ANSI (ISO 8601). | BigQuery selalu menggunakan ISO 8601, jadi pastikan Anda mengonversi tanggal dan waktu Teradata. |
Sintaksis kueri
Bagian ini membahas perbedaan sintaksis kueri antara Teradata dan BigQuery.
Pernyataan SELECT
Sebagian besar pernyataan SELECT
Teradata kompatibel dengan BigQuery. Tabel berikut berisi daftar
perbedaan kecil.
Teradata | BigQuery | |
---|---|---|
SEL |
Konversikan ke SELECT . BigQuery tidak menggunakan singkatan SEL . |
|
SELECT
|
Dalam BigQuery, kolom tidak dapat mereferensikan output dari kolom lain yang ditentukan dalam daftar pilihan yang sama. Memilih memindahkan subkueri ke
klausa WITH .
WITH flags AS (
|
|
SELECT * FROM table
|
BigQuery tidak menggunakan predikat logika ANY .Fungsi yang sama dapat dicapai menggunakan beberapa operator OR :SELECT * FROM table Dalam hal ini, perbandingan string juga berbeda. Lihat Operator perbandingan. |
|
SELECT TOP 10 * FROM table
|
BigQuery menggunakan LIMIT
di akhir kueri, bukan TOP n , dengan mengikuti
kata kunci SELECT .
|
Operator perbandingan
Tabel berikut menampilkan operator perbandingan Teradata yang khusus untuk Teradata dan harus dikonversi ke operator yang sesuai dengan ANSI SQL:2011 yang digunakan di BigQuery.
Untuk informasi tentang operator di BigQuery, lihat bagian Operator dalam dokumentasi BigQuery.
Teradata | BigQuery | Catatan |
---|---|---|
exp EQ exp2 exp IN (exp2, exp3)
|
exp = exp2 exp IN (exp2, exp3) Untuk mempertahankan semantik non-ANSI untuk NOT CASESPECIFIC , Anda dapat menggunakanRTRIM(UPPER(exp)) = RTRIM(UPPER(exp2))
|
Saat membandingkan string untuk kesamaan, Teradata mungkin mengabaikan spasi kosong
di akhir, sedangkan BigQuery menganggapnya sebagai bagian dari
string. Misalnya, 'xyz'=' xyz' adalah TRUE di Teradata, tetapi FALSE di BigQuery.Teradata juga menyediakan atribut kolom
NOT CASESPECIFIC yang menginstruksikan Teradata untuk mengabaikan kapitalisasi saat membandingkan dua string. BigQuery selalu bersifat
spesifik per kasus saat membandingkan string. Misalnya, 'xYz' = 'xyz' adalah
TRUE di Teradata, tetapi FALSE di BigQuery.
|
exp LE exp2 |
exp <= exp2 |
|
exp LT exp2 |
exp < exp2 |
|
exp NE exp2 |
exp <> exp2
|
|
exp GE exp2 |
exp >= exp2 |
|
exp GT exp2 |
exp > exp2 |
Kondisi JOIN
BigQuery dan Teradata mendukung kondisi JOIN
, ON
, dan USING
yang sama. Tabel berikut
berisi daftar perbedaan kecil.
Teradata | BigQuery | Catatan |
---|---|---|
FROM A LEFT OUTER JOIN B ON A.date >
B.start_date AND A.date < B.end_date
|
FROM A LEFT OUTER JOIN (SELECT d FROM B JOIN
UNNEST(GENERATE_DATE_ARRAY(B.start_date, B.end_date)) d)
B ON A.date = B.date
|
BigQuery mendukung klausa JOIN ketidaksetaraan untuk semua gabungan dalam atau jika setidaknya satu kondisi kesetaraan diberikan (=). Namun, bukan
hanya satu kondisi ketidaksetaraan (= dan <) dalam OUTER JOIN .
Konstruksi tersebut terkadang digunakan untuk mengkueri rentang tanggal atau bilangan bulat.
BigQuery mencegah pengguna membuat cross join berukuran besar secara tidak sengaja.
|
FROM A, B ON A.id = B.id
|
FROM A JOIN B ON A.id = B.id
|
Penggunaan koma di antara tabel di Teradata sama dengan INNER JOIN ,
sedangkan di BigQuery sama dengan CROSS JOIN
(produk Kartesius). Karena koma di BigQuery
SQL lama diperlakukan sebagai UNION , sebaiknya buat operasi menjadi eksplisit untuk menghindari kebingungan.
|
FROM A JOIN B ON
(COALESCE(A.id , 0) = COALESCE(B.id, 0))
|
FROM A JOIN B ON
(COALESCE(A.id , 0) = COALESCE(B.id, 0))
|
Tidak ada perbedaan untuk fungsi skalar (konstan). |
FROM A JOIN B ON
A.id = (SELECT MAX(B.id) FROM B)
|
FROM A JOIN (SELECT MAX(B.id) FROM B)
B1 ON A.id = B1.id
|
BigQuery mencegah pengguna menggunakan subkueri, subkueri yang berkorelasi, atau agregasi dalam predikat gabungan. Hal ini memungkinkan BigQuery memparalelkan kueri. |
Konversi jenis dan casting
BigQuery memiliki jenis data yang lebih sedikit tetapi lebih luas daripada Teradata. Hal ini mengharuskan BigQuery untuk melakukan transmisi dengan lebih ketat.
Teradata | BigQuery | Catatan |
---|---|---|
exp EQ exp2 exp IN (exp2, exp3)
|
exp = exp2 exp IN (exp2, exp3) Untuk mempertahankan semantik non-ANSI untuk NOT CASESPECIFIC , Anda dapat menggunakanRTRIM(UPPER(exp)) = RTRIM(UPPER(exp2))
|
Saat membandingkan string untuk kesamaan, Teradata mungkin mengabaikan spasi kosong
di akhir, sedangkan BigQuery menganggapnya sebagai bagian dari
string. Misalnya, 'xyz'=' xyz' adalah TRUE di Teradata, tetapi FALSE di BigQuery.Teradata juga menyediakan atribut kolom
NOT CASESPECIFIC yang menginstruksikan Teradata untuk mengabaikan kapitalisasi saat membandingkan dua string. BigQuery selalu bersifat
spesifik per kasus saat membandingkan string. Misalnya, 'xYz' = 'xyz' adalah
TRUE di Teradata, tetapi FALSE di BigQuery.
|
CAST(long_varchar_column AS CHAR(6))
|
LPAD(long_varchar_column, 6)
|
Transmisi kolom karakter di Teradata terkadang digunakan sebagai cara non-standar dan tidak optimal untuk membuat substring dengan padding. |
CAST(92617 AS TIME)
92617 (FORMAT '99:99:99')
|
PARSE_TIME("%k%M%S", CAST(92617 AS STRING)) |
Teradata melakukan banyak konversi jenis yang lebih implisit dan pembulatan daripada BigQuery, yang umumnya lebih ketat dan menerapkan standar ANSI.
(Contoh ini menampilkan 09:26:17) |
CAST(48.5 (FORMAT 'zz') AS FLOAT)
|
CAST(SUBSTR(CAST(48.5 AS STRING), 0, 2) AS FLOAT64) |
Jenis data floating point dan numerik dapat memerlukan aturan pembulatan khusus saat diterapkan dengan format seperti mata uang.
(Contoh ini menampilkan 48) |
Lihat juga Operator perbandingan dan format kolom. Perbandingan dan pemformatan kolom dapat berperilaku seperti transmisi jenis.
Klausa QUALIFY
, ROWS
Dengan klausa QUALIFY
di Teradata, Anda dapat
memfilter hasil untuk fungsi jendela.
Atau, frasa ROWS
dapat digunakan untuk tugas yang sama. Cara kerjanya mirip dengan kondisi HAVING
untuk klausa GROUP
, yang membatasi output dari apa yang disebut fungsi jendela di BigQuery.
Teradata | BigQuery |
---|---|
SELECT col1, col2
|
Klausa QUALIFY Teradata dengan fungsi
jendela seperti ROW_NUMBER() , SUM() , COUNT() , dan dengan OVER PARTITION BY dinyatakan dalam
BigQuery sebagai WHERE pada subkueri yang
berisi nilai analitik. Menggunakan ROW_NUMBER() .SELECT col1, col2 Menggunakan ARRAY_AGG , yang mendukung partisi lebih besar:
SELECT
|
SELECT col1, col2
|
SELECT col1, col2 Di BigQuery, RANGE dan ROWS
dapat digunakan dalam klausa frame jendela. Namun, klausa jendela hanya dapat
digunakan dengan fungsi jendela seperti AVG() , bukan dengan fungsi
penomoran seperti ROW_NUMBER() . |
Kata kunci NORMALIZE
Teradata menyediakan kata kunci
NORMALIZE
untuk klausa SELECT
guna menggabungkan periode atau interval yang tumpang-tindih ke dalam
satu periode atau interval yang mencakup semua nilai periode individual.
BigQuery tidak mendukung jenis PERIOD
, sehingga setiap kolom jenis PERIOD
di Teradata harus dimasukkan ke dalam BigQuery sebagai dua kolom DATE
atau DATETIME
terpisah yang sesuai dengan awal dan akhir
dari periode.
Teradata | BigQuery |
---|---|
SELECT NORMALIZE
|
SELECT
|
Functions
Bagian berikut mencantumkan pemetaan antara fungsi Teradata dan BigQuery yang setara.
Fungsi agregat
Tabel berikut memetakan agregat Teradata, agregat statistik, dan perkiraan fungsi agregat ke BigQuery yang setara dengan BigQuery. BigQuery menawarkan fungsi agregat tambahan berikut:
ANY_VALUE
APPROX_COUNT_DISTINCT
APPROX_QUANTILES
APPROX_TOP_COUNT
APPROX_TOP_SUM
COUNTIF
LOGICAL_AND
LOGICAL_OR
STRING_AGG
Teradata | BigQuery |
---|---|
AVG |
AVG |
BITAND |
BIT_AND |
BITNOT |
Operator bukan bitwise (~ ) |
BITOR |
BIT_OR |
BITXOR |
BIT_XOR |
CORR |
CORR |
COUNT |
COUNT |
COVAR_POP |
COVAR_POP |
COVAR_SAMP |
COVAR_SAMP |
MAX |
MAX |
MIN |
MIN |
REGR_AVGX |
AVG( |
REGR_AVGY |
AVG( |
REGR_COUNT |
SUM( |
REGR_INTERCEPT |
AVG(dep_var_expression) - AVG(ind_var_expression) *
(COVAR_SAMP(ind_var_expression,
|
REGR_R2 |
(COUNT(dep_var_expression)* |
REGR_SLOPE |
- COVAR_SAMP(ind_var_expression, |
REGR_SXX |
SUM(POWER(ind_var_expression, 2)) -
COUNT(ind_var_expression) * |
REGR_SXY |
SUM(ind_var_expression * dep_var_expression) -
COUNT(ind_var_expression) |
REGR_SYY |
SUM(POWER(dep_var_expression, 2)) -
COUNT(dep_var_expression) |
SKEW |
Fungsi kustom yang ditentukan pengguna. |
STDDEV_POP |
STDDEV_POP |
STDDEV_SAMP |
STDDEV_SAMP,
STDDEV |
SUM |
SUM |
VAR_POP |
VAR_POP |
VAR_SAMP |
VAR_SAMP,
VARIANCE |
Fungsi analisis dan fungsi jendela
Tabel berikut memetakan fungsi analisis Teradata umum dan menggabungkan fungsi analisis ke fungsi jendela BigQuery yang setara. BigQuery menawarkan fungsi tambahan berikut:
Fungsi tanggal/waktu
Tabel berikut memetakan fungsi tanggal/waktu umum Teradata ke BigQuery yang setara. BigQuery menawarkan fungsi tanggal/waktu tambahan berikut:
CURRENT_DATETIME
DATE_ADD
DATE_DIFF
DATE_FROM_UNIX_DATE
DATE_SUB
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
PARSE_DATE
PARSE_DATETIME
PARSE_TIME
PARSE_TIMESTAMP
STRING
TIME
TIME_ADD
TIME_DIFF
TIME_SUB
TIME_TRUNC
TIMESTAMP
TIMESTAMP_ADD
TIMESTAMP_DIFF
TIMESTAMP_MICROS
TIMESTAMP_MILLIS
TIMESTAMP_SECONDS
TIMESTAMP_SUB
TIMESTAMP_TRUNC
UNIX_DATE
UNIX_MICROS
UNIX_MILLIS
UNIX_SECONDS
Teradata | BigQuery |
---|---|
ADD_MONTHS |
DATE_ADD,
TIMESTAMP_ADD
|
CURRENT_DATE |
CURRENT_DATE
|
CURRENT_TIME |
CURRENT_TIME
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP
|
DATE + k |
DATE_ADD(date_expression,
INTERVAL k DAY)
|
DATE - k |
DATE_SUB(date_expression,
INTERVAL k DAY)
|
EXTRACT |
EXTRACT(DATE),
EXTRACT(TIMESTAMP)
|
FORMAT_DATE
|
|
FORMAT_DATETIME
|
|
FORMAT_TIME
|
|
FORMAT_TIMESTAMP
|
|
LAST_DAY |
LAST_DAY
Catatan: Fungsi ini mendukung ekspresi input DATE dan DATETIME .
|
MONTHS_BETWEEN |
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEXT_DAY |
DATE_ADD( |
OADD_MONTHS |
DATE_SUB( |
td_day_of_month |
EXTRACT(DAY FROM date_expression) |
td_day_of_week |
EXTRACT(DAYOFWEEK FROM date_expression) |
td_day_of_year |
EXTRACT(DAYOFYEAR FROM date_expression) |
td_friday |
DATE_TRUNC( |
td_monday |
DATE_TRUNC( |
td_month_begin |
DATE_TRUNC(date_expression, MONTH)
|
td_month_end |
DATE_SUB( |
td_month_of_calendar |
(EXTRACT(YEAR FROM date_expression) - 1900) * 12 + EXTRACT(MONTH FROM date_expression)
|
td_month_of_quarter |
EXTRACT(MONTH FROM date_expression) |
td_month_of_year |
EXTRACT(MONTH FROM date_expression) |
td_quarter_begin |
DATE_TRUNC(date_expression, QUARTER)
|
td_quarter_end |
DATE_SUB( |
td_quarter_of_calendar |
(EXTRACT(YEAR FROM date_expression) |
td_quarter_of_year |
EXTRACT(QUARTER FROM date_expression) |
td_saturday |
DATE_TRUNC( |
td_sunday |
DATE_TRUNC( |
td_thursday |
DATE_TRUNC( |
td_tuesday |
DATE_TRUNC( |
td_wednesday |
DATE_TRUNC( |
td_week_begin |
DATE_TRUNC(date_expression, WEEK)
|
td_week_end |
DATE_SUB( |
td_week_of_calendar |
(EXTRACT(YEAR FROM date_expression) - 1900) * 52 + EXTRACT(WEEK FROM date_expression)
|
td_week_of_month |
EXTRACT(WEEK FROM date_expression) |
td_week_of_year |
EXTRACT(WEEK FROM date_expression) |
td_weekday_of_month |
CAST( |
td_year_begin |
DATE_TRUNC(date_expression, YEAR)
|
td_year_end |
DATE_SUB( |
td_year_of_calendar |
EXTRACT(YEAR FROM date_expression)
|
TO_DATE |
PARSE_DATE
|
TO_TIMESTAMP |
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ |
PARSE_TIMESTAMP
|
Fungsi string
Tabel berikut memetakan fungsi string Teradata ke BigQuery yang setara. BigQuery menawarkan fungsi string tambahan berikut:
BYTE_LENGTH
CODE_POINTS_TO_BYTES
ENDS_WITH
FROM_BASE32
FROM_BASE64
FROM_HEX
NORMALIZE
NORMALIZE_AND_CASEFOLD
REGEXP_CONTAINS
REGEXP_EXTRACT
REGEXP_EXTRACT_ALL
REPEAT
REPLACE
SAFE_CONVERT_BYTES_TO_STRING
SPLIT
STARTS_WITH
STRPOS
TO_BASE32
TO_BASE64
TO_CODE_POINTS
TO_HEX
Teradata | BigQuery |
---|---|
ASCII |
TO_CODE_POINTS(string_expression)[OFFSET(0)]
|
CHAR2HEXINT |
TO_HEX
|
CHARACTER LENGTH |
CHAR_LENGTH
|
CHARACTER LENGTH |
CHARACTER_LENGTH
|
CHR |
CODE_POINTS_TO_STRING( |
CONCAT, (|| operator) |
CONCAT, (|| operator)
|
CSV |
Fungsi kustom yang ditentukan pengguna. |
CSVLD |
Fungsi kustom yang ditentukan pengguna. |
FORMAT |
FORMAT
|
INDEX |
STRPOS(string, substring)
|
INITCAP |
INITCAP |
INSTR |
Fungsi kustom yang ditentukan pengguna. |
LEFT |
SUBSTR(source_string, 1, length)
|
LENGTH |
LENGTH
|
LOWER |
LOWER
|
LPAD |
LPAD
|
LTRIM |
LTRIM
|
NGRAM |
Fungsi kustom yang ditentukan pengguna. |
NVP |
Fungsi kustom yang ditentukan pengguna. |
OREPLACE |
REPLACE
|
OTRANSLATE |
Fungsi kustom yang ditentukan pengguna. |
POSITION |
STRPOS(string, substring)
|
REGEXP_INSTR |
STRPOS(source_string, Catatan: Menampilkan kemunculan pertama. |
REGEXP_REPLACE |
REGEXP_REPLACE |
REGEXP_SIMILAR |
IF(REGEXP_CONTAINS,1,0) |
REGEXP_SUBSTR |
REGEXP_EXTRACT, |
REGEXP_SPLIT_TO_TABLE |
Fungsi kustom yang ditentukan pengguna. |
REVERSE |
REVERSE
|
RIGHT |
SUBSTR(source_string, -1, length)
|
RPAD |
RPAD
|
RTRIM |
RTRIM
|
STRTOK Catatan: Setiap karakter dalam argumen string pembatas dianggap sebagai karakter pembatas yang terpisah. Pemisah defaultnya adalah karakter spasi. |
SPLIT(instring, delimiter)[ORDINAL(tokennum)] Catatan: Seluruh argumen string pembatas digunakan sebagai pembatas tunggal. Pemisah defaultnya adalah koma. |
STRTOK_SPLIT_TO_TABLE |
Fungsi kustom yang ditentukan pengguna |
SUBSTRING , SUBSTR |
SUBSTR
|
TRIM |
TRIM
|
UPPER |
UPPER
|
Fungsi matematika
Tabel berikut memetakan fungsi matematika Teradata ke BigQuery yang setara. BigQuery menawarkan fungsi matematika tambahan berikut:
Teradata | BigQuery |
---|---|
ABS |
ABS |
ACOS |
ACOS |
ACOSH |
ACOSH |
ASIN |
ASIN |
ASINH |
ASINH |
ATAN |
ATAN |
ATAN2 |
ATAN2 |
ATANH |
ATANH |
CEILING |
CEIL |
CEILING |
CEILING |
COS |
COS |
COSH |
COSH |
EXP |
EXP |
FLOOR |
FLOOR |
GREATEST |
GREATEST |
LEAST |
LEAST |
LN |
LN |
LOG |
LOG |
MOD (operator % ) |
MOD |
NULLIFZERO |
NULLIF(expression, 0) |
POWER (operator ** ) |
POWER,
POW
|
RANDOM |
RAND |
ROUND |
ROUND |
SIGN |
SIGN |
SIN |
SIN |
SINH |
SINH |
SQRT |
SQRT |
TAN |
TAN |
TANH |
TANH |
TRUNC |
TRUNC |
ZEROIFNULL |
IFNULL(expression, 0),
COALESCE(expression, 0)
|
Sintaksis DML
Bagian ini membahas perbedaan sintaksis bahasa pengelolaan data antara Teradata dan BigQuery.
Pernyataan INSERT
Sebagian besar pernyataan INSERT
Teradata kompatibel dengan BigQuery.
Tabel berikut menunjukkan pengecualian.
Skrip DML di BigQuery memiliki semantik konsistensi yang sedikit berbeda dengan pernyataan yang setara di Teradata. Untuk ringkasan
snapshot isolation serta penanganan sesi dan transaksi, lihat bagian
CREATE INDEX
di tempat lain dalam dokumen ini.
Teradata | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO
table (...) VALUES (...); Teradata menawarkan kata kunci DEFAULT untuk kolom non-nullable.Catatan: Di BigQuery, menghilangkan nama kolom dalam pernyataan INSERT hanya berfungsi jika nilai untuk semua kolom dalam
tabel target dimasukkan dalam urutan naik berdasarkan
posisi ordinal mereka. |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO
table VALUES (1,2,3),
Teradata memiliki konsep permintaan multi-pernyataan (MSR), yang mengirim beberapa pernyataan INSERT
dalam satu waktu. Di BigQuery, opsi ini tidak direkomendasikan karena adanya batas transaksi implisit antar pernyataan.
Sebagai gantinya, gunakan
INSERT multi-nilai.BigQuery mengizinkan pernyataan INSERT serentak, tetapi dapat mengantrekan UPDATE .
Untuk meningkatkan performa, pertimbangkan pendekatan berikut:
|
Pernyataan UPDATE
Sebagian besar pernyataan UPDATE
Teradata kompatibel dengan BigQuery, kecuali untuk item berikut:
- Saat Anda menggunakan klausa
FROM
, pengurutan klausaFROM
danSET
dibalik di Teradata dan BigQuery. - Di GoogleSQL, setiap pernyataan
UPDATE
harus menyertakan kata kunciWHERE
, diikuti dengan kondisi. Untuk memperbarui semua baris dalam tabel, gunakanWHERE true
.
Sebagai praktik terbaik, Anda harus mengelompokkan beberapa mutasi DML, bukan pernyataan
UPDATE
dan INSERT
tunggal. Skrip DML di BigQuery memiliki semantik konsistensi yang sedikit berbeda dengan pernyataan yang setara di Teradata.
Untuk ringkasan tentang snapshot isolation serta penanganan sesi dan transaksi, lihat bagian CREATE INDEX
di tempat lain dalam dokumen ini.
Tabel berikut menampilkan pernyataan UPDATE
Teradata dan pernyataan BigQuery yang menyelesaikan tugas yang sama.
Untuk mengetahui informasi selengkapnya tentang UPDATE
di BigQuery, lihat contoh UPDATE
BigQuery dalam dokumentasi DML.
Teradata | BigQuery | |
---|---|---|
UPDATE table_A
|
UPDATE table_A
|
|
UPDATE table alias
|
UPDATE table
|
|
UPDATE table_A
|
UPDATE table_A
|
Pernyataan DELETE
dan TRUNCATE
Pernyataan DELETE
dan TRUNCATE
adalah cara untuk menghapus baris dari tabel tanpa memengaruhi skema atau indeks tabel. TRUNCATE
tidak digunakan baik di Teradata maupun BigQuery. Namun, Anda dapat menggunakan pernyataan DELETE
untuk mencapai efek yang sama.
Di BigQuery, pernyataan DELETE
harus memiliki klausa WHERE
.
Untuk menghapus semua baris dalam tabel (potong), gunakan WHERE true
. Guna mempercepat operasi
pemotongan untuk tabel yang sangat besar, sebaiknya gunakan pernyataan
CREATE OR REPLACE TABLE ... AS SELECT
, dengan menggunakan LIMIT 0
pada tabel yang sama untuk menggantikannya sendiri. Namun,
pastikan untuk menambahkan informasi partisi dan pengelompokan secara manual saat menggunakannya.
Teradata kemudian melakukan vakum untuk menghapus baris. Ini berarti bahwa operasi DELETE
awalnya lebih cepat daripada di BigQuery, tetapi nantinya akan memerlukan resource, terutama operasi DELETE
berskala besar yang memengaruhi sebagian besar
tabel. Untuk menggunakan pendekatan serupa di BigQuery, sebaiknya kurangi jumlah operasi DELETE
, misalnya dengan menyalin baris yang tidak akan dihapus ke tabel baru. Atau, Anda dapat menghapus seluruh partisi.
Kedua opsi ini dirancang agar menjadi operasi yang lebih cepat daripada mutasi DML atomik.
Untuk mengetahui informasi selengkapnya tentang DELETE
di BigQuery, lihat contoh DELETE
dalam dokumentasi DML.
Teradata | BigQuery |
---|---|
BEGIN TRANSACTION;
|
Mengganti konten tabel dengan output kueri setara dengan transaksi. Anda dapat melakukannya dengan operasi kueri
atau operasi salinan. Menggunakan operasi kueri:
bq query --replace --destination_table table_A 'SELECT * FROM table_B';
Menggunakan operasi salinan: bq cp -f table_A table_B |
DELETE database.table ALL; |
DELETE FROM table WHERE TRUE; Atau untuk tabel yang sangat besar dengan cara yang lebih cepat: CREATE OR REPLACE table AS SELECT * FROM table LIMIT 0;
|
Pernyataan MERGE
Pernyataan MERGE
dapat menggabungkan operasi INSERT
, UPDATE
, dan DELETE
menjadi satu pernyataan "upsert" dan melakukan operasi secara atomik. Operasi
MERGE
harus cocok dengan maksimal satu baris sumber untuk setiap baris target.
BigQuery dan Teradata mengikuti Sintaksis ANSI.
Operasi MERGE
Teradata dibatasi untuk kunci utama yang cocok dalam satu
pemroses modul akses (AMP).
Sebaliknya, BigQuery tidak memiliki batasan ukuran atau kolom untuk operasi MERGE
, sehingga penggunaan MERGE
adalah pengoptimalan yang bermanfaat. Namun,
jika MERGE
utamanya adalah penghapusan besar, lihat pengoptimalan untuk DELETE
di bagian lain dalam dokumen ini.
Skrip DML di BigQuery memiliki semantik konsistensi yang sedikit berbeda dengan pernyataan yang setara di Teradata. Misalnya, tabel SET Teradata dalam mode sesi dapat mengabaikan duplikat selama operasi MERGE
. Untuk ringkasan tentang penanganan tabel MULTISET dan
SET, snapshot isolation, serta penanganan sesi dan transaksi,
lihat bagian
CREATE INDEX
di tempat lain dalam dokumen ini.
Variabel yang terpengaruh baris
Di Teradata, variabel ACTIVITY_COUNT
adalah ekstensi SQL Teradata ANSI yang diisi dengan jumlah baris yang terpengaruh oleh pernyataan DML.
Variabel sistem @@row_count
di Fitur pembuatan skrip memiliki fungsi yang serupa.
Di BigQuery, akan lebih umum untuk memeriksa nilai yang ditampilkan numDmlAffectedRows
di log audit atau tampilan INFORMATION_SCHEMA
.
Sintaksis DDL
Bagian ini membahas perbedaan sintaksis bahasa definisi data antara Teradata dan BigQuery.
Pernyataan CREATE TABLE
Sebagian besar pernyataan CREATE TABLE
Teradata kompatibel dengan BigQuery, kecuali untuk elemen sintaksis berikut, yang tidak digunakan di BigQuery:
MULTISET
. Lihat bagianCREATE INDEX
.VOLATILE
. Lihat bagian Tabel sementara.[NO] FALLBACK
. Lihat bagian Rollback.[NO] BEFORE JOURNAL
,[NO] AFTER JOURNAL
CHECKSUM = DEFAULT | val
DEFAULT MERGEBLOCKRATIO
PRIMARY INDEX (col, ...)
. Lihat bagianCREATE INDEX
.UNIQUE PRIMARY INDEX
. Lihat bagianCREATE INDEX
.CONSTRAINT
DEFAULT
IDENTITY
Untuk mengetahui informasi selengkapnya tentang CREATE TABLE
di BigQuery, lihat contoh CREATE
BigQuery dalam dokumentasi DML.
Opsi dan atribut kolom
Spesifikasi kolom berikut untuk pernyataan CREATE TABLE
tidak digunakan di BigQuery:
FORMAT 'format'
. Lihat bagian pemformatan jenis Teradata.CHARACTER SET name
. BigQuery selalu menggunakan encoding UTF-8.[NOT] CASESPECIFIC
COMPRESS val | (val, ...)
Teradata memperluas standar ANSI dengan opsi kolom
TITLE
. Fitur ini dapat diterapkan juga di BigQuery menggunakan deskripsi kolom seperti yang ditunjukkan pada tabel berikut. Perlu diperhatikan bahwa opsi ini
tidak tersedia untuk View.
Teradata | BigQuery |
---|---|
CREATE TABLE table (
|
CREATE TABLE dataset.table (
|
Tabel sementara
Teradata mendukung tabel volatil, yang sering digunakan untuk menyimpan hasil perantara dalam skrip. Ada beberapa cara untuk mencapai sesuatu yang mirip dengan tabel volatil di BigQuery:
CREATE TEMPORARY TABLE
dapat digunakan dalam Pembuatan skrip, dan valid selama masa pakai skrip. Jika tabel harus ada di luar skrip, Anda dapat menggunakan opsi lain dalam daftar ini.TTL set data: Membuat set data yang memiliki time to live (TTL) singkat (misalnya, 1 jam) sehingga tabel yang dibuat dalam set data bersifat sementara karena tidak akan dipertahankan lebih lama dari time to live (TTL) set data. Anda dapat memberikan awalan untuk semua nama tabel dalam set data ini dengan
temp
untuk menunjukkan dengan jelas bahwa tabel tersebut bersifat sementara.Tabel TTL: Membuat tabel yang memiliki time to live (TTL) singkat khusus tabel menggunakan pernyataan DDL yang mirip dengan berikut ini:
CREATE TABLE temp.name (col1, col2, ...) OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
Klausa
WITH
: Jika tabel sementara hanya diperlukan dalam blok yang sama, gunakan hasil sementara menggunakan pernyataanWITH
atau subkueri. Ini adalah opsi yang paling efisien.
Pola yang sering digunakan dalam skrip Teradata (BTEQ)
adalah membuat tabel permanen, menyisipkan nilai di dalamnya, menggunakannya seperti tabel sementara
dalam pernyataan yang sedang berlangsung, lalu menghapusnya atau memotong tabel setelahnya.
Akibatnya, tabel tersebut digunakan sebagai variabel konstan (semaphore). Pendekatan ini tidak efisien di BigQuery, dan sebaiknya gunakan variabel nyata di Pembuatan skrip, atau gunakan CREATE OR REPLACE
dengan sintaksis kueri AS SELECT
untuk membuat tabel yang sudah memiliki nilai di dalamnya.
Pernyataan CREATE VIEW
Tabel berikut menunjukkan padanan antara Teradata dan BigQuery untuk pernyataan CREATE VIEW
. Klausa untuk penguncian tabel seperti LOCKING ROW FOR ACCESS
tidak diperlukan dalam BigQuery.
Teradata | BigQuery | Catatan |
---|---|---|
CREATE VIEW view_name AS SELECT ...
|
CREATE VIEW
view_name AS SELECT ...
|
|
REPLACE VIEW view_name AS SELECT ...
|
CREATE OR REPLACE VIEW
|
|
Tidak didukung |
CREATE VIEW IF NOT EXISTS
|
Membuat tampilan baru hanya jika tampilan saat ini tidak ada dalam set data yang ditentukan. |
Pernyataan CREATE [UNIQUE] INDEX
Teradata memerlukan indeks untuk semua tabel dan memerlukan solusi khusus seperti tabel MULTISET dan Tabel NoPI agar dapat digunakan dengan data yang tidak unik atau tidak diindeks.
BigQuery tidak memerlukan indeks. Bagian ini menjelaskan pendekatan di BigQuery terkait cara membuat fungsionalitas yang mirip dengan penggunaan indeks di Teradata ketika terdapat kebutuhan logika bisnis yang sebenarnya.
Pengindeksan untuk performa
Karena merupakan database berorientasi kolom dengan pengoptimalan kueri dan penyimpanan, BigQuery tidak memerlukan indeks eksplisit. BigQuery menyediakan fungsionalitas seperti partisi dan pengelompokan serta kolom bertingkat, yang dapat meningkatkan efisiensi dan performa kueri dengan mengoptimalkan cara penyimpanan data.
Teradata tidak mendukung tampilan terwujud. Namun, metode ini menawarkan indeks join menggunakan pernyataan CREATE JOIN INDEX
yang pada dasarnya mewujudkan data yang diperlukan untuk join. BigQuery tidak memerlukan indeks terwujud untuk mempercepat performa, seperti halnya BigQuery tidak memerlukan ruang spool khusus untuk join.
Untuk kasus pengoptimalan lainnya, tampilan terwujud dapat digunakan.
Pengindeksan untuk konsistensi (UNIQUE, PRIMARY INDEX)
Di Teradata, indeks unik dapat digunakan untuk mencegah baris dengan kunci non-unik dalam tabel. Jika sebuah proses mencoba menyisipkan atau memperbarui data yang memiliki nilai yang sudah ada dalam indeks, operasi akan gagal dengan pelanggaran indeks (tabel MULTISET) atau mengabaikannya secara diam-diam (tabel SET).
Karena BigQuery tidak menyediakan indeks eksplisit, pernyataan MERGE
dapat digunakan untuk menyisipkan hanya data unik ke dalam tabel target dari tabel staging sambil menghapus data duplikat. Namun, tidak ada cara untuk mencegah pengguna yang memiliki izin edit agar tidak menyisipkan data duplikat, karena BigQuery tidak pernah mengunci selama operasi INSERT
.
Untuk menghasilkan error pada data duplikat di BigQuery, Anda dapat menggunakan pernyataan MERGE
dari tabel staging, seperti yang ditunjukkan pada contoh berikut.
Teradata | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t
|
Lebih sering, pengguna lebih memilih untuk
menghapus duplikat secara terpisah
untuk menemukan error dalam sistem downstream.
BigQuery tidak mendukung kolom DEFAULT
dan IDENTITY
(urutan).
Pengindeksan untuk mencapai penguncian
Teradata menyediakan resource di
pemroses modul akses
(AMP); kueri dapat menggunakan resource semua AMP, AMP tunggal, atau grup AMP. Pernyataan DDL
berupa semua AMP dan karenanya mirip dengan kunci DDL global.
BigQuery tidak memiliki mekanisme kunci seperti ini dan dapat menjalankan kueri serentak dan pernyataan INSERT
sesuai kuota Anda; hanya pernyataan DML UPDATE
serentak yang memiliki implikasi serentak tertentu:
Operasi UPDATE
terhadap partisi yang sama dimasukkan ke dalam antrean untuk memastikan snapshot isolation, sehingga Anda tidak perlu mengunci untuk mencegah pembacaan semu atau hilangnya update.
Karena perbedaan ini, elemen Teradata berikut tidak digunakan di BigQuery:
ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;
Pernyataan SQL prosedural
Bagian ini menjelaskan cara mengonversi pernyataan SQL prosedural yang digunakan
dalam prosedur, fungsi, dan pemicu tersimpan dari Teradata
ke Pembuatan skrip, prosedur, atau fungsi yang ditentukan pengguna (UDF) BigQuery.
Semua ini tersedia bagi administrator sistem untuk diperiksa menggunakan
tampilan
INFORMATION_SCHEMA
.
Pernyataan CREATE PROCEDURE
Prosedur tersimpan didukung sebagai bagian dari Pembuatan skrip BigQuery.
Di BigQuery, Pembuatan skrip mengacu pada semua penggunaan pernyataan kontrol, sedangkan prosedur diberi nama skrip (dengan argumen jika diperlukan) yang dapat dipanggil dari Skrip lain dan disimpan secara permanen, jika diperlukan. Fungsi yang ditentukan pengguna (UDF) juga dapat ditulis dalam JavaScript.
Teradata | BigQuery |
---|---|
CREATE PROCEDURE |
CREATE PROCEDURE
jika nama diperlukan. Jika tidak, gunakan inline dengan BEGIN
atau dalam satu baris dengan CREATE TEMP FUNCTION .
|
REPLACE PROCEDURE |
CREATE OR REPLACE PROCEDURE |
CALL |
CALL |
Bagian berikut ini menjelaskan cara mengonversi pernyataan prosedural Teradata yang ada menjadi pernyataan Pembuatan skrip BigQuery yang memiliki fungsi serupa.
Deklarasi dan penetapan variabel
Variabel BigQuery valid selama masa pakai skrip.
Teradata | BigQuery |
---|---|
DECLARE |
DECLARE |
SET |
SET |
Pengendali kondisi error
Teradata menggunakan pengendali pada kode status dalam prosedur kontrol error. Di BigQuery, penanganan error adalah fitur inti dari alur kontrol utama, mirip dengan yang disediakan oleh bahasa lain dengan blok TRY ... CATCH
.
Teradata | BigQuery |
---|---|
DECLARE EXIT HANDLER
FOR SQLEXCEPTION |
BEGIN ... EXCEPTION WHEN ERROR THEN |
SIGNAL sqlstate |
RAISE message |
DECLARE CONTINUE HANDLER
FOR SQLSTATE VALUE 23505; |
Pengendali pengecualian yang dipicu untuk kondisi error tertentu tidak digunakan oleh BigQuery. Sebaiknya gunakan pernyataan ASSERT
saat kondisi keluar digunakan untuk prapemeriksaan atau proses debug, karena pernyataan ini sesuai dengan ANSI SQL:2011. |
Variabel SQLSTATE
di Teradata mirip dengan variabel sistem @@error
di BigQuery. Di BigQuery, penyelidikan error lebih umum dilakukan menggunakan log audit atau tampilan INFORMATION_SCHEMA
.
Deklarasi dan operasi kursor
Karena BigQuery tidak mendukung kursor atau sesi, pernyataan berikut tidak digunakan di BigQuery:
DECLARE cursor_name CURSOR [FOR | WITH] ...
PREPARE stmt_id FROM sql_str;
OPEN cursor_name [USING var, ...];
FETCH cursor_name INTO var, ...;
CLOSE cursor_name;
Pernyataan SQL dinamis
Fitur pembuatan skrip di BigQuery mendukung pernyataan SQL dinamis seperti yang ditunjukkan dalam tabel berikut.
Teradata | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str; |
EXECUTE IMMEDIATE
sql_str; |
EXECUTE
stmt_id [USING var,...]; |
EXECUTE IMMEDIATE
stmt_id USING var; |
Pernyataan Dynamic SQL berikut tidak digunakan di BigQuery:
PREPARE stmt_id FROM sql_str;
Pernyataan flow-of-control
Fitur pembuatan skrip di BigQuery mendukung pernyataan flow-of-control seperti yang ditunjukkan dalam tabel berikut.
Teradata | BigQuery |
---|---|
IF condition THEN stmts ELSE stmts END IF
|
IF condition THEN stmts ELSE stmts END IF |
label_name: LOOP stmts END LOOP label_name;
|
Konstruksi blok bergaya GOTO tidak digunakan di BigQuery. Sebaiknya tulis ulang fungsi tersebut sebagai fungsi yang ditentukan pengguna (UDF) atau gunakan pernyataan ASSERT yang digunakan untuk penanganan error.
|
REPEAT stmts UNTIL condition END REPEAT;
|
WHILE condition DO stmts END WHILE |
LEAVE outer_proc_label;
|
LEAVE tidak digunakan untuk blok bergaya GOTO; LEAVE digunakan sebagai sinonim untuk BREAK untuk keluar dari loop WHILE . |
LEAVE label;
|
LEAVE tidak digunakan untuk blok bergaya GOTO; LEAVE digunakan sebagai sinonim untuk BREAK guna keluar dari loop WHILE . |
WITH RECURSIVE temp_table AS ( ... );
|
Kueri rekursif (juga dikenal sebagai ekspresi tabel umum rekursif (CTE)) tidak digunakan di BigQuery. Fungsi tersebut dapat ditulis ulang menggunakan array UNION ALL . |
Pernyataan flow-of-control berikut tidak digunakan di BigQuery karena BigQuery tidak menggunakan kursor atau sesi:
Pernyataan SQL transaksi dan metadata
Teradata | BigQuery |
---|---|
HELP TABLE table_name;
HELP VIEW view_name;
|
SELECT Kueri yang sama valid untuk mendapatkan informasi kolom untuk tampilan. Untuk mengetahui informasi selengkapnya, lihat Tampilan kolom di INFORMATION_SCHEMA BigQuery. |
SELECT * FROM dbc.tables WHERE tablekind = 'T'; (tampilan DBC Teradata) |
SELECT Untuk mengetahui informasi selengkapnya, lihat Pengantar INFORMATION_SCHEMA BigQuery. |
HELP STATISTICS table_name; |
APPROX_COUNT_DISTINCT(col) |
COLLECT STATS USING SAMPLE ON table_name column (...); |
Tidak digunakan di BigQuery. |
LOCKING TABLE table_name FOR EXCLUSIVE; |
BigQuery selalu menggunakan snapshot isolation. Untuk mengetahui detailnya, lihat Jaminan konsistensi di bagian lain dalam dokumen ini. |
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ... |
BigQuery selalu menggunakan Snapshot Isolation. Untuk mengetahui detailnya, lihat Jaminan konsistensi di bagian lain dalam dokumen ini. |
BEGIN TRANSACTION; |
BigQuery selalu menggunakan Snapshot Isolation. Untuk mengetahui detailnya, lihat Jaminan konsistensi di bagian lain dalam dokumen ini. |
EXPLAIN ... |
Tidak digunakan di BigQuery. Fitur serupa adalah penjelasan paket kueri di UI web BigQuery dan alokasi slot yang terlihat di tampilan INFORMATION_SCHEMA dan di log audit di
Cloud Monitoring. |
Pernyataan SQL multi-pernyataan dan multi-baris
Teradata dan BigQuery mendukung transaksi (sesi) sehingga mendukung pernyataan yang dipisahkan oleh titik koma yang dijalankan bersama secara konsisten. Untuk informasi selengkapnya, lihat Transaksi multi-pernyataan.
Kode dan pesan error
Kode error Teradata dan kode error BigQuery berbeda. BigQuery menyediakan REST API dan terutama mengandalkan kode status HTTP serta pesan error yang mendetail.
Jika logika aplikasi Anda saat ini menemukan error berikut, cobalah untuk menghapus sumber error, karena BigQuery tidak akan menampilkan kode error yang sama.
SQLSTATE = '02000'
—"Baris tidak ditemukan"SQLSTATE = '21000'
—"Pelanggaran kardinalitas (Indeks Unik)"SQLSTATE = '22000'
—"Pelanggaran data (Jenis Data)"SQLSTATE = '23000'
—"Pelanggaran Batasan"
Di BigQuery, akan lebih umum untuk menggunakan tampilan INFORMATION_SCHEMA
atau log audit untuk melihat perincian error.
Untuk informasi tentang cara menangani kesalahan dalam Pembuatan skrip, lihat bagian berikut ini.
Jaminan konsistensi dan transaction isolation
Teradata dan BigQuery bersifat atomik—yaitu, sesuai dengan ACID pada tingkat per mutasi di banyak baris. Misalnya, operasi MERGE
sepenuhnya atomik, bahkan dengan beberapa nilai yang disisipkan dan diperbarui.
Transaksi
Teradata menyediakan Baca yang Tidak Di-commit (memungkinkan pembacaan kotor) atau Transaksi serialisasi tingkat isolasi saat berjalan dalam mode sesi (bukan mode commit otomatis). Dalam kasus terbaik, Teradata mencapai isolasi serialisasi secara ketat dengan menggunakan penguncian pesimis terhadap hash baris di semua kolom baris di semua partisi. Deadlock dapat terjadi. DDL selalu memaksakan batas transaksi. Tugas Fastload Teradata berjalan secara independen, tetapi hanya pada tabel kosong.
BigQuery juga
mendukung transaksi.
BigQuery membantu memastikan kontrol konkurensi optimis (yang pertama kali di-commit) dengan isolasi snapshot, di mana kueri membaca pesan terakhir yang di-commit data sebelum kueri dimulai. Pendekatan
ini menjamin tingkat konsistensi yang sama per baris, per mutasi
dan di seluruh baris dalam pernyataan DML yang sama, sembari menghindari deadlock. Dalam kasus beberapa pernyataan UPDATE
berbeda dari tabel yang sama, BigQuery beralih ke kontrol konkurensi pesimis dan mengantrekan beberapa pernyataan UPDATE
, yang secara otomatis mencoba kembali jika terjadi konflik. Pernyataan DML dan
tugas pemuatan INSERT
dapat berjalan secara serentak dan terpisah untuk ditambahkan ke tabel.
Rollback
Teradata mendukung
mode rollback dua sesi,
mode sesi ANSI, dan mode sesi Teradata (SET SESSION CHARACTERISTICS
dan
SET SESSION TRANSACTION
), bergantung pada mode rollback yang Anda inginkan. Jika terjadi kegagalan, transaksi mungkin tidak di-roll back.
BigQuery mendukung pernyataan ROLLBACK TRANSACTION
.
Tidak ada pernyataan ABORT
di BigQuery.
Batas database
Selalu periksa Dokumentasi publik BigQuery untuk mengetahui kuota dan batas terbaru. Banyak kuota untuk pengguna bervolume besar dapat ditambah dengan menghubungi tim Dukungan Cloud. Tabel berikut menunjukkan perbandingan batas database Teradata dan BigQuery.
Batas | Teradata | BigQuery |
---|---|---|
Tabel per database | Tidak dibatasi | Tidak dibatasi |
Kolom per tabel | 2.048 | 10.000 |
Ukuran baris maksimum | 1 MB | 100 MB |
Panjang nama tabel dan kolom | 128 karakter Unicode | 16.384 karakter Unicode |
Baris per tabel | Tak terbatas | Tak terbatas |
Panjang permintaan SQL maksimum | 1 MB | 1 MB (panjang kueri GoogleSQL maksimum yang belum terselesaikan) 12 MB (panjang maksimum kueri GoogleSQL dan lama yang diselesaikan) Streaming:
|
Ukuran permintaan dan respons maksimum | 7 MB (permintaan), 16 MB (respons) | 10 MB (permintaan) dan 10 GB (respons), atau hampir tidak terbatas jika Anda menggunakan penomoran halaman atau Cloud Storage API. |
Jumlah maksimum sesi konkuren | 120 per mesin penguraian (PE) | 100 kueri konkuren (dapat diajukan dengan pemesanan slot), 300 permintaan API konkuren per pengguna. |
Jumlah maksimum pemuatan konkuren (cepat) | 30 (default 5) | Tidak ada batas permintaan konkurensi; pekerjaan dimasukkan ke dalam antrean. 100.000 tugas pemuatan per project per hari. |