ກົດ 21 ຂໍ້ເພື່ອການ Query ຂໍ້ມູນໃຫ້ໄວຂຶ້ນ

Post Top Ad

Post Top Ad

Friday, January 31, 2020

ກົດ 21 ຂໍ້ເພື່ອການ Query ຂໍ້ມູນໃຫ້ໄວຂຶ້ນ



  
  ສິ່ງ​ທີ່​ຂາດ​ບໍ່​ໄດ້​ຂອງ​ການ​ສືບ​ຄົ້ນ​ຂໍ້​ມູນ (Query) ໃນ Database ຄື “ຄວາມ​ໄວ” ​ເຊິ່ງ​​ຄົນ​ໄອ​ທີ ​ທີ່​ເຮັດ​ຫນ້າທີ່​ໂດຍ​ກົງ​ຢ່າງ SQL Developer แລະ DBA ເອງ​ກໍ​ໄດ້​ພະຍາຍາມ​ເຮັດໃຫ້​ການ​ສືບ​ຄົ້ນ​ຂໍ້​ມູນ​ວ່ອງໄວ​ທີ່ສຸດ​ເທົ່າ​ທີ່​ຈະ​ເຮັດ​ໄດ້​ຢູ່​ແລ້ວ ແຕ່​ໜ້າ​ເສຍ​ດາຍ​ວ່າ ເຮົາ​ບໍ່​ສາມາດ​ແກ້​ໄຂ​ຫລື​ເຮັດ​ທຸກ​ຢ່າງ​ໃຫ້​ອອກ​ຜົນ​ລັບມາ​ໄດ້​ຢ່າງ​ສົມບູນ​ແບບ​ດ້ວຍ​ວິທີ​ການ​ດຽວ​ໄດ້ ກົດ 21 ຂໍ້​ທີ່​ຈະ​ຊ່ວຍ​ໃຫ້​ຖານ​ຂໍ້​ມູນ​ຂອງ​ເຈົ້າ​ໄວ ​ແລະ​ ມີ​ປະ​ສິດ​ທິ​ພາບ​ຍິ່ງ​ຂຶ້ນ​ມີ​ຫຍຫງແດ່ ມາ​ເບິ່ງ​ກັນ!
  1. ຫຼີກ​ລ້ຽງ​ການ​ໃຊ້​ເຄ​ີ​ເຊີ (Cursor)
    ຄົນ​ໄອ​ທີໜ້າ​ຈະ​ຮູ້​ກັນ​ດີ​ວ່າ ເມື່ອໃດ​ທີ່​ມີ​ການ​ໃຊ້ Cursor ນັ້ນ​ໝາຍ​ເຖິງ ຕ້ອງ​ມີ​ການ​ຖ້າ​ຄຳ​ສັ່ງ​ວ່າ​ຈະໃຫ້​ເຮັດ​ຫຍັງ ​ເຊິ່ງ​ແນ່ນອນ​ວ່າ​ມັນ​ມີ​ຜົນ​ຕໍ່​ຄວາມ​ໄວ ອີກ​ທັງ​​ຍັງ​ເປັນ​ສາ​ເຫດ​ຂອງ​ການ Block ການ​ເຮັດ​ວຽກງານ​ອື່ນ​ໆ ໂດຍ​ບໍ່​ຈຳ​ເປັນ​ດ້ວຍ (ເພາະ​ຕ້ອງຖ້າຄຳ​ສັ່ງ​ຈາກ Cursor ນີ້​ແຫຼະ)
     
  2. ຫາກ​ລ້ຽງ​ຂໍ້ 1 ບໍ່​ໄດ້ ໃຫ້​ໃຊ້ Temp Table
    ຫາກ​ເຈົ້າ​ບໍ່​ສາມາດ​ລ້ຽງ​ການ​ໃຊ້ Cursor ໄດ້ ກໍ​ຄວນ​ສ້າງ Temp Table ແທນ​ການ​ໃຊ້​ຂໍ້​ມູນ​ຈາກ Table ແທ້ໆ ​ເຊິ່ງ​ນອກ​ຈາກ​ຈະ​ມີ​ຂະໜາດ​ນ້ອຍ ແລະ ​ສະ​ດວກ​ໃນ​ການ​ໃຊ້​ງານ​ແລ້ວ ​ຍັງ​ໃຊ້ Resource ຂອງ​ລະບົບ​ແຕ່​ຊົ່ວ​ຄາວ​ອີກ​ດ້ວຍ
     
  3. ໃຊ້ Temp Table ຢ່າງ​ສະຫລາດ
    ເຈົ້າ​ສາມາດ​ໃຊ້ Temp Table ໃນ​ສະຖານນະການ​ອື່ນ​ໆ ອີກ ເຊັ່ນ ເຈົ້າ​ຕ້ອງ​ການ Join Table ໜຶ່ງ​ກັບ​ອີກ Table ທີ່​ໃຫຍ່​ຫລາຍ​ໆ ແລະ ​ຕ້ອງ​ກຳນົດ Condition ຈາກ​ໃນ Table ໃຫຍ່​ນັ້ນ​ດ້ວຍ ແນະ​ນຳ​ວ່າ​ເຈົ້າ​ຄວນ​ດຶງ​ຂໍ້​ມູນ​ທີ່​ຈະ​ໃຊ້​ມາ​ຈາກ Table ໃຫຍ່ ມາ​ໃສ່ Temp Table ແລ້ວ​ຄ່ອຍ Joint ກັບ Table ທີ່​ຕ້ອງ​ການ​ໃນ​ພາຍ​ຫຼັງ ຈະ​ຊ່ວຍ​ເຮັດໃຫ້​ມີ​ປະ​ສິດ​ທິ​ພາບ​ທີ່​ດີກວ່າ ນອກ​ຈາກ​ຈະ​ຊ່ວຍ​ລຸດ​ການ​ໃຊ້ resource ແລ້ວ ​ຍັງ​ເປັນ​ການ​ຊ່ວຍ​ໃຫ້​ເຈົ້າ​ເຮັດວຽກ​ສະ​ດວກ​ຂຶ້ນ​ຫາກ​ມີ Query ອື່ນ​ໆ ໃນ Procedure ທີ່​ຕ້ອງ​ໃຊ້​ການ Join Table ດຽວ​ກັນ​ນີ້​ອີກ
     
  4. ກຽມ​ຂໍ້​ມູນ​ໄວ້​ກ່ອນ (Pre-Stage)
    ຖື​ເປັນ​​ເທັກ​ນິກ​ເກົ່າ​ທີ່​ຫຼາຍ​ໆ ຄົນ​ມັກ​ເບິ່ງ​ຂ້າມ ຫາກ​ເຈົ້າ​ມີ Report ຫລື Procedure ທີ່​ຕ້ອງ Join Table ແບບ​ດຽວ​ກັນ ເຈົ້າ​ຄວນ​ຈະ​ຈັດກຽມ​ຂໍ້​ມູນ​ໄວ້​ກ່ອນ (Pre-Stage) ໂດຍ​ການ Join Table ກຽມ​ໄວ້​ລ່ວງ​ໜ້າ ຈະ​ໄດ້​ບໍ່​ຕ້ອງ Join Table ຂະໜາດ​ໃຫຍ່, ບາງ​ຄົນ​ອາດ​ເບິ່ງ​ວ່າ​​ເທັກ​ນິກ​ນີ້​ບໍ່​ມີ​ຄວາມ​ຈຳ​ເປັນ ແຕ່​ຖ້າ​ເຈົ້າ​ຕ້ອງ​ການ​ໃຊ້​ຂໍ້​ມູນ​ເຫຼົ່າ​ນັ້ນ​ເລື້ອຍໆ ເປັນຫຍັງ​ເຮົາ​ຈຶ່ງ​ບໍ່​ເຮັດໃຫ້​ມັນ​ງ່າຍ​ຕໍ່​ການ​ໃຊ້​ງານ​ແລະ​ປະ​ຢັດ resource ຂອງ​ລະບົບ ແມ່ນບໍ
     
  5. ຫຼີກ​ລ້ຽງ​ການ​ໃຊ້ Nested View
    ການ​ໃຊ້ View ມີ​ຂໍ້​ດີ​ຄື ຊ່ວຍ​ສະແດງ​ໃຫ້​ເຫັນ​ຂໍ້​ມູນ​ເທົ່າ​ທີ່​ຕ້ອງ​ການ ແຕ່​ຫາກ​ເຈົ້າ​ໃຊ້ View ຊ້ອນ​ໃນ View ແລະ​ຊ້ອນ​ໄປ​ເລື້ອຍໆ (Nested View) ຈະ​ຍິ່ງ​ເຮັດໃຫ້ Database ຍິ່ງ​ຊ້າ​ລົງ ເພາະ​ຂໍ້​ມູນ​ຈະ​ຖືກ Query ຊ້ອນ​ກັນ​ໄປ​ເລື້ອຍໆ ຫລື​ໃນ​ເຄດ​ຮ້າຍແຮງ​ສຸດ​ຄື ລະບົບ​ອາດຈະ​ບໍ່​ສະແດງ​ຜົນ​ຫຍັງ​ອອກ​ມາ​ເລຍ​ກໍ​ໄດ້​ເພາະ​ເຮັດວຽກ​ໜັກ​ເກີນ​ໄປ ຫາກ​ເຈົ້າ​ລຸດ​ການ​ໃຊ້ Nested View ໄດ້​ຈະ​ລຸດ​ເວລາ​ຈາກ​ນາ​ທີ ລົງ​ເຫຼືອ​ເປັນ​ ​ວິ​ນາ​ທີ​ເລີຍ​ທີ​ດຽວ
     
  6. ໃຊ້ CASE ແທນ​ການ​ໃຊ້ UPDATE
    ສົມມຸດ ເຈົ້າ​ຕ້ອງ​ການ​ນຳ​ຂໍ້​ມູນ​ລູກ​ຄ້າ​ທັງ​ໝົດ​ຈາກ Table Customer ມາ​ໃສ່ Temp Table ໂດຍ​ທີ່​ຖ້າ​ລູກ​ຄ້າ​ຄົນ​ໃດ​ມີຍ​ອດ​ສັ່ງ​ຊື້​ເກີນ $100,000 ຂຶ້ນ​ໄປ ໃຫ້​ໃສ່ Label ຂອງ​ລູກ​ຄ້າ​ເຫຼົ່າ​ນັ້ນ​ໃນ​ເປັນ “Preferred” ປົກກະຕິ​ຖ້າ​ບໍ່​ຄິດ​ຊັບ​ຊ້ອນ​ຫລາຍ ຂັ້ນ​ທຳອິດ​ເຮົາ​ຈະ INSERT ຂໍ້​ມູນ​ທັງ​ໝົດ​ຈາກ Table Customer ລົງ​ໃນ Temp Table ກ່ອນ ແລ້ວ​ຂັ້ນ​ຕອນ​ຖັດ​ມາ ຄ່ອຍ UPDATE ຂໍ້​ມູນ Label ໃຫ້ເປັນ Preferred ສຳລັບ​ລູກ​ຄ້າ​ທີ່​ມີຍ​ອດ​ສັ່ງ​ຊື້​ເກີນ $100,000 ແຕ່​ນັ້ນ​ເຮັດໃຫ້​ເຈົ້າ​ຕ້ອງ​ໃຊ້​ເຖິງ 2 ຂັ້ນ​ຕອນ​ໃນ​ການເຮັດໃຫ້​ສຳເລັດ ມັນ​ມີ​​ເທັກ​ນິກ​ທີ່​ງ່າຍ​ກວ່າ​ນັ້ນ​ຄື ການ​ໃຊ້ CASE ຕັ້ງ​ແຕ່​ໃນ​ຂັ້ນ​ຕອນ Insert ແທນ​ທີ່​ຈະ​ມາທຳການ UPDATE ພາຍ​ຫລັງ ເພາະ​ເມື່ອ​ໃຊ້ CASE ແລ້ວ ເຈົ້າ​ຈະ​ສາມາດ​ເລືອກ​ລູກ​ຄ້າ​ໂດຍ​ທີ່​ເງື່ອນ​ໄຂ​ຂ້າງ​ຕົ້ນ​ມາ​ກ່ອນທີ່ຈະ INSERT ໃນ Temp Table ໄດ້​ເລີຍ ເຮັດໃຫ້​ເຫຼືອ​ພຽງ 1 ຂັ້ນ​ຕອນ​ເທົ່າ​ນັ້ນ ຊຶ​່​ງ​ຈະ​ຊ່ວຍ​ເຮັດໃຫ້​ມີ​ປະ​ສິດ​ທິ​ພາບ​ທີ່​ດີກວ່າ
     
  7. ໃຊ້ Table-valued Function ແທນ​ການ​ໃຊ້ Scalar
    ສຳລັບ​ຫົວຂໍ້​ນີ້​ຖື​ເປັນ Tip ທີ່​ໜ້າ​ສົນ​ໃຈ ຄື ເມື່ອ​ເຈົ້າ​ໃຊ້ Scalar Function ໃນ​ການ SELECT ຂໍ້​ມູນ ເຈົ້າ​ສາມາດ​ເພີ່ມ​ປະ​ສິດ​ທິ​ພາບ​ໄດ້​ໂດຍ​ການ​ແປງ​ໄປ​ເປັນ Table-valued Function ແລະ​ໃຊ້ CROSS APPLY ໃນ​ການ Query ການເຮັດ​ເຊັ່ນ​ນີ້​ສາມາດ​ລຸດ​ຈຳນວນ​ການ Query ລົງ​ໄດ້ເຄິ່ງ​ໜຶ່ງ​ເລີຍ
     
  8. ໃຊ້ Partitions ໃນ SQL Server
    ຜູ້ທີ່ໃຊ້ SQL Server Enterprise ສາມາດ​ໃຊ້​ປະໂຫຍດ​ຈາກ Feature “Automatic Partition” ເພື່ອ​ເພີ່ມ​ປະ​ສິດ​ທິ​ພາບ​ຄວາມ​ໄວ​ໃຫ້​ຫລາຍ​ຂຶ້ນ ໃນ SQL Server ເຖິງວ່າ Table ຈະ​ຖືກ​ສ້າງ​ຂຶ້ນ​ເປັນ Partition ດຽວ ​ເຊິ່ງ​ເຈົ້າ​ສາມາດ​ແບ່ງ​ອອກ​ເປັນ​ຫຼາຍ​ໆ ສ່ວນ​ໄດ້  ດັ່ງ​ນັ້ນ ເມື່​ເຈົ້າ​ຕ້ອງ​ການຍ້າຍ​ຂໍ້​ມູນ​ຈຳນວນ​ຫລາຍ​ລະຫວ່າງ Table ເຈົ້າ​ສາມາດ​ໃຊ້​ຄຳ​ສັ່ງ SWITCH ແທນ INSERT ແລະ DELETE ເນື່ອງ​ຈາກ​ເຈົ້າ​ກຳ​ລັງ​ປ່ຽນ metadata ສຳລັບ Table ດຽວ​ແທນ​ການ DELETE ແລະ INSERT ຂໍ້​ມູນ​ທີ່​ມີ​ຈຳນວນ​ຫລາຍ​ລະຫວ່າງ Table ຈະ​ໃຊ້​ເວລາ​ພຽງ​ບໍ່​ຈັກ​ວິ​ນາ​ທີ​ໃນ​ການ​ເຮັດ​ວຽກງານ
     
  9. DELETE ແລະ UPDATE ເປັນ Batch ໃຫຍ່​ໆ
    ການ DELETE ແລະ UPDATE ຂໍ້​ມູນ​ທີ່​ມີ​ປະລິມານ​ມະຫາ​ສານ (Batch ໃຫຍ່​ໆ) ໃນ Table ໜ້າ​ຈະ​ຖື​ເປັນ “ຝັນ​ຮ້າຍ” ຂອງ​ຄົນ​ໄອ​ທີ​ຫຼາຍ​ໆ ຄົນ ບັນຫາ​ຄື​ທັງ 2 ຄຳ​ສັ່ງ​ຖືກ Run ເປັນ Transaction ດຽວ ຖ້າ​ເຈົ້າ​ຕ້ອງ​ການ Kill Process ຫລື​ມີ​ບັນຫາ​ຫຍັງ​ເກີດ​ຂຶ້ນ​ລະຫວ່າງ​ການ Run ກໍ​ຕາມ ລະບົບ​ຈະ Roll back ທັງ Transaction ນັ້ນ​ໝາຍ​ເຖິງ ຕ້ອງ​ໃຊ້​ເວລາ​ດົນ​ກວ່າ​ສຳເລັດ ໃນ​ຂະນະ​ດຽວ​ກັນ​ມັນ​ຈະ​ໄປ​ປິດ​ກັ້ນ​ການ​ເຮັດ​ວຽກງານ​ຂອງ Transaction ອື່ນ​ໆ ດ້ວຍ ທາງ​ແກ້​ໄຂ ກໍ​ຄື ຄວນ DELETE ແລະ UPDATE ທີ່​ເປັນ Batch ນ້ອຍ​ໆ ຈະ​ດີກວ່າ​ເພາະ​ຫາກ​ເກີດ​ບັນຫາ​ແລ້ວ​ຕ້ອງ Roll back ຈະ​ໃຊ້​ເວລາ​ນ້ອຍ​ກວ່າ ເຮັດໃຫ້​ຖານ​ຂໍ້​ມູນ​​ກັບ​ມາ​ໃຊ້​ງານ​ໄດ້​ວ່ອງໄວ​ກວ່າ
     
  10. ທຸກ​ຢ່າງ​ຕ້ອງ​ໃຊ້​ເວລາ
    Developer
    ບາງຄົນ​ຕ້ອງ​ມາ “ຕິດ​” ກັບ​ຄຳ​ສັ່ງ DELETE ແລະ UPDATE ໃນ​ຂໍ້ 9 ຢູ່​ດົນ​ແສນ​ດົນ ພຽງ​ຫວັງ​ວ່າ​ມັນ​ຈະ​ເຮັດ​ສຳເລັດ​ພາຍ​ໃນ​ມື້​ດຽວ ຄຳ​ຕອບ​ຄື ມັນ​ອາດຈະ​ບໍ່​ໄດ້​ເປັນ​ແບບ​ນັ້ນ​ສະເໝີ​ໄປ ຖ້າ​ມັນ​ຈຳ​ເປັນ​ຕ້ອງຖ້າ ເຈົ້າ​ກໍ​ຄວນ​ຂະຫຍາຍ​ເວລາ​ຖ້າ​ຜົນ​ອອກ​ໄປ ແຕ່​ການເຮັດ​ເປັນ Batch ນ້ອຍ​ໆ ຈະ​ຊ່ວຍ​ໃຫ້​ເຈົ້າ​ບໍ່​ຮູ້ສຶກ​ວ່າ​ຕ້ອງ​ຖ້າ​ດົນ​ໆ ຖ້າ​ມີ​ບັນຫາ​ຂຶ້ນ​ມາ​ກໍຫຼຸດ​ການ​ເກີດ​ລະບົບ Down ອີກ​ດ້ວຍ
             
  11. Stored Procedure ມີ​ປະໂຫຍດ​ຫຼາຍ​ຢ່າງ
    ນອກ​ຈາກ​ຈະ​ເຮັດໃຫ້​​ຕົວ Code ມີ​ປະ​ສິດ​ທິ​ພາບ​ແລ້ວ ຍັງມີ​ຂໍ້​ດີ​ອີກ​ຫຼາຍ​ຢ່າງ ທັງ​ຊ່ວຍ​ລຸດ Traffic ຂອງ Network ຫລື​ລະຫວ່າງ Database ກັບ Application ແລະ ​ງ່າຍ​ໃນ​ການ​ຕິດ​ຕາມ​ຂໍ້​ມູນ ໂດຍ​ການ​ໃຊ້ Tool ຢ່າງ​ເຊັ່ນ Profiler ​ເຊິ່ງ​ຊ່ວຍ​ໃຫ້​ເຈົ້າ​ໄດ້​ຮູ້​ສະ​ຖິ​ຕິ​ຕ່າງ​ໆ ໄດ້​ຢ່າງ​ມີ​ປະ​ສິດ​ທິ​ພາບ ລວມທັງລະ​ບຸ​ບັນຫາ​ທີ່​ອາດ​ເກີດ​ຂຶ້ນ​ໄດ້​ຢ່າງວ່ອງໄວ​ຂຶ້ນ ນອກ​ຈາກ​ນີ້ ​ຍັງ​ເໝາະ​ກັບ​ການ​ເອີ້ນ​ໃຊ້​ຂໍ້​ມູນ​ຊ້ຳ​ໆດ້ວຍ ມີ .Net Developer ຫຼາຍ​ຄົນ​ມັກ​ໃຫ້​ຄວາມ​ສຳຄັນ​ກັບ​ການ​ພັດທະນາ​​ຕົວ Front end ຂອງ App ໃຫ້​ສອດ​ຄ້ອງ​ກັບ​ຄວາມ​ຕ້ອງ​ການ​ຂອງ​ທຸລະກິດ​ຫລາຍກວ່າ​ໃຫ້​ຄວາມ​ສຳຄັນ​ກັບ Database ​ເຊິ່ງ​ໃນ​ຄວາມ​ເປັນ​ຈິງ​ແລ້ວ ເປັນ​ຄວາມ​ຄິດ​ທີ່​ບໍ່​ຖືກ​ຕ້ອງປານໃດ​
     
  12. ຂຽນ Query ໃໝ່​ເພື່ອ​ຫຼີກລ້ຽງ​ຜົນ​ກະທົບ​ໃນ​ການ Search ຂໍ້​ມູນ
    ຫາກ​ເຈົ້າ​ຕ້ອງ​ການ​ປຽບທຽບ​ຂໍ້​ມູນ​ແຕ່​ລະ​ແຖວ(Row) ກໍລະນີ​ທີ່​ບໍ່​ສາມາດ​ໃຊ້ Index ເຊັ່ນ SELECT * FROM Customers WHERE RegionID <> 3 ແຕ່​ມັນ​ຈະ​ດີກວ່າ​ຫາກ​ຂຽນ Query ​ໃໝ່​ໂດຍ​ທີ່​ສາມາດ​ໃຊ້​ການ Index ເພື່ອ​ຊ່ວຍ​ໃນ​ການ​ຄົ້ນ​ຫາ​ຂໍ້​ມູນ​ໄດ້ ໂດຍ​ແກ້​ໄຂ​ເປັນ SELECT * FROM Customers WHERE RegionID < 3 UNION ALL SELECT * FROM Customers WHERE RegionID > 3 ກໍລະນີ​ທີ່​ຊຸດ​ຂໍ້​ມູນ​ມີ​ຂະໜາດ​ໃຫຍ່​ຫລາຍ​ໆ ການ​ໃຊ້ Index ຈະ​ສາມາດ​ຄົ້ນ​ຫາ​ໄດ້​ດີກວ່າ​ການ Scan ຂໍ້​ມູນ​ໃນ Table ແຕ່​ທາງ​ທີ່​ດີ​ເຈົ້າ​ຄວນ​ທົດສອບ​ກ່ອນ​ຈະ Implement ສະເໝີ ແລະ​ຫາກ​ເຈົ້າ​ສັງເກດ​ດີ​ໆ ຈະ​ພ​ບວ່າ ມັນ​ຂັດ​ແຍ້ງ​ກັບ​ກົດ​ໃນ​ຂໍ້ 13 (ຫຼີກ​ລ້ຽງ​ການ​ເກີດ Double-Dipping) ຢູ່ ແຕ່​ມັນ​ກໍ​ສະ​ທ້ອນ​ເຫັນ​ເຊັ່ນ​ກັນ​ວ່າ ບໍ່​ມີ​​ເທັກ​ນິກ​ໃດ​ທີ່​ໃຊ້​ໄດ້​ໃນ​ທຸກ​ກໍລະນີ​ສະເໝີ​ໄປ ເຖິງວ່າ​ຈະ​ເກີດ Double-Dipping ໃນ​ເທື່ອ​ນີ້ ແຕ່​ເຮົາ​ກໍ​​ຍັງ​ຄົງ​ເຮັດ​ເພື່ອ​ຫຼີກ​ລ້ຽງ​ການ​ທີ່​ຕ້ອງ Scan ຂໍ້​ມູນ​ທັງ Table ນັ້ນ​ເອງ ສິ​່​ງ​ສຳຄັນ​ທີ່ສຸດ​ຄື ເຮົາ​ຄວນ​ເລືອກ​ວິທີ​ທີ່​ເໝາະ​ສົມ​ຫລາຍກວ່າ ຢ່າ​ຢຶດ​ແຕ່​ຫຼັກ​ການ​ພຽງ​ຢ່າງ​ດຽວ
     
  13. ຫຼີກລ້ຽງ​ການ​ໃຊ້ ORM
    ອັນ​ທີ່​ຈິງ​ແລ້ວ Object-relational mappers (ORMs) ເປັນ​ການ​ຂຽນ Code ເພື່ອ​ອຳ​ນວຍ​ຄວາມສະດວກ​ໃນ​ການ​ແປງ​ຈາກ Object ໄປ​ເປັນ Database ຫຼື ​ແປງ​ຈາກ Database ກັບ​ມາ​ເປັນ Object ໂດຍ​ບໍ່​ຕ້ອງ​ຍຸ່ງກັບ​ໃນ​ສ່ວນ​ຂອງ SQL ເລີຍ ແຕ່​ຂະນະ​ດຽວ​ກັນ ມັນ​ກໍ​ສົ່ງ​ຜົນ​ກະທົບ​ຕໍ່ Performance ໂດຍ​ລວມໄດ້ ແລະ ​ອາດ​ເບິ່ງ​ບໍ່​ຄ່ອຍ​ຈຳ​ເປັນ​ເທົ່າໃດ ແຕ່​ຫາກ​ເຈົ້າ​ຈຳ​ເປັນ​ຕ້ອງ​ໃຊ້ ORM ແນະ​ນຳ​ໃຫ້​ໃຊ້ Stored Procedures ແລ້ວ​ໃຫ້ ORM ມາ​ເອີ້ນ​ມັນ​ໃຊ້​ງານ​ແທນ​ການ​ໃຊ້ ORM ໂດຍກົງ
    ​
  14. ແຍກ Transaction ໃຫຍ່​ໆ ໃຫ້​ນ້ອຍ​ລົງ
    ການ​ດຳ​ເນີນ​ການ​ຫຍັງ​ກໍ​ຕາມ​ກັບ​ຫຼາຍ​ໆ Table ພ້ອມ​ໆ ກັນ​ພາຍ​ໃນ Transaction ດຽວ ຈະ​ເຮັດໃຫ້ Table ເຫຼົ່າ​ນັ້ນ​ຈະ​ຖືກ Lock ຈົນ​ກວ່າ​ຈະ​ດຳ​ເນີນ​ການ Transaction ນັ້ນ​ສຳ​ເລັດ ທາງ​ແກ້​ບັນຫາ​ຈາກ​ກໍລະນີ​ແບບ​ນີ້​ຄື ຄວນ​ແບ່ງ​ເປັນ Transaction ຍ່ອຍ​ໆ ແທນ ໂດຍ​ພະຍາຍາມ​ໃຫ້​ເຫຼືອ 1 Operation ຕໍ່ Table ແລ້ວ​ຄ່ອຍ​ໆ​ດຳ​ເນີນ​ການ​ໄປ​ໃນ​ແຕ່​ລະ Table ການເຮັດ​ແບບ​ນີ້​ເພື່ອ​ຊ່ວຍ​ໃຫ້ Table ອື່ນ​ທີ່​ບໍ່​ຖືກ Operation ຈະ​ໄດ້​ບໍ່​ຖືກ Block ໄປນຳ
     
  15. ໃຊ້ System Table ໃນ​ການ​ນັບ​ແຖວ​ຂໍ້​ມູນ
    Rows
    ຂອງ​ຂໍ້​ມູນ​ໃນ Table ທີ່​ມີ​ຂະໜາດ​ໃຫຍ່​ໆ ສາມາດ​ໃຊ້​ຄຳ​ສັ່ງ SELECT rows from sysindexes ພຽງ​ເທົ່າ​ນີ້ ເຈົ້າ​ກໍ​ຈະ​ໄດ້​ຈຳນວນ​ແຖວ Index ທັງ​ໝົດ ແລະ ​ເນື່ອງ​ຈາກ​​ກຸ່ມ Index ເອງ​ກໍ​ເປັນ​ຂໍ້​ມູນ​ຢູ່​ແລ້ວ ເຈົ້າ​ສາມາດ​ຮູ້​ຈຳນວນ Rows ຂອງ Table ດ້ວຍ​ການ​ເພີ່ມ​ເງື່ອນ​ໄຂ WHERE indid = 1 ເຂົ້າໄປ ຈາກ​ນັ້ນ​ກໍ​ໃສ່​ຊື່ Table ແລະ ​ເຈົ້າ​ກໍ​ຈະ​ໄດ້​ຂໍ້​ມູນ​ທີ່​ຕ້ອງ​ການ ໂດຍ​ເຈົ້າ​ສາມາດ​ໃຊ້​ຄຳ​ສັ່ງ Query ດັ່ງ​ນີ້ SELECT rows FROM sysindexes WHERE object_name(id) = ‘T1’ AND indid = 1
     
  16. ຄວນ​ດຶງ​ສະເພາະ Column ທີ່​ຕ້ອງ​ການ​ເທົ່າ​ນັ້ນ
    ມັນ​ອາດຈະ​ເບິ່ງ​ງ່າຍ ແຄ່​ໃຊ້​ຄຳ​ສັ່ງ SELECT * ແທນ​ທີ່​ຈະ​ດຶງ Column ເທື່ອ​ລະ​​ລາຍ​ການ ເມື່ອ​ເຮັດ​ແບບ​ນີ້​ມີ​ບັນຫາ​ຄື ເຈົ້າ​ຈະ​ໄດ້​ຂໍ້​ມູນ​ທີ່​ບໍ່​ຕ້ອງ​ການ​ອອກ​ມາ​ດ້ວຍ ຄິດ​ເບິ່ງ​ຫາກ​ເຈົ້າ​ໃຊ້​ຄຳ​ສັ່ງ SELECT * ໃນ Table ທີ່​ມີ 120 Columns ແລະ​ມີ​ຈຳນວນ​ແຖວ​ເປັນ​ລ້ານ​ໆ Rows ແຕ່​ຂໍ້​ມູນ​ທີ່​ເຈົ້າ​ຕ້ອງ​ການ​ໃຊ້​ຈິງ ມີ​ພຽງ 3 – 5 ​ລາຍ​ການ​ເທົ່າ​ນັ້ນ ຜົນ​ຄື ບໍ່​ພຽງ​ຕ້ອງ​ປະ​ມວນ​ຜົນ​ຂໍ້​ມູນ​ໃນ​ຈຳນວນ​ມະຫາ​ສານ​ເທົ່າ​ນັ້ນ ແຕ່​​ຍັງ​ກິນ Resource ຂອງ​ລະບົບ​ໄປ​ຫລວງ​ຫລາຍ​ໂດຍ​ບໍ່​ຈຳ​ເປັນ​ອີກ​ດ້ວຍ
     
  17. ລະ​ມັດ​ລະ​ວັງ​ການ​ໃຊ້ Trigger
    ການ​ໃຊ້ Trigger ກໍ​ອາດຈະ​ເກີດ​ບັນຫາ​ໃນ​ລັກສະນະ​ດຽວ​ກັບ​ຫົວຂໍ້​ທີ່​ແລ້ວ​ໄດ້​ເຊັ່ນ​ກັນ ຄື​ລະ​ວ່າງ​ໃຊ້ Trigger ມັນ​ຈະ Lock ​ຕົວ Table ທີ່​ກ່ຽວ​ຂ້ອງ​ຈົນ​ກວ່າ​ຈະ​ດຳ​ເນີນ​ການ Transaction ນັ້ນ​ສຳ​ເລັດ ທາງ​ແນະ​ນຳ​ກໍ​ຄື ເຮັດ​ເປັນ Trigger ຍ່ອຍ​ໆ ສຳລັບ​ແຕ່​ລະ Table ​ເຊິ່ງ​ມັນ​ຈະ​ໃຊ້​ງານ Resource ຕ່າງ​ໆ ນ້ອຍ​ລົງ ​ແລະ​ ຖ້າ​ຈະ Rollback ຂໍ້​ມູນ ກໍ​ສາມາດ​ເຮັດ​ໄດ້​ງ່າຍ​ກວ່າ​ດ້ວຍ  ອັນ​ທີ່​ຈິງ ໃນ​ຫຼາຍ​ກໍລະນີ​ກໍ​ບໍ່​ຈຳ​ເປັນ​ຕ້ອງ​ໃຊ້ Trigger ກໍ​ໄດ້
     
  18. ຫຼີກ​ລ້ຽງ​ການ​ເກີດ Double-Dipping
    ບາງກໍລະນີ​ການ​ໃຊ້​ງານ Stored Procedure ກໍ​ອາດ​ເຮັດໃຫ້​ເກີດ Double-Dipping ໄດ້​ເຊັ່ນ​ກັນ ຫາກ​ເຈົ້າ​ຕ້ອງ​ການ Query ຂໍ້​ມູນ ຈາກ Table ໃຫຍ່​ໆຫຼາຍ​ໆເທື່ອ ແລ້ວ​ໄປ​ໃສ່​ໃນ​ແຕ່​ລະ Temp Table ຈາກ​ນັ້ນ​ເອົາ Table ທັງ​ຫຼາຍ​ເຫຼົ່າ​ນັ້ນ​ມາ Join ກັນ​ອີກ ການເຮັດ​ແບບ​ນີ້ ເປັນ​ການເຮັດໃຫ້ Performance ຮ້າຍ​ກວ່າ​ເກົ່າ ແຕ່​ມີ​ວິທີ​ທີ່​ດີກວ່າ​ຄື ຄວນ​ຫຼີກ​ລ້ຽງ​ການ Query ຂໍ້​ມູນ​ຈາກ Table ຂະໜາດ​ໃຫຍ່​ຫຼາຍ​ໆ ເທື່ອ ແຕ່​ຄວນ​ຈະ Query ຂໍ້​ມູນ​ມາ​ຈາກ Table ໃຫຍ່​ນັ້ນ ໃຫ້​ມີ​ຂະໜາດ​ຂໍ້​ມູນ​ທີ່​ນ້ອຍ​ລົງ ແລ້ວ​ຄ່ອຍ​ດຳ​ເນີນ​ການ​ຫຍັງ​ກໍ​ຕາມ​ກັບ​ຂໍ້​ມູນ​ເຫຼົ່າ​ນັ້ນ​ຈະ​ດີກວ່າ
     
  19. ຫຼີກ​ລ້ຽງ​ການ​ໃຊ້ GUIDs
    ພະຍາຍາມ​ຫຼີກ​ລ້ຽງ​ການ​ໃຊ້ Globally Unique Identifiers (GUIDs) ໃນ​ການ Order (ຈັດ​ລຽງ) ຂໍ້​ມູນ​ໃນ Table  ເພາະ​​ຕົວ​ເລກ 16 ບິດ​ທີ່​ຖືກ​ສ້າງ​ຂຶ້ນ “ແບບ Random” ຂອງ GUID ອາດ​ເຮັດໃຫ້​ເກີດ​ບັນຫາ​ກັບ Table ໄດ້​ຫລາຍ​ຂຶ້ນ ຄວນ​ໃຊ້​ການ Order ຂໍ້​ມູນ​ໂດຍ​ໃຊ້​ຄ່າ​ທີ່​ສະເພາະ​ເຈາະ​ຈົງ​ໄປ​ເລີຍ ເຊັ່ນ DATE ຫລື IDENTITY ເປັນ​ຕົ້ນ ຈະ​ຊ່ວຍ​ລຸດ​ການ​ເກີດ​ບັນຫາ​ຂອງ Table
     
  20. ຢ່າ​ໃຊ້​ຄຳ​ສັ່ງ COUNT ກັບ​ຂໍ້​ມູນ​ທັງ​ໝົດ​ໃນ Table
    ສົມມຸດເຈົ້າ​ຕ້ອງ​ການ​ເບິ່ງ​ຂໍ້​ມູນ​ບາງຢ່າງ​ວ່າ ມີ​ຢູ່ໃນ Table ນັ້ນ​ບໍ ເຊັ່ນ ຢາກ​ເຊັກ​ຂໍ້​ມູນ​ຂອງ​ລູກ​ຄ້າ ແນ່ນອນ​ວ່າ​ເຈົ້າ​ຕ້ອງ Query ຂໍ້​ມູນ​ຈາກ Table ອອກ​ມາ ແຕ່​ເຊື່ອ​ບໍ​ວ່າ​ມີ​ບາງ​ຄົົນທີ່​ໃຊ້​ຄຳ​ສັ່ງ SELECT COUNT(*) FROM dbo.T1 ເພື່ອ​ເຊັກ​ຂໍ້​ມູ​ນວ່າ​ມີ​ຢູ່​ບໍ ລອງ​ເບິ່ງ​ຈາກ​​ຕົວ​ຢ່າງ

    SET @CT = (SELECT COUNT(*) FROM dbo.T1);
    If @CT > 0
    BEGIN <Do something>
    END

    ແນ່ນອນ​ວ່າ​ໄດ້​ຂໍ້​ມູນ ແຕ່​ກໍ​ບໍ່​ເຫັນ​ຈຳ​ເປັນ​ຕ້ອງ​ເຮັດ​ເຖິງ​ຂະໜາດ​ນັ້ນ ຖ້າ​ຢາກ​ຈະ​ເຊັກ ກໍ​ລອງ​ເຮັດ​ແບບ​ນີ້​ເບິ່ງ:

    If EXISTS (SELECT 1 FROM dbo.T1)
    BEGIN
    <Do something>
    END

    ສະນັ້ນເຮົາ​ບໍ່​ຄວນ​ໃຊ້ Count(*) ຖ້າບໍ່ຈຳເປັນ ຫາກ​ເຮົາ​ຕ້ອງ​ການແຕ່ເຊັກ​ຂໍ້​ມູນ​ທີ່​ເຮົາ​ສົນ​ໃຈ ກໍ​ພຽງ​ດຶງ​ຂໍ້​ມູນ Row ນັ້ນ​ອອກ​ມາ​ເທົ່າ​ນັ້ນ​ເອງ ຢ່າງ​ໃນ SQL Server ເອງ​ກໍ​ສາມາດ​ໃຊ້​ຄຳ​ສັ່ງ EXISTS ເຂົ້າ​ມາ​ຊ່ວຍ​ໄດ້ ໂດຍ​ຈາກ​​ຕົວ​ຢ່າງ​ທີ່ 2 ເຈົ້າ​ຈະ​ໄດ້​ຜົນ​ລັບທີ່​ວ່ອງໄວ​ກວ່າ​​ຕົວ​ຢ່າງທຳອິດຫລາຍ
     
  21. ຢ່າ​ນຳ Code ຄົນອື່ນ ມາ​ໃຊ້​ແບບ​ສຸ່ມ​ສີ່​ສຸມ​ຫ້າ
    ມັນ​ເປັນ​ເລື່ອງ​ງ່າຍ​ຫລາຍ​ໃນ​ການ Copy Code ຂອງ​ຄົນ​ອື່ນ​ມາ​ໃຊ້​ງານ ເມື່ອ​ເຈົ້າ​ເຫັນ​ວ່າ​ມັນ​ດຶງ​ຂໍ້​ມູນ​ໃນ​ລັກສະນະ​ດຽວ​ກັນ​ມາ​ໃຫ້​ເຈົ້າ​ໄດ້ ແຕ່​ບັນຫາ​ຄື ການເຮັດ​ແບບ​ນີ້ ເຈົ້າ​ມັກ​ຈະ​ໄດ້​ຂໍ້​ມູນ​ທີ່​ເຈົ້າ​ບໍ່​ຕ້ອງ​ການ​ອອກ​ມາ​ດ້ວຍ ແລະ​ເຫຼົ່າ Developer ກໍ​ມັກ​ບໍ່​ຄ່ອຍ​ໃຫ້​ຄວາມ​ສຳຄັນ​ໃນ​ການ​ຕັດ​ສິ່ງ​ບໍ່​ຈຳ​ເປັນ​ພວກ​ນັ້ນ​ອອກ​ດ້ວຍ ສຸດ​ທ້າຍ​ເຈົ້າ​ກໍ​ໄດ້​ຂໍ້​ມູນ​ທີ່​ບໍ່​ຈຳ​ເປັນ​ອອກ​ມາ​ຫລວງ​ຫລາຍ ໂດຍ​ທີ່​ມາ​ຂອງ​ຜົນ​ລັບ​ທີ່​ບໍ່​ຈຳ​ເປັນ​ດັ່ງ​ກ່າວ ມັກ​ເກີດ​ຈາກ​ການ​ໃຊ້ OUTER JOIN ຫລື​ເງື່ອນ​ໄຂ​ພິເສດ​ຕ່າງ​ໆ ໃນ WHERE clause ​ເຊິ່ງ​ເຈົ້າ​ສາມາດ​ແກ້​ໄຂ​ບັນຫາ​ນີ້​ໄດ້​ໂດຍ​ການ​ໃຊ້​ສະເພາະ Code ທີ່​ກົງ​ກັບ​ຄວາມ​ຕ້ອງ​ການ​ຂອງ​ເຈົ້າ​ເທົ່າ​ນັ້ນ​ເອງ

ແຫຼ່ງຂໍ້ມູນ: 




No comments:

Post a Comment

Post Top Ad