2010-10-10 9 views
12

ओरेकल एक तालिका में TIMESTAMP प्रकार की सटीकता निर्दिष्ट करने की अनुमति देता है - SECOND डेटाटाइम फ़ील्ड के आंशिक भाग में अंकों की संख्या। क्या अधिकतम सटीक TIMESTAMP(9) निर्दिष्ट करने के कोई नुकसान हैं?ओरेकल में उच्च टाइमस्टैम्प परिशुद्धता चुनने के नुकसान क्या हैं?

एक कारण मुझे लगता है कि यह जानकारी ओरेकल उपकरणों द्वारा सुंदर आउटपुट के लिए उपयोग की जा सकती है।

अधिकतम 9 अंकों से पता चलता है कि फ़ील्ड को 4 बाइट पूर्णांक के रूप में संग्रहीत किया गया है, इसलिए इसमें कोई प्रदर्शन प्रभाव नहीं होना चाहिए, अगर मैं यहां गलत हूं तो कृपया सही करें।

उत्तर

14

कोई नुकसान, उपयोग टाइमस्टैम्प (9) अगर यह समझ में आता है कर रहे हैं।

टाइमस्टैम्प (9) और टाइमस्टैम्प (1) अंतरिक्ष की एक ही राशि का उपयोग करें, और उनके प्रदर्शन समान है। मुझे केवल एक मामला मिल सकता था जहां प्रदर्शन अंतर था, और उस मामले में टाइमस्टैम्प (9) वास्तव में टाइमस्टैम्प (1) से तेज था।

(मैं आप उबाऊ कोड टाइमस्टैम्प (1) और टाइमस्टैम्प (9) कॉलम में डालने और उन पर विभिन्न संचालन की तुलना में कई लाइनों को छोड़ देंगे।)

यह दर्शाता है कि वे का एक ही राशि का उपयोग अंतरिक्ष (कई मूल्यों डालने और dba_segments की तुलना):

--Create tables with timestamps and populate them with the same data (with different precision) 
--Set initial and next to a low value so we can closely check the segment size) 
create table timestamp1 (t1 timestamp(1), t2 timestamp(1), t3 timestamp(1), t4 timestamp(1), t5 timestamp(1)) 
storage(initial 65536 next 65536); 

insert into timestamp1 
select current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1), current_timestamp(1) 
from dual connect by level <= 100000; 

create table timestamp9 (t1 timestamp(9), t2 timestamp(9), t3 timestamp(9), t4 timestamp(9), t5 timestamp(9)) 
storage(initial 65536 next 65536); 

insert into timestamp9 
select current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9), current_timestamp(9) 
from dual connect by level <= 100000; 


--Segment size is identical 
select segment_name, bytes from dba_segments where segment_name in ('TIMESTAMP1', 'TIMESTAMP9'); 

--SEGMENT_NAME BYTES 
--TIMESTAMP1  8388608 
--TIMESTAMP9  8388608 

यह वह जगह है जहां टाइमस्टैम्प (9) तेजी से होता है, जब CURRENT_TIMESTAMP का उपयोग, जो आप शायद कुछ बिंदु पर उपयोग करने के लिए डेटा उत्पन्न करने की आवश्यकता होगी। लेकिन हम केवल 100K टाइमस्टैम्प उत्पन्न करने के लिए मेरे धीमे डेस्कटॉप पर लगभग 0.175 और 0.25 सेकंड के बीच के अंतर के बारे में बात कर रहे हैं। मुझे यकीन नहीं है कि टाइमस्टैम्प (9) तेज क्यों है, शायद टाइमस्टैम्प हमेशा टाइमस्टैम्प (9) के रूप में उत्पन्न होते हैं और फिर अन्य परिशुद्धताओं के लिए गोल होते हैं?

--current_timestamp(9) is slightly faster than current_timestamp(1) 
select count(*) from 
(
    select * 
    from dual 
    --where current_timestamp(9) = current_timestamp(9) 
    where current_timestamp(1) = current_timestamp(1) 
    connect by level <= 100000 
); 

संपादित करें: प्रदर्शन अंतर 10 जी में मौजूद है लेकिन 11 जी नहीं है।

0

समस्या प्रदर्शन है। आपको इसे परिशुद्धता के साथ व्यापार करना होगा। कम संख्या को कम CPU निर्देश में पढ़ा और लिखा जाता है। एक सीपीयू निर्देश एक नैनोसेकंड से कम लेता है, लेकिन यदि आपका सर्वर लाखों लेन-देन परोसता है तो आपको कुछ प्रदर्शन कम हो सकता है, और इससे आपको कम सटीकता को अपनाने का सुझाव मिलता है, या यहां तक ​​कि कोई परिशुद्धता नहीं है (सेकंड के लिए सभी टाइमस्टैम्प के चारों ओर गोल करना अधिकांश परिदृश्य में काफी स्वीकार्य है बैंकिंग में भी)।

लेकिन अगर आप किसी कारण, यानी के लिए। रीयल-टाइम सिस्टम लॉगिंग, अधिक सटीकता की आवश्यकता है, आपको उच्च परिशुद्धता का उपयोग करने के लिए मजबूर होना पड़ता है और इस प्रकार प्रदर्शन में कमी आती है। यदि आपका सर्वर बड़ी संख्या में टीपीएस संसाधित नहीं करता है तो आपके पास लगभग कोई प्रदर्शन प्रभाव नहीं पड़ता है, लेकिन अगर आपको सटीकता की आवश्यकता नहीं है तो आप स्मृति बर्बाद कर रहे हैं।

सहायता की उम्मीद है। यदि आप हमारे डीबी आवश्यकताओं को साझा करना चाहते हैं, तो हम आपको अपना सर्वश्रेष्ठ समझौता चुनने में मदद कर सकते हैं।

+0

टाइमस्टैम्प (1) प्रदर्शन परिप्रेक्ष्य से TIMESTAMP (9) से कितना सटीक है? क्या दूसरे अंश एक पूर्णांक के रूप में संग्रहीत नहीं हैं, इसलिए उदाहरण के लिए खोजों में सीपीयू को बिल्कुल प्रभावित नहीं करना चाहिए। क्या आप सुनिश्चित हैं कि TIMESTAMP (1) TIMESTAMP (9) से आंतरिक रूप से कम स्मृति पर कब्जा कर लेता है? – Leonid

+0

आप बस बिंदु मारा! एसक्यूएल घोषणात्मक है, नहीं, आपको कोई गारंटी नहीं है कि TIMESTAMP (1) TIMESTAMP (9) से छोटा है। उदाहरण के लिए, 64-बिट प्लेटफ़ॉर्म के लिए ओरेकल सभी टाइमस्टैम्प को स्टोर करने का निर्णय ले सकता है, चाहे आपकी पसंद चाहे, 64-बिट पूर्णांक आपको बताए बिना। लेकिन अगर आप TIMESTAMP (9) निर्दिष्ट करते हैं, तो ओरेकल आपको अनुदान देता है कि यह कभी भी सटीकता को खो नहीं देगा। प्रदर्शन के बारे में, मैं दोहराता हूं, आप _might_ केवल ** बहुत भारी ** लोड पर प्रदर्शन हानि देखते हैं, जो आपके आवेदन –

+0

के आधार पर असंभव हो सकता है या नहीं, मेरा प्रश्न यह है कि ** टाइमस्टैम्प के मामले में प्रदर्शन हानि ** आ रहा है यदि ओरेकल दूसरे के अंशों को स्टोर करने के लिए पूर्णांक का उपयोग करता है? प्रश्न में TIMESSTAMP ओरेकल प्रकार है और इसका एसक्यूएल के साथ कुछ लेना देना नहीं है। – Leonid

0

अंतर टाइमस्टैम्प डेटा प्रकार के तकनीकी उपयोग में नहीं है, लेकिन एप्लिकेशन। critical infrastructure लेबल वाले अनुप्रयोगों में उपयोग किए जाने पर एफईआरसी और एनईआरसी को अक्सर एक निश्चित परिशुद्धता की आवश्यकता होती है और इस तरह वे उपलब्ध उच्चतम परिशुद्धता का उपयोग करेंगे।

बेशक

, सूट घटनाओं रिकॉर्ड के अपने क्रम के साथ खुश करने की आवश्यकता है अक्सर की तुलना में अधिक से CIP-002 through CIP-009

0

कोई नुकसान बाहर रखी है, तो आप हमेशा के रूप में "दिनांक/टाइमस्टैम्प" Oracle अंदर डेटाप्रकार डेटा का उपयोग करने के लिए जा रहे हैं और मध्य स्तर में, हालांकि आपको देखना होगा कि आपका पूरा एप्लिकेशन/समाधान उस कॉलम का उपयोग कैसे कर रहा है।

  • क्या आप इसे प्रदर्शित करने से पहले डेटा को छोटा कर रहे हैं?
  • क्या यह अनुपालन की आवश्यकता है और इसे मुख्य रूप से पढ़ा जाता है?
  • क्या आप उस कॉलम को किसी अन्य कॉलम से तुलना करने के लिए स्ट्रिंग में कनवर्ट कर रहे हैं?
  • क्या यह ऑडिटिंग या ऑर्डर कैप्चरिंग की आवश्यकता है?

पढ़ने के बारे में बहुत ज्यादा चिंता न करें और प्रदर्शन मतभेद लिखते हैं, नगण्य हैं, पूरी तरह से स्टोरेज से यूआई तक आपकी समग्र आवश्यकताओं का मूल्यांकन करते हैं।

संबंधित मुद्दे