Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tabel Nilai Konstruktor Batas baris maksimum di Select

Tidak ada batasan kode keras yang relevan (65.536 * Ukuran Paket Jaringan 4KB adalah 268 MB dan panjang skrip Anda tidak jauh dari itu) meskipun tidak disarankan untuk menggunakan metode ini untuk jumlah baris yang besar.

Kesalahan yang Anda lihat dilemparkan oleh alat klien bukan SQL Server. Jika Anda membuat SQL String dalam kompilasi SQL dinamis setidaknya dapat dimulai dengan sukses

DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';

SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';

SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')

SELECT DATALENGTH(@SQL) / 1048576.0 AS [Length in MB] --30.517705917

EXEC(@SQL);

Meskipun saya membunuh yang di atas setelah ~ 30 menit waktu kompilasi dan masih belum menghasilkan baris. Nilai literal perlu disimpan di dalam paket itu sendiri sebagai tabel konstanta dan SQL Server menghabiskan banyak waktu mencoba untuk mendapatkan properti tentang mereka juga.

SSMS adalah aplikasi 32 bit dan menampilkan std::bad_alloc pengecualian saat mem-parsing batch

Ini mencoba untuk mendorong elemen ke vektor Token yang telah mencapai kapasitas dan upayanya untuk mengubah ukuran gagal karena tidak tersedianya area memori yang cukup besar. Jadi pernyataan itu bahkan tidak pernah sampai sejauh server.

Kapasitas vektor bertambah 50% setiap kali (yaitu mengikuti urutan di sini ). Kapasitas yang dibutuhkan vektor untuk berkembang bergantung pada bagaimana kode diletakkan.

Yang berikut ini perlu berkembang dari kapasitas 19 menjadi 28.

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

dan berikut ini hanya membutuhkan ukuran 2

SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)

Berikut ini membutuhkan kapasitas> 63 dan <=94.

SELECT *
FROM   (VALUES 
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300),
      (100,
       200,
       300)
       ) tc (proj_d, period_sid, val) 

Untuk satu juta baris yang ditata seperti pada kasus 1, kapasitas vektor perlu ditingkatkan menjadi 3.543.306.

Anda mungkin menemukan bahwa salah satu dari berikut ini akan memungkinkan penguraian sisi klien berhasil.

  1. Kurangi jumlah jeda baris.
  2. Memulai ulang SSMS dengan harapan permintaan untuk memori besar yang berdekatan berhasil jika fragmentasi ruang alamat lebih sedikit.

Namun bahkan jika Anda berhasil mengirimnya ke server, itu hanya akan berakhir dengan mematikan server selama pembuatan rencana eksekusi seperti yang dibahas di atas.

Anda akan jauh lebih baik menggunakan panduan ekspor impor untuk memuat tabel. Jika Anda harus melakukannya di TSQL, Anda akan menemukan bahwa memecahnya menjadi kumpulan yang lebih kecil dan/atau menggunakan metode lain seperti merobek-robek XML akan berkinerja lebih baik daripada Konstruktor Bernilai Tabel. Contoh berikut dijalankan dalam 13 detik di komputer saya (meskipun jika menggunakan SSMS, Anda mungkin masih harus memecah menjadi beberapa kelompok daripada menempelkan string XML literal yang besar).

DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ; 

DECLARE @Xml XML = REPLICATE(@S,1000000);

SELECT 
    x.value('@proj_d','int'),
    x.value('@period_sid','int'),
    x.value('@val','int')
FROM @Xml.nodes('/x') c(x)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL tidak dapat mengembalikan

  2. SET QUOTED IDENTIFIER harus AKTIF saat memasukkan catatan

  3. Pencarian teks lengkap di seluruh kolom gabungan?

  4. Permintaan untuk membuat daftar semua prosedur tersimpan

  5. Bagaimana cara mengeksekusi file .sql menggunakan powershell?