MySQL ROW_NUMBER() පැහැදිලි කිරීම (MySQL 8.0): ශ්‍රේණිගත කිරීම, Top‑N විමසුම්, සහ නකල් ඉවත් කිරීම

目次

1. හැඳින්වීම

MySQL version 8.0 නව විශේෂාංග බොහොමයක් හඳුන්වා දුන්නා, ඉතා ප්‍රසිද්ධ එකක් වන්නේ වින්ඩෝ ක්‍රියාකාරකම් සඳහා සහය වීමයි. මෙම ලිපියේ, අපි බහුලව භාවිතා වන ක්‍රියාකාරකම්之一 වන ROW_NUMBER() මත අවධානය යොමු කරමු.

ROW_NUMBER() ක්‍රියාකාරකම දත්ත විශ්ලේෂණය සහ වාර්තාකරණය සඳහා ශක්තිමත් හැකියාවන් ලබා දේ, විශේෂිත කොන්දේසි මත දත්ත සකස් කිරීම සහ රැංකි කිරීම පහසු කරයි. මෙම ලිපිය මූලික භාවිතය, ප්‍රායෝගික උදාහරණ, සහ පරණ MySQL අනුවාද සඳහා විකල්ප ක්‍රමයන් ඇතුළත් කරමින් සියල්ල පැහැදිලි කරයි.

ඉලක්කගත පාඨකයන්

  • මූලික SQL දැනුම ඇති ආරම්භක සිට මධ්‍යම පරිශීලකයන්
  • MySQL භාවිතා කරමින් දත්ත සැකසීම සහ විශ්ලේෂණය කරන ඉංජිනේරුවන් සහ දත්ත විශ්ලේෂකයන්
  • නවතම MySQL අනුවාදයට මාරු වීමට සිතන ඕනෑම කෙනෙකු

ROW_NUMBER() හි ප්‍රතිලාභ

මෙම ක්‍රියාකාරකම ඔබට විශේෂිත කොන්දේසි මත එක් එක් පේළියට අද්විතීය අංකයක් නියම කිරීමට ඉඩ සලසයි. උදාහරණයක් ලෙස, “විකුණුම් අඩු වීමේ අනුක්‍රමයෙන් රැංකි කිරීම” හෝ “නකල් දත්ත ලබාගෙන සංවිධානය කිරීම” වැනි ප්‍රශ්න පහසුවෙන්, සංක්ෂිප්ත ලෙස ලියන්න පුළුවන්.

පරණ අනුවාදවල, ඔබට පරිශීලක-නිර්වචිත විචල්‍ය භාවිතා කරමින් සංකීර්ණ ප්‍රශ්න ලිවිය යුතු විය. ROW_NUMBER() සමඟ, ඔබේ SQL සරල හා කියවීමට පහසු වේ.

මෙම ලිපියේ, අපි ස concreto ප්‍රශ්න උදාහරණ භාවිතා කරමින්, ඒවා ආරම්භක‑හිතකාමී ආකාරයෙන් පැහැදිලි කරමු. ඊළඟ කොටසේ, මෙම ක්‍රියාකාරකමේ මූලික ව්‍යවස්ථාව සහ හැසිරීම පිළිබඳව වැඩිදුරටත් විස්තර කරමු.

2. ROW_NUMBER() ක්‍රියාකාරකම කුමක්ද?

ROW_NUMBER() ක්‍රියාකාරකම, MySQL 8.0 හි නවින් එකතු කරන ලද වින්ඩෝ ක්‍රියාකාරකමක් වන අතර, පේළිවලට අනුක්‍රමික අංක නියම කරයි. එය පේළිවලට නියමිත අනුක්‍රමයක් අනුව හෝ එක් එක් කණ්ඩායම තුළ අංකනය කළ හැකි අතර, දත්ත විශ්ලේෂණය සහ වාර්තාකරණය සඳහා ඉතා ප්‍රයෝජනවත් වේ. මෙහිදී, අපි මූලික ව්‍යවස්ථාව විස්තරාත්මකව, ප්‍රායෝගික උදාහරණ සමඟ පැහැදිලි කරමු.

ROW_NUMBER() හි මූලික ව්‍යවස්ථාව

පළමුව, ROW_NUMBER() හි මූලික ආකෘතිය පහත පරිදි වේ.

SELECT
    column_name,
    ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY sort_column) AS row_num
FROM
    table_name;

එක් එක් අංගයේ අර්ථය

  • ROW_NUMBER() : එක් එක් පේළියට අනුක්‍රමික අංකයක් නියම කරයි.
  • OVER : වින්ඩෝ ක්‍රියාකාරකම සඳහා වින්ඩෝ එක නිර්වචනය කිරීමට භාවිතා වන යතුරුපදය.
  • PARTITION BY : නියමිත තීරුව අනුව දත්ත කණ්ඩායම් කරයි. විකල්පය. ඉවත් කළහොත්, සියලු පේළි සඳහා අංකනය සිදු වේ.
  • ORDER BY : අංක නියම කිරීම සඳහා භාවිතා වන අනුක්‍රමය, අර්ථාත් සෝට් කිරීමේ මාර්ගෝපදේශය.

මූලික උදාහරණය

උදාහරණයක් ලෙස, “sales” නමැති වගුවක් පහත දත්ත සමඟ ඇති බව ගණනය කරමු.

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

විකුණුම් අඩු වීමේ අනුක්‍රමයෙන් එක් එක් දෙපාර්තමේන්තුව තුළ අනුක්‍රමික අංක නියම කිරීමට, පහත ප්‍රශ්නය භාවිතා කරන්න.

SELECT
    employee,
    department,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS row_num
FROM
    sales;

ප්‍රතිඵලය

employeedepartmentsalerow_num
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

මෙම ප්‍රතිඵලයෙන්, දෙපාර්තමේන්තුවක් තුළ විකුණුම් අනුව රැංකි කිරීම පෙන්වෙන බව දැකිය හැක.

PARTITION BY භාවිතා කිරීමේ ආකාරය

ඉහත උදාහරණයේ, දත්ත “department” තීරුව අනුව කණ්ඩායම් කර ඇත. මෙය එක් එක් දෙපාර්තමේන්තුව සඳහා වෙනම අනුක්‍රමයක් නියම කරයි.

PARTITION BY ඉවත් කළහොත්, සියලු පේළි සඳහා එකම අනුක්‍රමයක් ලෙස අංකනය සිදු වේ.

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (ORDER BY sale DESC) AS row_num
FROM
    sales;

ප්‍රතිඵලය

employeesalerow_num
B8001
D7002
C6003
A5004

ROW_NUMBER() හි ලක්ෂණ සහ අවධානම්

  • අද්විතීය අංකනය : අගයන් එකසේ වුවත්, නියම කරන ලද අංකයන් අද්විතීය වේ.
  • NULL ගණනාවල සැකසීම : ORDER BY හි NULL ඇතුළත් නම්, ඒවා ඉහළ අනුක්‍රමයේ පළමුව සහ පහළ අනුක්‍රමයේ අවසන් පෙන්වයි.
  • කාර්ය සාධන බලපෑම : විශාල දත්ත කට්ටල සඳහා, ORDER BY වියදම් වැඩි විය හැක, එබැවින් නිසි ඉන්ඩෙක්සිං වැදගත් වේ.

3. ප්‍රායෝගික භාවිතා අවස්ථා

මෙන්න MySQL හි ROW_NUMBER() ක්‍රියාකාරකම භාවිතා කරන ප්‍රායෝගික අවස්ථා. මෙම ක්‍රියාකාරකම දත්ත රැංකි කිරීම, නකල් දත්ත සැකසීම වැනි බොහෝ සැබෑ-ලෝක අවස්ථා වල ප්‍රයෝජනවත් වේ.

3-1. කණ්ඩායමක් තුළ රැංකි කිරීම

උදාහරණයක් ලෙස, විකුණුම් දත්ත භාවිතා කරමින් ඔබට “එක් එක් දෙපාර්තමේන්තුව තුළ විකුණුම් අනුව සේවකයින් අනුපිළිවෙලට සකස් කිරීම” අවශ්‍ය තත්ත්වය සලකා බලන්න. පහත දත්ත සෙට් එක උදාහරණයක් ලෙස භාවිතා කරන්න.

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

අභ්‍යාර්ථන උදාහරණය: දෙපාර්තමේන්තු අනුව විකුණුම් අනුපිළිවෙල

SELECT
    employee,
    department,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

ප්‍රතිඵල:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

මෙලෙස, එක් එක් දෙපාර්තමේන්තුවට විකුණුම් අනුපිළිවෙල අනුව බහිරව සකස් කළ එහිම අනුපිළිවෙලක් ලැබෙන අතර, එයින් අනුපිළිවෙල ජනනය කිරීම පහසු වේ.

3-2. මුල් N පේළි නිර්ගමනය කිරීම

ඊළඟට, ඔබට “එක් එක් දෙපාර්තමේන්තුව තුළ විකුණුම් අනුව මුල් 3 සේවකයින් නිර්ගමනය කිරීම” අවශ්‍ය තත්ත්වයක් බලමු.

අභ්‍යාර්ථන උදාහරණය: මුල් N පේළි නිර්ගමනය කිරීම

WITH RankedSales AS (
    SELECT
        employee,
        department,
        sale,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
    FROM
        sales
)
SELECT
    employee,
    department,
    sale
FROM
    RankedSales
WHERE
    rank <= 3;

ප්‍රතිඵල:

employeedepartmentsale
BSales Department800
ASales Department500
DDevelopment Department700
CDevelopment Department600

මෙම උදාහරණයෙන් එක් එක් දෙපාර්තමේන්තුව තුළ විකුණුම් අනුව මුල් 3 පේළි පමණක් නිර්ගමනය කර ගනී. ඔබට පෙනෙන පරිදි, ROW_NUMBER() අනුපිළිවෙල සඳහා පමණක් නොව, මුල් ප්‍රතිඵල පෙරලි කිරීම සඳහාද සුදුසු ය.

3-3. බෙදුම් දත්ත සොයා ඉවත් කිරීම

දත්ත සමුදායන්හි කලාතුරකිරීම් සමහර විට බෙදුම් වාර්තා අඩංගු වේ. එවැනි අවස්ථාවලදී, ROW_NUMBER() භාවිතා කරමින් ඒවා පහසුවෙන් කළමනාකරණය කළ හැක.

අභ්‍යාර්ථන උදාහරණය: බෙදුම් හඳුනා ගැනීම

SELECT *
FROM (
    SELECT
        employee,
        sale,
        ROW_NUMBER() OVER (PARTITION BY employee ORDER BY sale DESC) AS rank
    FROM
        sales
) tmp
WHERE rank > 1;

මෙම අභ්‍යාර්ථනයෙන් එකම සේවක නම සඳහා බහු වාර්තා පවතින විට බෙදුම් හඳුනා ගනී.

අභ්‍යාර්ථන උදාහරණය: බෙදුම් මකා දැමීම

DELETE FROM sales
WHERE id IN (
    SELECT id
    FROM (
        SELECT
            id,
            ROW_NUMBER() OVER (PARTITION BY employee ORDER BY sale DESC) AS rank
        FROM
            sales
    ) tmp
    WHERE rank > 1
);

සාරාංශය

ROW_NUMBER() විවිධ තත්ත්වයන්හි භාවිතා වේ, උදාහරණයක් ලෙස:

  1. එක් එක් කණ්ඩායම තුළ අනුපිළිවෙල
  2. මුල් N පේළි නිර්ගමනය කිරීම
  3. බෙදුම් හඳුනා ගැනීම සහ මකා දැමීම

මෙය සංකීර්ණ දත්ත සැකසුම් සහ විශ්ලේෂණය සරල සහ කාර්යක්ෂම කරයි.

4. වෙනත් කවුළු ශ්‍රියන් සමඟ සංසන්දනය

MySQL 8.0 හි, ROW_NUMBER() හැර RANK() සහ DENSE_RANK() වැනි කවුළු ශ්‍රියන් ඇති අතර, ඒවා අනුපිළිවෙල සහ පිහිටුම් ගණනය සඳහා භාවිතා කළ හැක. ඒවා සමාන භූමිකා තිබුණද, ඒවායේ හැසිරීම සහ ප්‍රතිඵල වෙනස් වේ. මෙහිදී එක් එක් ශ්‍රිය සංසන්දනය කරමු සහ ඒවා භාවිතා කළ යුතු විට පැහැදිලි කරමු.

4-1. RANK() ශ්‍රිය

RANK() ශ්‍රිය අනුපිළිවෙල සෙලස්වීම් කරයි, සමාන වටිනාකම් සඳහා එකම අනුපිළිවෙල ලබා දෙමින් සහ ඊළඟ අනුපිළිවෙල අංකය මගහැරීම.

මූලික ව්‍යාකරණය

SELECT
    column_name,
    RANK() OVER (PARTITION BY group_column ORDER BY sort_column) AS rank
FROM
    table_name;

උදාහරණය

පහත දත්ත භාවිතා කරමින් විකුණුම් අනුපිළිවෙල ගණනය කරන්න.

employeedepartmentsale
ASales Department800
BSales Department800
CSales Department600
DSales Department500

අභ්‍යාර්ථන උදාහරණය: RANK() භාවිතා කිරීම

SELECT
    employee,
    sale,
    RANK() OVER (ORDER BY sale DESC) AS rank
FROM
    sales;

ප්‍රතිඵල:

employeesalerank
A8001
B8001
C6003
D5004

ප්‍රධාන කරුණු:

  • සමාන විකුණුම් මුදල (800) ඇති A සහ B දෙකම “1” අනුපිළිවෙල ලෙස සැලකේ.
  • ඊළඟ “2” අනුපිළිවෙල මගහැරේ, එබැවින් C “3” අනුපිළිවෙල ලෙස වේ.

4-2. DENSE_RANK() ශ්‍රිය

DENSE_RANK() ශ්‍රියද සමාන වටිනාකම් සඳහා එකම අනුපිළිවෙල සෙලස්වීම් කරයි, නමුත් එය ඊළඟ අනුපිළිවෙල අංකය මගහැර යන්නේ නැත.

මූලික ව්‍යාකරණය

SELECT
    column_name,
    DENSE_RANK() OVER (PARTITION BY group_column ORDER BY sort_column) AS dense_rank
FROM
    table_name;

උදාහරණය

ඉහත දත්ත භාවිතා කරමින් DENSE_RANK() ශ්‍රිය උත්සාහ කරන්න.

අභ්‍යාර්ථන උදාහරණය: DENSE_RANK() භාවිතා කිරීම

SELECT
    employee,
    sale,
    DENSE_RANK() OVER (ORDER BY sale DESC) AS dense_rank
FROM
    sales;

ප්‍රතිඵල:

employeesaledense_rank
A8001
B8001
C6002
D5003

ප්‍රධාන කරුණු:

  • විකුණුම් මුදල එකම (800) A සහ B දෙකම “1” ශ්‍රේණිය ලෙස සැලකේ.
  • RANK() වලට වඩා, මීළඟ ශ්‍රේණිය “2” වෙතින් ආරම්භ වේ, එබැවින් ශ්‍රේණික සන්ධානය රැකෙයි.

4-3. ROW_NUMBER() ක්‍රියාවලිය වෙනස් වන්නේ කෙසේද

ROW_NUMBER() ශ්‍රේණිය වෙනත් දෙකට වඩා වෙනස් වන්නේ වටිනාකම් එකම වුවද අනන්‍ය අංකයක් ප්‍රමාණවත් කිරීමයි.

උදාහරණය

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (ORDER BY sale DESC) AS row_num
FROM
    sales;

ප්‍රතිඵලය:

employeesalerow_num
A8001
B8002
C6003
D5004

ප්‍රධාන කරුණු:

  • වටිනාකම් එකම වුවද, එක් එක් පේළියට අනන්‍ය අංකයක් ලැබෙන බැවින්, ආවර්තිත ශ්‍රේණි නොමැත.
  • මෙය අවශ්‍ය වන විට ගැඹුරු පිළිවෙල පාලනය හෝ පේළි අනුකූලතාවය සඳහා ගුණදායක වේ.

4-4. වේගවත් භාවිතය සාරාංශය

FunctionRanking behaviorTypical use case
ROW_NUMBER()Assigns a unique numberWhen you need sequential numbering or unique identification per row
RANK()Same rank for ties; skips the next rank numberWhen you want rankings with gaps reflecting ties
DENSE_RANK()Same rank for ties; does not skip rank numbersWhen you want continuous ranks without gaps

සාරාංශය

ROW_NUMBER(), RANK(), සහ DENSE_RANK() තත්ත්වය අනුව සුදුසු ලෙස භාවිතා කළ යුතුය.

  1. ROW_NUMBER() එක් එක් පේළිය සඳහා අනන්‍ය අංක අවශ්‍ය වන විට හොඳමය.
  2. RANK() බැඳුම් ශ්‍රේණිය බෙදාගැනීමට සහ ශ්‍රේණික පරතර ඉස්මතු කිරීමට ගුණදායක වේ.
  3. DENSE_RANK() පරතර නොමැතිව අඛණ්ඩ ශ්‍රේණික සඳහා සුදුසුය.

5. MySQL සංස්කරණ 8.0ට පහළ සඳහා විකල්ප

MySQL 8.0ට පෙර සංස්කරණවල, ROW_NUMBER() සහ වෙනත් කවුළු ශ්‍රේණි සඳහා සහාය නොදක්වයි. කෙසේ වෙතත්, පරිශීලක නිර්වචන විචල්‍ය භාවිතයෙන් සමාන හැසිරීමක් ලබාගත හැක. මෙම කොටස MySQL 8.0ට පහළ සංස්කරණ සඳහා ප්‍රායෝගික විකල්ප පැහැදිලි කරයි.

5-1. පරිශීලක නිර්වචන විචල්‍ය භාවිතයෙන් අනුපිළිවෙල අංකනය

MySQL 5.7 සහ ඊට පෙර, එක් එක් පේළිය සඳහා අනුපිළිවෙල අංක ප්‍රමාණවත් කිරීමට පරිශීලක නිර්වචන විචල්‍ය භාවිතා කළ හැක. පහත උදාහරණය බලන්න.

උදාහරණය: දෙපාර්තමේන්තුව අනුව විකුණුම් ශ්‍රේණිකරණය

නියැඩි දත්ත:

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

අවලෝකනය:

SET @row_num = 0;
SET @dept = '';

SELECT
    employee,
    department,
    sale,
    @row_num := IF(@dept = department, @row_num + 1, 1) AS rank,
    @dept := department
FROM
    (SELECT * FROM sales ORDER BY department, sale DESC) AS sorted_sales;

ප්‍රතිඵලය:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

5-2. ඉහළම N පේළි නිස්සාරණය

ඉහළම N පේළි ලබාගැනීමට, සමාන ආකාරයෙන් පරිශීලක නිර්වචන විචල්‍ය භාවිතා කළ හැක.

අවලෝකනය:

SET @row_num = 0;
SET @dept = '';

SELECT *
FROM (
    SELECT
        employee,
        department,
        sale,
        @row_num := IF(@dept = department, @row_num + 1, 1) AS rank,
        @dept := department
    FROM
        (SELECT * FROM sales ORDER BY department, sale DESC) AS sorted_sales
) AS ranked_sales
WHERE rank <= 3;

ප්‍රතිඵලය:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

මෙම අවලෝකනය දෙපාර්තමේන්තුව අනුව ශ්‍රේණි ප්‍රමාණවත් කර ඉහළම 3 තුළ පමණක් පේළි නිස්සාරණය කරයි.

5-3. ආවර්තිත හඳුනාගැනීම සහ මකාදැමීම

ආවර්තිත දත්ත හැසිරවීමට ද පරිශීලක නිර්වචන විචල්‍ය භාවිතා කළ හැක.

අවලෝකන උදාහරණය: ආවර්තිත හඳුනාගැනීම

SET @row_num = 0;
SET @id_check = '';

SELECT *
FROM (
    SELECT
        id,
        name,
        @row_num := IF(@id_check = name, @row_num + 1, 1) AS rank,
        @id_check := name
    FROM
        (SELECT * FROM customers ORDER BY name, id) AS sorted_customers
) AS tmp
WHERE rank > 1;

අවලෝකන උදාහරණය: ආවර්තිත මකාදැමීම

DELETE FROM customers
WHERE id IN (
    SELECT id
    FROM (
        SELECT
            id,
            @row_num := IF(@id_check = name, @row_num + 1, 1) AS rank,
            @id_check := name
        FROM
            (SELECT * FROM customers ORDER BY name, id) AS sorted_customers
    ) AS tmp
    WHERE rank > 1
);

5-4. පරිශීලක නිර්වචන විචල්‍ය භාවිතයේදී සැලකිලිමත් විය යුතු කරුණු

  1. සැසිය මත රඳා පවතී
  • පරිශීලක නිර්වචන විචල්‍ය වර්තමාන සැසිය තුළ පමණක් වලංගුය. විවිධ අවලෝකන හෝ සැසි අනුව ඒවා නැවත භාවිතා කළ නොහැක.
  1. ප්‍රතිකාරණ පිළිවෙල මත රඳා පවතී
  • පරිශීලක නිර්වචන විචල්‍ය මර්ථන පිළිවෙල මත රඳා පවතී, එබැවින් ORDER BY නිවැරදිව සකස් කිරීම තීරණාත්මක වේ.
  1. SQL පාඨකත්වය සහ නඩත්තුකම්කරණය
  • අවලෝකන සංකීර්ණ විය හැකි බැවින්, MySQL 8.0 සහ පසුව, කවුළු ශ්‍රේණි භාවිතා කිරීම නිර්දේශ කෙරේ.

සාරාංශය

In MySQL 8.0 ට පහළ සංස්කරණවල, ඔබට පරිශීලක‑නිර්වචිත විචල්‍ය භාවිතා කරමින් කවුළුවේ ක්‍රියාකාරකම් (window functions) වෙනුවට අනුක්‍රමික අංකනය සහ ශ්‍රේණිගත කිරීම ක්‍රියාත්මක කළ හැක. එහෙත්, විමසුම් වැඩි සංකීර්ණ වීම නිසා, හැකි තරම් නව සංස්කරණයකට මාරු වීම සලකා බැලීම හොඳය.

6. අවවාද සහ හොඳ පුරුදු

MySQL හි ROW_NUMBER() ක්‍රියාකාරකම සහ විචල්‍ය‑අධාරිත විකල්පයන් ඉතා පහසුය, නමුත් ඒවා නිවැරදිව සහ කාර්යක්ෂමව ක්‍රියාත්මක කිරීම සඳහා සැලකිලිමත් විය යුතු වැදගත් කරුණු ඇත. මෙම කොටස කාර්ය සාධන අ优化 කිරීම සඳහා ප්‍රායෝගික අවවාද සහ හොඳ පුරුදු පැහැදිලි කරයි.

6-1. කාර්ය සාධන සැලකිලි

1. ORDER BY පිරිවැය

ROW_NUMBER() සෑම විටම ORDER BY සමඟ භාවිතා වේ. එය අනුක්‍රමණය (sorting) අවශ්‍ය කරන බැවින්, විශාල දත්ත කට්ටල සඳහා සැකසීමේ කාලය ගණනාවක් වැඩි විය හැක.

නිවාරණය:

  • ඉන්ඩෙක්ස් භාවිතා කරන්න: ORDER BY හි භාවිතා වන තීරුවලට ඉන්ඩෙක්ස් එකතු කර අනුක්‍රමණය වේගවත් කරන්න.
  • LIMIT භාවිතා කරන්න: සැකසිය යුතු දත්ත ප්‍රමාණය අඩු කිරීම සඳහා ඔබට අවශ්‍ය පේළි සංඛ්‍යාව පමණක් ලබා ගන්න.

උදාහරණය:

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales
LIMIT 1000;

2. මතක භාවිතය සහ තැටි I/O වැඩිවීම

කවුළුවේ ක්‍රියාකාරකම් තාවකාලික වගු සහ මතක භාවිතයෙන් සැකසෙයි. දත්ත ප්‍රමාණය වැඩි වීමත් සමඟ මතක භාවිතය සහ තැටි I/O වැඩි විය හැක.

නිවාරණය:

  • විමසුම් වෙන් කරන්න: සැකසීම කුඩා විමසුම් වලට බෙදා, පියවරෙන් පියවර දත්ත ලබාගෙන පූර්ණ භාරය අඩු කරන්න.
  • තාවකාලික වගු භාවිතා කරන්න: ලබාගත් දත්ත තාවකාලික වගුවක සුරකින්න, එතැනින් එකතු කිරීම (aggregation) ක්‍රියාත්මක කර වැඩ බෙදා හරිනු ලැබේ.

6-2. විමසුම් සැකසීමේ උපදෙස්

1. ක්‍රියාත්මක සැලැස්ම පරීක්ෂා කරන්න

MySQL හි, EXPLAIN භාවිතා කර විමසුම් ක්‍රියාත්මක සැලැස්ම පරීක්ෂා කළ හැක. මෙය ඉන්ඩෙක්ස් නිවැරදිව භාවිතා කර ඇතිදැයි තහවුරු කිරීමට උපකාරී වේ.

උදාහරණය:

EXPLAIN
SELECT
    employee,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

උදාහරණ ප්‍රතිඵලය:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEsalesindexNULLsale4NULL500Using index

ඔබ Using index දැකුවහොත්, එය ඉන්ඩෙක්ස් නිවැරදිව භාවිතා කර ඇති බව පෙන්වයි.

2. ඉන්ඩෙක්ස් අ优化 කරන්න

ORDER BY සහ WHERE හි භාවිතා වන තීරුවලට ඉන්ඩෙක්ස් එකතු කිරීම අත්‍යවශ්‍යයි. පහත සඳහන් කරුණු විශේෂයෙන් සැලකිල්ලට ගන්න.

  • තනි තීරුවේ ඉන්ඩෙක්ස්: සරල අනුක්‍රමණ කොන්දේසි සඳහා හොඳයි
  • සංයුක්ත ඉන්ඩෙක්ස්: කොන්දේසි වල බහු තීරුවලට සම්බන්ධ වූ විට ප්‍රයෝජනවත්

උදාහරණය:

CREATE INDEX idx_department_sale ON sales(department, sale DESC);

3. කණ්ඩායම් සැකසීම භාවිතා කරන්න

විශාල දත්ත කට්ටලයක් එකවර සැකසීම වෙනුවට, දත්ත කණ්ඩායම් ලෙස සැකසීමෙන් පූර්ණ භාරය අඩු කළ හැක.

උදාහරණය:

SELECT * FROM sales WHERE department = 'Sales Department' LIMIT 1000 OFFSET 0;
SELECT * FROM sales WHERE department = 'Sales Department' LIMIT 1000 OFFSET 1000;

6-3. දත්ත සමතුලිතතාව රැක ගැනීම

1. යාවත්කාලීන කිරීම සහ නැවත ගණනය කිරීම

පේළි ඇතුළත් කිරීම හෝ මකා දැමීම සිදු වන විට, අංකනය වෙනස් විය හැක. අවශ්‍ය පරිදි අංක නැවත ගණනය කිරීමේ ක්‍රමයක් සකස් කරන්න.

උදාහරණය:

CREATE VIEW ranked_sales AS
SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

දෘශ්‍යයක් (view) භාවිතා කිරීමෙන් නවතම දත්ත මත පදනම්ව ශ්‍රේණි නවීකරණය කර ගැනීමට හැකිය.

6-4. හොඳ පුරුදු විමසුම් උදාහරණය

පහත දැක්වෙන්නේ කාර්ය සාධනය සහ නඩත්තු හැකියාව සලකා බලන හොඳ පුරුදු උදාහරණයකි.

උදාහරණය: ඉහළ N පේළි ලබා ගැනීම

WITH RankedSales AS (
    SELECT
        employee,
        department,
        sale,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
    FROM
        sales
)
SELECT *
FROM RankedSales
WHERE rank <= 3;

මෙම ව්‍යුහය කියවීමට පහසුකම සහ නැවත භාවිතා කිරීමේ හැකියාව වැඩි කිරීමට පොදු වගු ප්‍රකාශනය (CTE) භාවිතා කරයි.

සාරාංශය

ROW_NUMBER() හෝ එහි විකල්ප භාවිතා කරන විට, මෙම කරුණු සැලකිල්ලට ගන්න:

  1. index optimization මගින් වේගය වැඩි කරන්න.
  2. execution plan පරීක්ෂා කිරීමෙන් bottlenecks හඳුනා ගන්න.
  3. data updates සැලසුම් කර සමාන්‍යතාවය රැකගන්න.
  4. batch processing සහ CTEs භාවිතා කර පූර්ණ භාරය බෙදා හරිනු.

මෙම හොඳ පුරුදු අනුගමනය කිරීමෙන් විශාල පරිමාණ දත්ත විශ්ලේෂණය සහ වාර්තාකරණය සඳහා කාර්යක්ෂම සැකසීම සක්‍රිය වේ.

7. නිගමනය

මෙම ලිපියේ, අපි MySQL හි ROW_NUMBER() ක්‍රියාකාරකම මත අවධානය යොමු කරමින්, මූලික භාවිතය සහ ප්‍රායෝගික උදාහරණ වලින් පටන් පරණ අනුවාද සඳහා විකල්ප, අවවාද සහ හොඳ පුරුදු දක්වා සියල්ල පැහැදිලි කර ඇත. මෙම කොටසේ, ප්‍රධාන කරුණු සාරාංශ කර ප්‍රායෝගික සාරාංශයක් ලබා දීමට අපි යොමු වෙමු.

7-1. ROW_NUMBER() ක්‍රියාකාරකම කෙරෙහි ප්‍රයෝජන

ROW_NUMBER() ක්‍රියාකාරකම දත්ත විශ්ලේෂණය සහ වාර්තාකරණය සඳහා පහත ආකාරයෙන් විශේෂයෙන් පහසුය:

  1. කණ්ඩායම් තුළ අනුක්‍රමික අංකනය: දෙපාර්තමේන්තුව හෝ ප්‍රවර්ගය අනුව විකුණුම් ශ්‍රේණි පහසුවෙන් සකස් කරන්න.
  2. ඉහළ N පේළි ලබා ගැනීම: විශේෂිත කොන්දේසි මත දත්ත කාර්යක්ෂමව පෙරහන් කර ලබා ගන්න.
  3. අනුපිළිවෙල හඳුනා ගැනීම සහ මකා දැමීම: දත්ත පිරිසිදු කිරීම සහ සංවිධානය සඳහා ප්‍රයෝජනවත්.

එය සංකීර්ණ විමසුම් සරල කර ඇති නිසා, SQL කියවීමේ හැකියාව සහ නඩත්තු කිරීමේ හැකියාව ගණනාවට වැඩි කරයි.

7-2. අනෙකුත් window functions සමඟ සංසන්දනය

RANK() සහ DENSE_RANK() වැනි window functions සමඟ සැසඳූ විට, ROW_NUMBER() එකම අගයන් සඳහාද අද්විතීය අංකයක් ලබා දීමේදී වෙනස් වේ.

FunctionFeatureUse case
ROW_NUMBER()Assigns a unique sequential number to each rowBest when you need unique identification or ranking with no duplicates
RANK()Same rank for ties; skips the next rank numberWhen you need tie-aware rankings and rank gaps matter
DENSE_RANK()Same rank for ties; does not skip rank numbersWhen you want continuous ranking while handling ties

සුදුසු ක්‍රියාකාරකම තේරීම:
ඔබේ අරමුණ සඳහා හොඳම ක්‍රියාකාරකම තෝරා ගැනීම දත්ත සැකසීම කාර්යක්ෂම කරයි.

7-3. පරණ MySQL අනුවාද සම්බන්ධයෙන් සැලසුම් කිරීම

MySQL 8.0 ට පහත පරිසර සඳහා, අපි පරිශීලක-නිර්වචිත විචල්‍ය භාවිතා කරන ක්‍රම හඳුන්වා දී ඇත. එNevertheless, ඔබ මෙම අවවාද සලකා බලිය යුතුය:

  • වඩා සංකීර්ණ SQL නිසා කියවීමේ හැකියාව අඩු වේ
  • සමහර අවස්ථා වල විමසුම් සුදුසුකම් වැඩි දුෂ්කර වේ
  • දත්ත සමාන්‍යතාවය රැක ගැනීමට අතිරේක සැලසුම් අවශ්‍ය විය හැක

හැකි නම්, MySQL 8.0 හෝ ඊට පසු අනුවාද වෙත මාරු වීම සහ window functions භාවිතා කිරීම දැඩි ලෙස සලකා බලන්න.

7-4. කාර්ය සාධන සුදුසුකම් සඳහා ප්‍රධාන කරුණු

  1. ඉන්ඩෙක්ස් භාවිතා කරන්න: ORDER BY හි භාවිතා වන තීරුවලට ඉන්ඩෙක්ස් එකතු කර වේගය වැඩි කරන්න.
  2. විධානය සැලසුම් පරීක්ෂා කරන්න: EXPLAIN සමඟ පෙර කාර්ය සාධනය තහවුරු කරන්න.
  3. batch processing අනුගමනය කරන්න: විශාල දත්ත කට්ටලයන් කුඩා කොටස් ලෙස සැකසීමෙන් භාරය බෙදා හරිනු.
  4. views සහ CTEs භාවිතා කරන්න: නැවත භාවිතා හැකියාව වැඩි කර සංකීර්ණ විමසුම් සරල කරන්න.

මෙම තාක්ෂණයන් අනුගමනය කිරීමෙන්, ඔබට කාර්යක්ෂම සහ ස්ථාවර දත්ත සැකසීම ලබා ගත හැක.

7-5. අවසාන සටහන්

ROW_NUMBER() යනු දත්ත විශ්ලේෂණයේ කාර්යක්ෂමතාවය ගණනාවට වැඩි කරන ශක්තිමත් මෙවලමකි.
මෙම ලිපියේ, මූලික වාක්‍ය රචනා සහ ප්‍රායෝගික උදාහරණ වලින් පටන් අවවාද සහ විකල්ප දක්වා සියල්ල ආවරණය කර ඇත.

ඔබට මෙම ලිපිය අනුගමනය කරමින් ඔබම විමසුම් ක්‍රියාත්මක කිරීමට අපි උද්යෝගිමත් කරමු. ඔබේ SQL කුසලතා වර්ධනය කිරීම ඔබට විශ්වාසයෙන් වැඩි සංකීර්ණ දත්ත විශ්ලේෂණය සහ වාර්තාකරණය සලසීමට උපකාරී වේ.

අනුලේඛය: යොමු සම්පත්

  • නිල ලේඛන: MySQL Window Functions
  • ඕන්ලයින් SQL පරිසරය: SQL Fiddle (ඔන්ලයින් SQL ක්‍රියාත්මක කර පරීක්ෂා කිරීමට ඉඩ දෙන මෙවලම)