Bagaimana kolom panjang memengaruhi kinerja dan penggunaan disk?

26

Dalam proyek kami saat ini, itu terjadi terlalu sering, sehingga kami perlu memperluas kolom dengan beberapa karakter. Dari varchar(20)ke varchar(30)dan seterusnya.

Pada kenyataannya, seberapa penting hal itu? Seberapa baik ini dioptimalkan? Apa dampak dari hanya membiarkan 100 atau 200 atau bahkan 500 karakter untuk bidang "input" yang normal? Email hanya dapat memiliki 320 karakter, jadi ok - ada batas yang baik di sana. Tetapi apa yang saya dapatkan jika saya atur ke 200, karena saya tidak mengharapkan alamat email yang lebih lama dari itu.

Biasanya tabel kami tidak akan memiliki lebih dari 100.000 baris, dan hingga 20 atau 30 kolom tersebut.

Kami menggunakan SQL Server 2008 sekarang, tetapi akan menarik untuk mengetahui bagaimana DB yang berbeda menangani masalah ini.

Jika dampaknya sangat rendah - seperti yang saya perkirakan, akan membantu untuk mendapatkan beberapa argumen yang bagus (didukung dengan tautan?) Untuk meyakinkan DBA saya, bahwa paranoia medan panjang ini tidak benar-benar diperlukan.

Dalam hal ini, saya di sini untuk belajar :-)

Lars Corneliussen
sumber

Jawaban:

12

Jawaban spesifik untuk pertanyaan Anda (setidaknya untuk Oracle dan mungkin basis data lainnya) adalah bahwa panjang bidang tidak masalah, hanya panjang data. Namun, ini tidak boleh digunakan sebagai faktor penentu mengenai apakah akan mengatur bidang ke panjang maksimum yang diijinkan atau tidak. Berikut adalah beberapa masalah lain yang harus Anda pertimbangkan sebelum memaksimalkan ukuran bidang.

Memformat Setiap alat klien yang memformat data berdasarkan ukuran bidang akan memerlukan pertimbangan pemformatan khusus. Oracle SQL * Plus misalnya secara default menampilkan ukuran maksimum kolom Varchar2 bahkan jika datanya hanya satu karakter. Membandingkan…

create table f1 (a varchar2(4000), b varchar2(4000));
create table f2 (a varchar2(5), b varchar2(5));
insert into f1 values ('a','b');
insert into f2 values ('a','b');
select * from f1;
select * from f2;

Bad Data Field length menyediakan mekanisme tambahan untuk menangkap / mencegah data buruk. Sebuah antarmuka tidak boleh mencoba memasukkan 3000 karakter ke dalam bidang 100 karakter, tetapi jika bidang itu didefinisikan 4000 karakter, mungkin saja. Kesalahan tidak akan tertangkap pada tahap entri data, tetapi sistem mungkin mengalami masalah lebih lanjut ketika aplikasi lain mencoba memproses data dan tersedak. Sebagai contoh, jika Anda kemudian memutuskan untuk mengindeks bidang di Oracle Anda akan melebihi panjang kunci maksimum (tergantung pada ukuran blok dan rangkaian). Lihat…

create index i1 on f1(a);

Memori Jika aplikasi klien mengalokasikan memori menggunakan ukuran maksimum, aplikasi akan mengalokasikan secara signifikan lebih banyak memori daripada yang diperlukan. Pertimbangan khusus harus dilakukan untuk menghindari hal ini.

Dokumentasi Ukuran bidang menyediakan titik data dokumentasi tentang data tersebut. Kita bisa memanggil semua tabel t1, t2, t3, dll. Dan semua bidang f1, f2, f3, dll., Tetapi dengan menentukan nama yang bermakna, kita lebih memahami data. Misalnya, jika tabel alamat untuk perusahaan dengan pelanggan di AS memiliki bidang yang disebut Status yang terdiri dari dua karakter, kami berharap singkatan status dua karakter dimasukkan di dalamnya. Di sisi lain, jika bidangnya seratus karakter, kita mungkin mengharapkan nama negara lengkap untuk ditampilkan di bidang tersebut.


Semua yang dikatakan, tampaknya bijaksana untuk dipersiapkan untuk perubahan. Hanya karena semua nama produk Anda hari ini muat dalam 20 karakter tidak berarti mereka akan selalu demikian. Jangan berlebihan dan menghasilkan 1000, tetapi tinggalkan ruang untuk ekspansi yang masuk akal.

Leigh Riffel
sumber
Lihat juga stackoverflow.com/questions/1882073/… .
Leigh Riffel
Dokumentasi adalah sesuatu yang baik yang Anda tambahkan di sini yang belum saya lihat di tempat lain.
jeteon
9

Inilah titik awal yang baik untuk Anda.

http://www.sqlskills.com/BLOGS/KIMBERLY/post/Disk-space-is-cheap.aspx

Saya mungkin salah mengerti pertanyaan awal Anda. Biarkan saya melihat apakah saya dapat menemukan Anda beberapa tautan lain untuk referensi.

Berikut ini adalah referensi yang baik untuk pemilihan tipe data: http://sqlfool.com/2009/05/performance-considerations-of-data-types/

Mengubah dari varchar (20) ke varchar (30) mungkin tampak seperti sesuatu yang kecil, tetapi Anda perlu memahami lebih lanjut tentang bagaimana struktur basis data bekerja untuk mengetahui masalah potensial. Misalnya, pergi ke varchar (30) dapat mendorong Anda melewati titik kritis kolom Anda (jika semua 30 byte digunakan) dapat disimpan pada satu halaman (kurang dari 8060 byte). Ini akan menyebabkan peningkatan ruang disk yang digunakan, penurunan kinerja, dan bahkan beberapa overhead tambahan dengan log transaksi Anda.

Berikut ini tautan untuk struktur basis data: http://technet.microsoft.com/en-us/sqlserver/gg313756.aspx

Berikut ini adalah satu untuk pemisahan halaman dan pencatatan trx: http://sqlskills.com/BLOGS/PAUL/post/How-expensive-are-page-splits-in-terms-of-transaction-log.aspx

HTH

SQLRockstar
sumber
7

Saya pikir saya akan berbagi poin menarik lainnya, yang saya temukan di SO Pertanyaan berikut:

/programming/148398/are-there-any-disugian-to-always-using-nvarcharmax

Jawaban asli oleh: Nick Kavadias

Alasan TIDAK untuk menggunakan bidang max atau teks adalah bahwa Anda tidak dapat melakukan [membangun kembali indeks online] [1] yaitu MEMBANGUN KEMBALI DENGAN ONLINE = HIDUP bahkan dengan SQL Server Enterprise Edition.

[1]: http://msdn.microsoft.com/en-us/library/ms188388%28SQL.90%29.aspx "indeks online dibangun kembali"

Saya akan menganggap ini sebagai kerugian besar ketika menambahkan n / varchar (maks) kolom secara sewenang-wenang, dan menurut Situs MS pembatasan ini terhadap melakukan pembangunan kembali indeks online tetap di SQL Server 2008, 2008 R2 dan Denali; jadi tidak spesifik untuk SQL Server 2005.

Terima kasih, Jeff

Jeff
sumber
6

Dalam beberapa kasus, jumlah ruang yang Anda alokasikan untuk bidang varchar akan memengaruhi jumlah memori yang dialokasikan untuk jenis memori.

Saya menemukan presentasi di SQLWorkshops.com berpikir, presentasi ini berbicara tentang kasus di mana semacam untuk pesanan tumpah ke tempdb karena tidak cukup memori yang dialokasikan untuk bidang char / varchar.

http://webcasts2.sqlworkshops.com/webcasts.asp

Webcast ini juga disajikan sebagai artikel di situs web berikut:

http://www.mssqltips.com/tip.asp?tip=1955

Perhatikan dalam presentasi ini bahwa kolom yang diurutkan bukan kolom char / varchar, tetapi jumlah ruang yang dialokasikan untuk kolom varchar dalam memori membuat perbedaan dalam kinerja kueri dalam beberapa kasus.

Jeff
sumber
4

SET ANSI_PADDING AKTIF?

Anda berakhir dengan banyak jejak spasi ...

gbn
sumber
3

Yang penting hanya terkait dengan ruang disk dan panjang karakter. Tentu saja pencarian pada tipe data char dan indeks pada tipe data ini akan bertindak lebih lambat dari integer tetapi ini adalah diskusi lain.

Tipe data Varchar adalah tipe data "variabel" jadi jika Anda menetapkan batas varchar (500) maka ini adalah panjang karakter maksimum untuk bidang itu. Panjang minimum bisa antara 0 dan 500. Di sisi lain ruang disk yang diklaim akan berbeda untuk bidang 10, 30 atau 500 karakter.

Kadang-kadang saya melakukan tes untuk tipe data varchar (800) dan untuk nilai nol saya menggunakan 17 byte, dan untuk setiap karakter yang dimasukkan ditambahkan satu byte lagi. Misalnya string 400 karakter memiliki 417 byte yang digunakan pada disk.

yrushka
sumber
3

Saya tidak berpikir, bahwa ada perbedaan antara tabel yang dibuat dengan kolom varchar (20) atau varchar ((8000), selama panjang maks sebenarnya adalah <= 20.

Di sisi lain, dalam beberapa kasus memberi pengguna kemungkinan untuk menyimpan string yang lebih lama mungkin mendorong mereka untuk melakukannya.

bernd_k
sumber