तो जब मैं ORA_HASH फ़ंक्शन का उपयोग करके 25 कॉलम हैश करने का प्रयास कर रहा था तो मुझे त्रुटि मिल रही थी: बहुत अधिक पैरामीटर। क्या कोई तरीका है जिससे हम सभी 25 कॉलम और जल्दी से हैश कर सकते हैं क्योंकि हमारे पास लगभग 60M पंक्तियाँ हैं और कोई अद्यतन तिथि नहीं है :(

select  ORA_HASH
  (id,name,c....,...) form table name 
1
ZCoder 10 मार्च 2020, 06:42
2
हैशिंग एकल चर का एक कार्य है। आप 25 कॉलम में से एक मान प्राप्त करने का प्रस्ताव कैसे करते हैं? यदि वे सभी VARCHAR2 हैं, तो शायद आप उन सभी को एक साथ जोड़ सकते हैं (हालाँकि कुछ अवांछित प्रभाव होंगे: 'a' || 'bc' = 'ab' || 'c' इसलिए हैश वही रहेगा, भले ही टुपल्स हों नहीं)। लेकिन ORA_HASH का उपयोग CLOB के साथ नहीं किया जा सकता है, इसलिए यदि संयोजन का परिणाम बहुत लंबा है, तो आप परिणाम पर ORA_HASH का उपयोग नहीं कर पाएंगे। तो... ऐसा करने की कोशिश क्यों कर रहे हैं? क्या आप सुनिश्चित हैं कि यह सबसे अच्छा तरीका है?
 – 
mathguy
10 मार्च 2020, 07:09
यहाँ आपका अंतिम लक्ष्य क्या है?
 – 
David דודו Markovitz
10 मार्च 2020, 12:19

2 जवाब

सीमांकित के रूप में कुछ विशेष स्ट्रिंग के साथ संयोजन का प्रयोग करें उदा। यहाँ chr(10) यह मानते हुए कि यह चार्टर आपके डेटा में प्रकट नहीं होता है

 col1||chr(10)||col1||....

संख्यात्मक और डेटा कॉलम से सावधान रहें।

या तो उन्हें चरित्र कॉलम में स्पष्ट रूप से परिवर्तित करें, उदा।

...||to_char(col_date,'yyyy-mm-dd hh24:mi:ss')||... 

या अस्थायी रूप से एक स्थिर मान रखने के लिए सत्र सेटिंग को ओवरराइड करें

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.']';
 ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';

एनएलएस सेटिंग के साथ समस्या यह है कि, जब वे बदलते हैं और आप वर्ण स्ट्रिंग में डिफ़ॉल्ट रूपांतरण करते हैं - आपको एक अलग हैश कोड मिलता है।

यह भी ध्यान दें, कि ORA_HASH डुप्लीकेट बना सकता है, उदाहरण के लिए विचार करें। MD5 तालिका डेटा में परिवर्तन को पहचानने के लिए हैश कोड।

अंतिम नोट Oracle में एक (अज्ञात) फ़ंक्शन है DBMS_SQLHASH .GETHASH जो आप खोज रहे हैं वह हो भी सकता है और नहीं भी।

0
Marmite Bomber 10 मार्च 2020, 10:55
12.2, 18c और 19c के दस्तावेज़ीकरण में DBMS_SQLHASH का उल्लेख नहीं किया गया है। ऐसा लगता है कि यह दरारों से गिर गया। बहुत बुरा, दिलचस्प होता।
 – 
Stew Ashton
10 मार्च 2020, 12:17

निश्चित रूप से आपका अंतिम लक्ष्य हैश प्राप्त करना नहीं है? हैश किस लिए है? हो सकता है कि यह आपके लक्ष्य को प्राप्त करने का सही तरीका न हो।

दूसरा, ORA_HASH एक कमजोर, 32-बिट हैश है जो प्रत्येक 25,000 पंक्तियों के बारे में हैश टक्कर उत्पन्न करेगा! मैंने इस बारे में एक पूरी ब्लॉग पोस्ट लिखी है, देखें:

https://stewashton.wordpress.com/2014/02/15/compare-and-sync-tables-dbms_comparison/

तीसरा, संस्करण 12सी के साथ एक STANDARD_HASH फ़ंक्शन है जो काफी अच्छा प्रदर्शन करता है और जो 512 बिट्स तक जाता है! (बाइट्स नहीं जैसा कि मैंने इस उत्तर को संपादित करने से पहले कहा था ...)

अंत में, कई चीजों को एक साथ हैश करने का सही तरीका "हैश चेनिंग" है, मूल्यों को संयोजित नहीं करना। ORA_HASH तीसरे पैरामीटर का उपयोग करते हुए हैश चेनिंग (या समान प्रभाव वाला कुछ) का समर्थन करता प्रतीत होता है:

ora_hash(column1, 4294967295, ora_hash(column2))

STANDARD_HASH के साथ, मैं पहले प्रत्येक कॉलम पर व्यक्तिगत रूप से इसका उपयोग करता हूं, फिर परिणामों को संयोजित करने के लिए UTL_RAW.CONCAT का उपयोग करता हूं, फिर या तो संक्षिप्त परिणाम पर STANDARD_HASH का उपयोग करता हूं या केवल समेकित मान का उपयोग करता हूं जैसे कि यह एक बड़ा हैश थे।

0
Stew Ashton 10 मार्च 2020, 14:40