புள்ளிவலை

மூளைக்குத் தீனியில்லாத போழ்து
சிறிது மனதுக்கும் ஈயப்படும்.
posts - 23, comments - 60, trackbacks - 0

Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

சில நேரங்களில், எஸ்க்யூஎல் சர்வரிலிருந்து தகவலை எடுக்கும்பொழுது, தொடர்ச்சியான ஒரு எண்ணும் வரவழைக்கவேண்டிய தேவை இருக்கலாம். உதாரணமாக, கீழ்க்கண்டவாறு ஒரு ஒரு வினவல் இருப்பதாக வைத்துக்கொள்வோம்:

select * from table1

அதன் விடை இப்படி இருப்பதாக இருக்கிறது என்று வைத்துக்கொள்வோம்:

col1 col2 col3
inv1 2000 cust1
inv3 300 cust1
inv4 10 cust1
inv2 294 cust1


இதனோடு இன்னொரு காலம் சேர்த்து, கீழ்க்கண்டவாறான விடை நமக்குத் தேவை என்றும் வைத்துக்கொள்வோம்:

S.No col1 col2 col3
1 inv1 2000 cust1
2 inv2 294 cust1
3 inv3 300 cust1
4 inv4 10 cust1

இதனை, எஸ்க்யூஎல் சர்வர் 2000ல், கீழ்க்கண்ட ஒரு வழிமுறையில் முயற்சிக்கலாம்:

1) எல்லா ரெக்கார்டுகளையும் ஒரு தற்காலிக டேபிளில் சேமிக்கவேண்டும்
2) அந்த தற்காலிக டேபிளில் வரிசை எண்ணிற்கான ஒரு காலத்தை சேர்த்துக்கொள்ளவேண்டும்
3) இந்த வரிசை எண்ணிற்கான காலத்தை update வினவலைக் கொண்டு வரிசையான எண்களை நிரப்ப வேண்டும்
4) பிறகு இந்த தற்காலிக டேபிளில் உள்ள வரிசைகளை வினவிய மென்பொருளுக்கு அனுப்பவேண்டும்.

ஆனால், இது மிகுந்த நேரத்தையும், நினைவகத்தையும் விழுங்கும் ஒரு செயலாகும். தகவலை டேபிளிலிருந்து எடுப்பதுடன் இவையெல்லாம் கூடுதல் வேலைகளாகும்.

அதிர்ஷ்டவசமாக, எஸ்க்யூஎல் சர்வர் 2005ல், உள்ளமைந்த ஒரு ஃபங்க்‌ஷனே இந்த காரியத்தை நமக்குச் சுலபமாக செய்து தரும். அதன் பெயர் row_number().

மேற்கண்ட வினவலை நாம் மாற்றியமைக்க வேண்டுமானால், இவ்வாறு வினவலாம்:
select row_number() over(order by col1) as [S.No], * from table1

இப்படி எழுதினால், தற்காலிக/நிகழ்நிலை டேபிள்கள், அப்டேட் வினவல் எதுவும் தேவையில்லை. எனினும், மிகப்பெரிய தகவல்தளங்களில், order by மிகுந்த நேரம்பிடிக்கும். அப்படிப்பட்ட சூழ்நிலையில், Common Table Expressionsஐப் பயன்படுத்தலாம். CTE அல்லது Common Table Expressions என்பதும் ஒரு வகையில் தற்காலிக டேபிள், derived table போன்றதுதான். view என்றும் சொல்லலாம்.

with result as
(
    select * from table1
)
select row_number() over(order by col1) as [S.No], * from result

இந்த வினவல் தகவல் தளத்திலிருந்து முதலில் எல்லா தகவலையும் எடுத்துக்கொள்கிறது. பிறகு வரிசைப்படுத்தி, வரிசை எண்களை வினவிய மென்பொருளுக்கு அனுப்புகிறது. எந்தவித அப்டேட், தற்காலிக டேபிளின் தேவை இல்லாமலே இதை SQL Server 2005ல் செய்யமுடியும்

Print | posted on Wednesday, March 25, 2009 3:20 AM | Filed Under [ தகவல் தளம் ]

Feedback

Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...


First time i saw tech post in tamil!
3/25/2009 1:44 PM | Bala Singam
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

நன்றி பாலசிங்கம். நீங்களும் தமிழில் எழுதினால் மிக்க மகிழ்ச்சி.
3/26/2009 12:01 AM | pullivalai
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

அருமையான பதிவு .. வாழ்த்துக்கள்
3/31/2009 9:33 PM | gnana Prakash
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

Super Machi.. Keep posting..
4/3/2009 9:38 AM | Venkatesh
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

I don't think if you use CTE the performance is improved. internally it uses temp table. By using CTE we can not get performance benefits.
12/13/2009 10:22 AM | குரு
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

கருத்துக்கு நன்றி குரு.

நான் செய்த பரிசோதனையில், கிட்டத்திட்ட இரண்டு லட்சம் ரெக்கார்டுகளை வைத்து சோதித்துப்பார்த்தேன். பிறகு நான்கு லட்சம் ரெக்கார்டுகளை வைத்தும் சோதித்துப் பார்த்தேன். மேலே நான் குறிப்பிட்டுள்ள அதே டேபிள் structureதான். CTEஐப் பயன்படுத்தியதில் ஆறு விநாடிகளும், மேற்சொன்ன temp table/update முறையில் 11 நொடிகளும் ஆகின.

Record overall faster என்பதாக நான் உணர்கிறேன். நீங்களும் சோதித்துப் பார்த்து உங்கள் அனுபவத்தையும் பகிர்ந்து கொள்கிறீர்களா?
Gravatar

# re: Recordsetல் தானாகவே ஒரு வரிசை எண்ணை வரவழைக்க...

Hi I am subash from Mumbai
thanks for this post.
I hope you could do more.

7/1/2010 6:33 PM | subash chandra bose

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 1 and 1 and type the answer here:

Powered by: