புள்ளிவலை

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

Wednesday, March 25, 2009

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ல் செய்யமுடியும்

posted @ Wednesday, March 25, 2009 3:20 AM | Feedback (7) | Filed Under [ தகவல் தளம் ]

Powered by: