प्रदर्शन में कोई अंतर नहीं है। और 2 की शक्ति के कारण कोई छिपा हुआ अनुकूलन नहीं किया गया है।
केवल एक चीज जो चीजों को संग्रहीत करने के तरीके में फर्क करती है, वह है वास्तविक जानकारी। एक VARCHAR2(2000) . में संग्रहीत 100 वर्ण कॉलम को ठीक उसी तरह संग्रहीत किया जाता है जैसे VARCHAR2(500) . में 100 वर्णों को संग्रहीत किया जाता है कॉलम।
लंबाई को व्यावसायिक बाधा के रूप में सोचें , डेटा प्रकार के भाग के रूप में नहीं। केवल एक चीज जो लंबाई के बारे में आपके निर्णय को संचालित करती है, वह है डेटा के बारे में व्यावसायिक बाधाएं जो वहां डाली जाती हैं।
संपादित करें :एकमात्र स्थिति जहां लंबाई करता है फर्क पड़ता है, जब आपको उस कॉलम पर एक इंडेक्स की आवश्यकता होती है। पुराने Oracle संस्करणों (<10) की कुंजी लंबाई पर एक सीमा थी और सूचकांक बनाते समय इसकी जाँच की गई थी।
हालांकि Oracle 11 में यह संभव है, 4000 वर्णों वाले मान पर अनुक्रमणिका रखना सबसे बुद्धिमानी का विकल्प नहीं हो सकता है।
2 संपादित करें :
तो मैं उत्सुक था और एक साधारण परीक्षण सेट किया:
create table narrow (id varchar(40));
create table wide (id varchar(4000));
फिर दोनों तालिकाओं को 40 'X' से बने तारों से भर दिया। यदि भंडारण के बीच वास्तव में एक (पर्याप्त) अंतर था, तो डेटा पुनर्प्राप्त करते समय इसे किसी भी तरह दिखाना चाहिए, है ना?
दोनों तालिकाओं में ठीक 1048576 पंक्तियाँ हैं।
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set autotrace traceonly statistics
SQL> select count(*) from wide;
Statistics
----------------------------------------------------------
0 recursive calls
1 db block gets
6833 consistent gets
0 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select count(*) from narrow;
Statistics
----------------------------------------------------------
0 recursive calls
1 db block gets
6833 consistent gets
0 physical reads
0 redo size
349 bytes sent via SQL*Net to client
472 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL>
तो दोनों तालिकाओं के लिए पूर्ण तालिका स्कैन ने बिल्कुल वैसा ही किया। तो क्या होता है जब हम वास्तव में डेटा का चयन करते हैं?
SQL> select * from wide;
1048576 rows selected.
Statistics
----------------------------------------------------------
4 recursive calls
2 db block gets
76497 consistent gets
0 physical reads
0 redo size
54386472 bytes sent via SQL*Net to client
769427 bytes received via SQL*Net from client
69907 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1048576 rows processed
SQL> select * from narrow;
1048576 rows selected.
Statistics
----------------------------------------------------------
4 recursive calls
2 db block gets
76485 consistent gets
0 physical reads
0 redo size
54386472 bytes sent via SQL*Net to client
769427 bytes received via SQL*Net from client
69907 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1048576 rows processed
SQL>
लगातार हो जाने में थोड़ा अंतर है, लेकिन यह कैशिंग के कारण हो सकता है।