Kursorlarni talab qiladigan SQL muammolari - SQL problems requiring cursors

A kursor ning aksariyat dasturlarida mavjud bo'lgan qurilishdir SQL bu imkon beradi dasturchi ma'lumotlarni guruh sifatida emas, balki ketma-ket ishlash. Ketma-ket ishlov berishni parallellashtirish ketma-ket ishlov berishga qaraganda ancha murakkab, bu imkon qadar protsessual bo'lmagan SQL-dan foydalanishning yana bir sababi. Ma'lumotlar bazasi sotuvchilari odatda ishlaydi parallel ishlov berish dastur ishlab chiquvchilari tomonidan maxsus ishlov berishni talab qilmasdan.

Parallel ishlov berish ketma-ket ishlov berishga qaraganda tezroq buyurtma bo'lishi mumkin.

Cheklovlar

Ushbu maqolada quyidagi cheklovlar qo'llaniladi:

  • "Kursor" atamasi kursorga o'xshash barcha harakatlarni o'z ichiga oladi. Masalan, bitta qatorli SQL so'rovlari yoki chiqish ko'p qatorli SQL so'rovlari kursorga o'xshash xatti-harakatlardir va haqiqiy to'plam asosida ishlash maqsadiga erisha olmaydi ma'lumotlar bazasi.
  • Barcha o'rnatilgan SQL ANSI SQL bo'lishi kerak. Bir qator sotuvchilar juda kuchli mulkiy kengaytmalarni taqdim etadilar. Maqsad foydasiga bunday kengaytmalarning oldini olish ANSI SQL.
  • Qaror umumlashtirilishi kerak. Quyidagi bir yoki bir nechta misollarda namoyish etish uchun maxsus qiymatlardan foydalanish mumkin, ammo har qanday echim ma'lumotlar bazasi dasturiy ta'minoti va mashina resurslari kuchi doirasida mumkin bo'lgan har qanday songa qadar kengaytirilishi kerak.

Misol: Jadvalning o'zida hisoblash asosida qatorlarni qo'shish

Quyidagi jadval marmar turlarini aks ettiradi. To'rtta matn ustunlari to'rtta marmar xususiyatlarini aks ettiradi. Har bir xarakteristikada jami 16 turdagi marmar uchun ikkita qiymat mavjud.

"Miqdor" ustuni bizda qancha marmar borligini anglatadi. Vazifa shu turdagi har bir marmar uchun bitta qatorni ushlab turadigan ikkinchi jadvalni yaratishdir. Shunday qilib, maqsad jadvalda to'rtta matn ustunlari va jami 40 + 20 + 20 + 10 + ... + 10 + 5 = 270 qator bo'lishi kerak edi.

Manba jadvali:

  Miqdor to'qimalarining paydo bo'lishi shakli RANGI ---------- ---------- ---------- ---------- ----- 40 silliq yaltiroq yumaloq ko'k 20 silliq yaltiroq qiyshaygan moviy 20 silliq zerikarli yumaloq ko'k 10 silliq zerikarli qiyshaygan ko'k 20 ta qo'pol yaltiroq qiyshaygan qizil 10 ta qo'pol yaltiroq yumaloq qizil 20 ta silliq zerikarli qiyshaygan qizil 10 ta silliq zerikarli yumaloq qizil 10 ta silliq yaltiroq qizil qizil 5 ta silliq yaltiroq yumaloq qizil

Yaratish uchun jadval:

TEKSTURA KO'RINISHI SHAKLI RANGI ---------- ---------- ---------- ----- silliq yaltiroq yumaloq ko'k - 1 tekis porloq yumaloq ko'k - - 2 ... - va shunga o'xshash bir tekis porloq dumaloq ko'k - 40 tekis porloq qiyshiq ko'k - 1 tekis porloq qiyshiq ko'k - 2 ... - va shunga o'xshash bir tekis porloq burmali ko'k - 20 ... - va shunga o'xshash narsalar yaltiroq yumaloq qizil - 1 tekis porloq yumaloq qizil - 2 tekis porloq yumaloq qizil - 3 tekis porloq yumaloq qizil - 4 tekis porloq yumaloq qizil - 5

Kursor shaklida echim

Maqsadli jadvalni kursor bilan yaratish juda oddiy.

e'lon qiling  kursor v bu tanlang * dan marble_seed;boshlash  uchun r yilda v pastadir    uchun men yilda 1..r.miqdor pastadir      kiritmoq ichiga marmar qiymatlar (        r.to'qima,        r.tashqi ko'rinish,        r.shakli,        r.rang_aktiv      );    oxiri pastadir;  oxiri pastadir;oxiri;

SQL-da halqasiz hal qilish

Muammoni SQL-da loopsiz hal qilish biroz ko'proq kodni o'z ichiga oladi va kursorlarning ichki ko'chadan yondashuviga qaraganda bir oz ko'proq ijodiy fikrni talab qiladi.

Raqam jadvali

Yechish uchun oraliq jadval kerak. Jadvalda har qanday qator qatoriga 0 qiymatlari berilgan NUMBER turidagi bitta ustun mavjud. Ushbu munozara uchun biz uni bir million qator bilan cheklaymiz. Kod quyidagicha: O'rnatish:

yaratmoq stol urug ' ( n raqam(1) );yaratmoq stol raqamlar ( n raqam(7));kiritmoq ichiga urug ' qiymatlar ( 0 );kiritmoq ichiga urug ' qiymatlar ( 1 );kiritmoq ichiga urug ' qiymatlar ( 2 );kiritmoq ichiga urug ' qiymatlar ( 3 );kiritmoq ichiga urug ' qiymatlar ( 4 );kiritmoq ichiga urug ' qiymatlar ( 5 );kiritmoq ichiga urug ' qiymatlar ( 6 );kiritmoq ichiga urug ' qiymatlar ( 7 );kiritmoq ichiga urug ' qiymatlar ( 8 );kiritmoq ichiga urug ' qiymatlar ( 9 );kiritmoq ichiga raqamlartanlang n6.n * 100000 +       n5.n * 10000 +       n4.n * 1000 +       n3.n * 100 +       n2.n * 10 +       n1.n * 1 ndan urug ' n1,       urug ' n2,       urug ' n3,       urug ' n4,       urug ' n5,       urug ' n6

Raqamlar jadvali parallel ravishda tuzilishi mumkin.

Yechim yadrosi

Yuqoridagi marmar tipidagi jadval marbles_seed deb nomlangan va maqsad stol marmar deb nomlangan deb taxmin qiling. Kerakli 270 qatorni yaratadigan kod:

kiritmoq ichiga marmar(m.to'qima, m.tashqi ko'rinish, m.shakli, m.rang_aktiv)tanlang m.to'qima,       m.tashqi ko'rinish,       m.shakli,       m.rang_aktiv  dan marble_seed m,       raqamlar n qayerda m.miqdor > n.n

Ma'lumotlar bazasi ushbu qo'shimchani dasturchining ishtirokisiz parallel ravishda qayta ishlashi mumkin.