यह "सबसे तेज़" के बारे में एक प्रश्न है, इसलिए समय नीचे दिया गया है
परीक्षण सेटअप,>1 मिलियन पंक्तियों वाली तालिका
create table MetaDataServe (id int identity primary key, vc varchar(max));
insert MetaDataServe values
('MindWorks.Accounts'),
('MindWorks.Transactions'),
('MindWorks.Commissions');
insert MetaDataServe
select vc
from MetaDataServe, master..spt_values a, master..spt_values b
where b.number between 1 and 30
-- (1090110 row(s) affected)
सामान बनाम बदलें बनाम सबस्ट्रिंग
प्रदर्शन सारांश - सामग्री> सबस्ट्रिंग> बदलें
update MetaDataServe set vc = STUFF(vc, 9, 0, '.Client')
(परिवर्तनशीलता दिखाने के लिए 2 बार कई निष्पादन से हैं, यह काफी कम है इसलिए समय को 3% के भीतर सटीक माना जा सकता है)
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')
update MetaDataServe set vc = 'MindWorks.Client.' + SUBSTRING(vc, 11, 100)
निश्चित संख्या बनाम PATINDEX बनाम CHARINDEX
(निश्चित स्थिति संस्करण पहले से ही ऊपर दिया गया है)
प्रदर्शन सारांश - FIXED> (PATINDEX =CHARINDEX)
<उप>उप>
update MetaDataServe set vc = STUFF(vc, PATINDEX('%.%',vc), 0, '.Client')
update MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
नोट:
- ऊपर दिए गए सभी अपडेट स्टेटमेंट आपकी आवश्यकताओं के आधार पर (एक या दो बदलाव के साथ) काम करेंगे
- प्रत्येक परीक्षण से पहले, कैशिंग समस्याओं को रोकने के लिए पूरी तालिका को गिरा दिया जाता है और फिर से बनाया जाता है
सावधानी!
भले ही STUFF तेज है, आप मुश्किल परिस्थितियों में पड़ सकते हैं। अगर आपके डेटा में शामिल हैं
"MindWorksNoDot"
और आप
. का उपयोग करके अपडेट करते हैंupdate MetaDataServe set vc = STUFF(vc, CHARINDEX('.',vc), 0, '.Client')
आप NULL के साथ समाप्त होते हैं! क्योंकि जब CHARINDEX को डॉट नहीं मिल रहा है, तो शून्य (0) के STUFF का दूसरा पैरामीटर पूरे स्ट्रिंग को NULL पर जाने का कारण बनता है। ।
अंतिम शब्द
सुरक्षा और विश्वसनीयता के लिए, यह देखते हुए कि यह STUFF दृष्टिकोण से केवल 33% धीमा है, मैं बस एक REPLACE कथन का उपयोग करूंगा, अर्थात
update MetaDataServe set vc = REPLACE(vc, '.', '.Client.')