Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perilaku tabel sementara baru di Aurora Versi saya 3 SQL
Aurora My SQL version 3 menangani tabel sementara secara berbeda dari versi Aurora My sebelumnya. SQL Perilaku baru ini diwarisi dari My SQL 8.0 Community Edition. Ada dua jenis tabel sementara yang dapat dibuat dengan Aurora My SQL versi 3:
-
Tabel sementara internal (atau implisit) — Dibuat oleh Aurora SQL My engine untuk menangani operasi seperti pengurutan agregasi, tabel turunan, atau ekspresi tabel umum (). CTEs
-
Tabel sementara yang dibuat pengguna (atau eksplisit) — Dibuat oleh Aurora My SQL engine saat Anda menggunakan pernyataan.
CREATE TEMPORARY TABLE
Terdapat pertimbangan tambahan untuk tabel sementara internal dan yang dibuat pengguna pada instans DB pembaca Aurora. Kita akan membahas perubahan ini di bagian berikut.
Topik
- Mesin penyimpanan untuk tabel sementara internal (implisit)
- Membatasi ukuran tabel sementara internal dalam memori
- Mengurangi masalah kepenuhan untuk tabel sementara internal di Aurora Replicas
- Tabel sementara yang dibuat pengguna (eksplisit) pada instans DB pembaca
- Kesalahan dan mitigasi pembuatan tabel sementara
Mesin penyimpanan untuk tabel sementara internal (implisit)
Saat membuat set hasil perantara, Aurora My SQL awalnya mencoba menulis ke tabel sementara dalam memori. Langkah ini mungkin tidak berhasil karena tipe data yang tidak kompatibel atau batas yang dikonfigurasi. Jika demikian, tabel sementara dikonversi ke tabel sementara di disk, bukan disimpan di memori. Informasi lebih lanjut tentang ini dapat ditemukan di Penggunaan Tabel Sementara Internal di Saya SQL
Di Aurora My SQL versi 3, cara kerja tabel sementara internal berbeda dari versi Aurora My sebelumnya. SQL Alih-alih memilih antara InnoDB dan mesin ISAM penyimpanan Saya untuk tabel sementara seperti itu, sekarang Anda memilih antara TempTable
dan mesin MEMORY
penyimpanan.
Dengan mesin penyimpanan TempTable
, Anda dapat membuat pilihan tambahan untuk cara menangani data tertentu. Data yang terpengaruh memenuhi kumpulan memori yang menampung semua tabel sementara internal untuk instans DB.
Pilihan tersebut dapat memengaruhi performa kueri yang menghasilkan volume data sementara yang tinggi, misalnya saat melakukan agregasi seperti GROUP BY
pada tabel besar.
Tip
Jika beban kerja Anda mencakup kueri yang menghasilkan tabel sementara internal, konfirmasikan performa aplikasi Anda dengan perubahan ini melalui upaya menjalankan tolok ukur dan memantau metrik terkait performa.
Dalam kasus tertentu, jumlah data sementara sesuai dengan kumpulan memori TempTable
atau hanya memenuhi kumpulan memori dalam jumlah kecil. Jika demikian, sebaiknya gunakan pengaturan TempTable
untuk tabel sementara internal dan file yang dipetakan memori untuk menyimpan data overflow apa pun. Ini adalah pengaturan default.
Mesin penyimpanan TempTable
adalah pengaturan default. TempTable
menggunakan kumpulan memori umum untuk semua tabel sementara yang menggunakan mesin ini, bukan batas memori maksimum per tabel. Ukuran kumpulan memori ini ditentukan oleh parameter temptable_max_ram
Dalam kasus tertentu, bila Anda menggunakan mesin penyimpanan TempTable
, data sementara mungkin melebihi ukuran kumpulan memori. Jika demikian, Aurora My SQL menyimpan data luapan menggunakan mekanisme sekunder.
Anda dapat mengatur parameter temptable_max_mmap
Aurora My SQL menyimpan data overflow secara berbeda tergantung pada pilihan tujuan luapan data Anda dan apakah kueri berjalan pada instance DB penulis atau pembaca:
-
Pada instans penulis, data yang memenuhi tabel sementara internal InnoDB disimpan dalam volume klaster Aurora.
-
Pada instance penulis, data yang meluap ke file sementara yang dipetakan memori berada di penyimpanan lokal pada instance Aurora My versi 3. SQL
-
Pada instans pembaca, data overflow selalu berada pada file sementara yang dipetakan memori di penyimpanan lokal. Hal ini karena instans hanya baca tidak dapat menyimpan data apa pun pada volume klaster Aurora.
Parameter konfigurasi terkait tabel sementara internal berlaku untuk instans penulis dan pembaca dengan cara yang berbeda di klaster Anda:
-
Pada contoh pembaca, Aurora SQL My selalu menggunakan mesin penyimpanan
TempTable
. -
Ukuran default
temptable_max_mmap
adalah 1 GiB untuk instans penulis dan pembaca, berapa pun ukuran memori instans DB-nya. Anda dapat menyesuaikan nilai ini pada instans penulis dan pembaca. -
Mengatur
temptable_max_mmap
ke0
akan menonaktifkan penggunaan file sementara yang dipetakan memori pada instans penulis. -
Anda tidak dapat mengatur
temptable_max_mmap
ke0
pada instans pembaca.
catatan
Kami tidak menyarankan penggunaan parameter temptable_use_mmap
Membatasi ukuran tabel sementara internal dalam memori
Sebagaimana dibahas dalam Mesin penyimpanan untuk tabel sementara internal (implisit), Anda dapat mengontrol sumber daya tabel sementara secara global dengan menggunakan pengaturan temptable_max_ram
Anda juga dapat membatasi ukuran setiap tabel sementara internal dalam memori menggunakan parameter DB tmp_table_size
tmp_table_size
Parameter menentukan ukuran maksimum tabel sementara yang dibuat oleh mesin MEMORY
penyimpanan di Aurora SQL My versi 3.
Di Aurora My SQL versi 3.04 dan yang lebih tinggi, tmp_table_size
juga mendefinisikan ukuran maksimum tabel sementara yang dibuat oleh mesin TempTable
penyimpanan ketika parameter aurora_tmptable_enable_per_table_limit
DB diatur ke. ON
Perilaku ini dinonaktifkan secara default (OFF
), yang merupakan perilaku yang sama seperti di Aurora My SQL versi 3.03 dan versi yang lebih rendah.
-
Bila
aurora_tmptable_enable_per_table_limit
diatur keOFF
,tmp_table_size
tidak dipertimbangkan untuk tabel sementara internal dalam memori yang dibuat oleh mesin penyimpananTempTable
.Namun, batas sumber daya
TempTable
global masih berlaku. Aurora My SQL memiliki perilaku berikut ketika batasTempTable
sumber daya global tercapai:-
Instans Writer DB — Aurora SQL My secara otomatis mengonversi tabel sementara dalam memori ke tabel sementara on-disk InnoDB.
-
Instans DB pembaca – Kueri berakhir dengan kesalahan.
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sql
xx_xxx
' is full
-
-
aurora_tmptable_enable_per_table_limit
KapanON
, Aurora My SQL memiliki perilaku berikut ketikatmp_table_size
batas tercapai:-
Instans Writer DB — Aurora SQL My secara otomatis mengonversi tabel sementara dalam memori ke tabel sementara on-disk InnoDB.
-
Instans DB pembaca – Kueri berakhir dengan kesalahan.
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sql
xx_xxx
' is fullDalam kasus ini, batas sumber daya
TempTable
global dan batas per tabel berlaku.
-
catatan
Parameter aurora_tmptable_enable_per_table_limit
tidak berpengaruh saat internal_tmp_mem_storage_engineMEMORY
. Dalam hal ini, ukuran maksimum tabel sementara dalam memori ditentukan oleh nilai tmp_table_size
Contoh berikut menunjukkan perilaku parameter aurora_tmptable_enable_per_table_limit
untuk instans DB penulis dan pembaca.
contoh instans DB penulis dengan aurora_tmptable_enable_per_table_limit
diatur ke OFF
Tabel sementara dalam memori tidak dikonversi ke tabel sementara di disk InnoDB.
mysql> set aurora_tmptable_enable_per_table_limit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap; +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | 0 | 3.04.0 | 0 | 1073741824 | 1073741824 | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ 1 row in set (0.00 sec) mysql> show status like '%created_tmp_disk%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | +-------------------------+-------+ 1 row in set (0.00 sec) mysql> set cte_max_recursion_depth=4294967295; Query OK, 0 rows affected (0.00 sec) mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte; +----------+ | max(n) | +----------+ | 60000000 | +----------+ 1 row in set (13.99 sec) mysql> show status like '%created_tmp_disk%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | +-------------------------+-------+ 1 row in set (0.00 sec)
contoh instans DB penulis dengan aurora_tmptable_enable_per_table_limit
diatur ke ON
Tabel sementara dalam memori dikonversi ke tabel sementara di disk InnoDB.
mysql> set aurora_tmptable_enable_per_table_limit=1; Query OK, 0 rows affected (0.00 sec) mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size; +--------------------+------------------+------------------------------------------+------------------+ | @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size | +--------------------+------------------+------------------------------------------+------------------+ | 0 | 3.04.0 | 1 | 16777216 | +--------------------+------------------+------------------------------------------+------------------+ 1 row in set (0.00 sec) mysql> set cte_max_recursion_depth=4294967295; Query OK, 0 rows affected (0.00 sec) mysql> show status like '%created_tmp_disk%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 0 | +-------------------------+-------+ 1 row in set (0.00 sec) mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte; +---------+ | max(n) | +---------+ | 6000000 | +---------+ 1 row in set (4.10 sec) mysql> show status like '%created_tmp_disk%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Created_tmp_disk_tables | 1 | +-------------------------+-------+ 1 row in set (0.00 sec)
contoh instans DB pembaca dengan aurora_tmptable_enable_per_table_limit
diatur ke OFF
Kueri selesai tanpa kesalahan karena tmp_table_size
tidak berlaku dan batas sumber daya TempTable
global belum tercapai.
mysql> set aurora_tmptable_enable_per_table_limit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap; +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | 1 | 3.04.0 | 0 | 1073741824 | 1073741824 | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ 1 row in set (0.00 sec) mysql> set cte_max_recursion_depth=4294967295; Query OK, 0 rows affected (0.00 sec) mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte; +----------+ | max(n) | +----------+ | 60000000 | +----------+ 1 row in set (14.05 sec)
contoh instans DB pembaca dengan aurora_tmptable_enable_per_table_limit
diatur ke OFF
Kueri ini mencapai batas TempTable sumber daya global dengan aurora_tmptable_enable_per_table_limit
disetel keOFF. Kueri berakhir dengan kesalahan pada instans pembaca.
mysql> set aurora_tmptable_enable_per_table_limit=0; Query OK, 0 rows affected (0.00 sec) mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap; +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ | 1 | 3.04.0 | 0 | 1073741824 | 1073741824 | +--------------------+------------------+------------------------------------------+---------------------+----------------------+ 1 row in set (0.00 sec) mysql> set cte_max_recursion_depth=4294967295; Query OK, 0 rows affected (0.01 sec) mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 120000000) SELECT max(n) FROM cte; ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_1586_2' is full
contoh instans DB pembaca dengan aurora_tmptable_enable_per_table_limit
diatur ke ON
Kueri berakhir dengan kesalahan saat batas tmp_table_size
tercapai.
mysql> set aurora_tmptable_enable_per_table_limit=1; Query OK, 0 rows affected (0.00 sec) mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size; +--------------------+------------------+------------------------------------------+------------------+ | @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size | +--------------------+------------------+------------------------------------------+------------------+ | 1 | 3.04.0 | 1 | 16777216 | +--------------------+------------------+------------------------------------------+------------------+ 1 row in set (0.00 sec) mysql> set cte_max_recursion_depth=4294967295; Query OK, 0 rows affected (0.00 sec) mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte; ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_8_2' is full
Mengurangi masalah kepenuhan untuk tabel sementara internal di Aurora Replicas
Untuk mencegah masalah pembatasan ukuran pada tabel sementara, atur parameter temptable_max_ram
dan temptable_max_mmap
ke nilai gabungan yang dapat memenuhi persyaratan beban kerja Anda.
Berhati-hatilah saat mengatur nilai parameter temptable_max_ram
. Mengatur nilai terlalu tinggi mengurangi memori yang tersedia pada instance database, yang dapat menyebabkan suatu out-of-memory kondisi. Pantau memori rata-rata yang dapat dikosongkan pada instans DB. Lalu, tentukan nilai yang sesuai untuk temptable_max_ram
, sehingga Anda akan tetap memiliki memori bebas dalam jumlah wajar yang tersisa pada instans. Untuk informasi selengkapnya, lihat .
Penting juga bagi Anda untuk memantau ukuran penyimpanan lokal dan konsumsi ruang tabel sementara. Anda dapat memantau penyimpanan sementara yang tersedia untuk instans DB tertentu dengan CloudWatch metrik FreeLocalStorage
Amazon, yang dijelaskan dalam CloudWatch Metrik Amazon untuk Amazon Aurora.
catatan
Prosedur ini tidak berfungsi bila parameter aurora_tmptable_enable_per_table_limit
diatur ke ON
. Untuk informasi selengkapnya, lihat Membatasi ukuran tabel sementara internal dalam memori.
contoh 1
Anda tahu bahwa tabel sementara Anda berkembang menjadi berukuran kumulatif 20 GiB. Anda ingin mengatur tabel sementara dalam memori ke 2 GiB dan mengembangkannya menjadi maksimum 20 GiB pada disk.
Atur temptable_max_ram
ke 2,147,483,648
dan temptable_max_mmap
ke 21,474,836,480
. Nilai ini dihitung dalam byte.
Pengaturan parameter ini memastikan bahwa tabel sementara Anda dapat berkembang menjadi total kumulatif 22 GiB.
contoh 2
Ukuran instans Anda saat ini adalah 16xlarge atau lebih besar. Anda tidak mengetahui ukuran total tabel sementara yang mungkin Anda perlukan. Anda ingin dapat menggunakan hingga 4 GiB dalam memori dan hingga ukuran penyimpanan maksimum yang tersedia pada disk.
Atur temptable_max_ram
ke 4,294,967,296
dan temptable_max_mmap
ke 1,099,511,627,776
. Nilai ini dihitung dalam byte.
Di sini, Anda mengatur temptable_max_mmap
ke 1 TiB, yang lebih kecil dari penyimpanan lokal maksimum sebesar 1,2 TiB pada instans DB Aurora 16xlarge.
Pada ukuran instans yang lebih kecil, sesuaikan nilai temptable_max_mmap
agar tidak mengisi penyimpanan lokal yang tersedia. Misalnya, instans 2xlarge hanya memiliki penyimpanan lokal yang tersedia sebesar 160 GiB. Karena itu, sebaiknya atur nilainya menjadi kurang dari 160 GiB. Untuk informasi selengkapnya tentang penyimpanan lokal yang tersedia untuk ukuran instans DB, lihat Batas penyimpanan sementara untuk Aurora My SQL.
Tabel sementara yang dibuat pengguna (eksplisit) pada instans DB pembaca
Anda dapat membuat tabel sementara eksplisit menggunakan kata kunci TEMPORARY
dalam pernyataan CREATE TABLE
. Tabel sementara eksplisit didukung pada instans DB penulis di klaster DB Aurora. Anda juga dapat menggunakan tabel sementara eksplisit pada instans DB pembaca, tetapi tabel tidak dapat menerapkan penggunaan mesin penyimpanan InnoDB.
Untuk menghindari kesalahan saat membuat tabel sementara eksplisit pada instance DB Aurora SQL My reader, pastikan Anda menjalankan CREATE TEMPORARY TABLE
semua pernyataan dengan salah satu atau kedua cara berikut:
-
Jangan tentukan klausa
ENGINE=InnoDB
. -
Jangan atur SQL mode ke
NO_ENGINE_SUBSTITUTION
.
Kesalahan dan mitigasi pembuatan tabel sementara
Kesalahan yang Anda terima berbeda tergantung pada apakah Anda menggunakan pernyataan CREATE TEMPORARY TABLE
biasa atau variasi CREATE TEMPORARY TABLE AS SELECT
. Contoh berikut menunjukkan berbagai jenis kesalahan.
Perilaku tabel sementara ini hanya berlaku untuk instans hanya-baca. Contoh pertama ini mengonfirmasi jenis instans yang terhubung dengan sesi.
mysql>
select @@innodb_read_only;+--------------------+ | @@innodb_read_only | +--------------------+ | 1 | +--------------------+
Untuk CREATE TEMPORARY TABLE
pernyataan biasa, pernyataan gagal saat NO_ENGINE_SUBSTITUTION
SQL mode dihidupkan. Ketika NO_ENGINE_SUBSTITUTION
dinonaktifkan (default), substitusi mesin yang sesuai dibuat, dan pembuatan tabel sementara berhasil.
mysql>
set sql_mode = 'NO_ENGINE_SUBSTITUTION';mysql>
CREATE TEMPORARY TABLE tt2 (id int) ENGINE=InnoDB;ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).
mysql>
SET sql_mode = '';mysql>
CREATE TEMPORARY TABLE tt4 (id int) ENGINE=InnoDB;mysql>
SHOW CREATE TABLE tt4\G*************************** 1. row *************************** Table: tt4 Create Table: CREATE TEMPORARY TABLE `tt4` ( `id` int DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Untuk CREATE TEMPORARY TABLE AS SELECT
pernyataan, pernyataan gagal saat NO_ENGINE_SUBSTITUTION
SQL mode dihidupkan. Ketika NO_ENGINE_SUBSTITUTION
dinonaktifkan (default), substitusi mesin yang sesuai dibuat, dan pembuatan tabel sementara berhasil.
mysql>
set sql_mode = 'NO_ENGINE_SUBSTITUTION';mysql>
CREATE TEMPORARY TABLE tt1 ENGINE=InnoDB AS SELECT * FROM t1;ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).
mysql>
SET sql_mode = ''; mysql> show create table tt3;+-------+----------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------+ | tt3 | CREATE TEMPORARY TABLE `tt3` ( `id` int DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------+----------------------------------------------------------+ 1 row in set (0.00 sec)
Untuk informasi lebih lanjut tentang aspek penyimpanan dan implikasi kinerja tabel sementara di Aurora SQL My versi 3, lihat posting blog Gunakan TempTable mesin penyimpanan di Amazon untuk SQL My dan RDS Amazon Aurora My