Hacker News

C# strings ຂ້າ SQL Server indexes ຂອງເຈົ້າຢ່າງງຽບໆໃນ Dapper

ຄຳເຫັນ

2 min read Via consultwithgriff.com

Mewayz Team

Editorial Team

Hacker News

ສະຕຣິງ C# ກໍາລັງຂັດຂວາງການປະຕິບັດຖານຂໍ້ມູນຂອງເຈົ້າຢ່າງງຽບໆ

ຖ້າທ່ານເປັນນັກພັດທະນາ .NET ໂດຍໃຊ້ Dapper ສໍາລັບການເຂົ້າເຖິງຂໍ້ມູນຂອງທ່ານ, ທ່ານໄດ້ເລືອກອັນດີສໍາລັບປະສິດທິພາບ ແລະງ່າຍດາຍ. Dapper ເປັນ micro-ORM ທີ່ດີເລີດທີ່ເຮັດໃຫ້ທ່ານໃກ້ຊິດກັບໂລຫະ, ຫຼີກເວັ້ນການ overhead ແລະຄວາມຊັບຊ້ອນຂອງກອບຂະຫນາດໃຫຍ່. ແຕ່ອໍານາດນີ້ມາພ້ອມກັບຄວາມຮັບຜິດຊອບ. ນິໄສການເຂົ້າລະຫັດທີ່ເບິ່ງຄືວ່າຄືຊິບໍ່ມີ, ແຜ່ຂະຫຍາຍຢູ່ໃນຄໍາຮ້ອງສະຫມັກ C#, ອາດຈະເຮັດໃຫ້ປະສິດທິພາບຂອງ SQL Server ຂອງທ່ານ: ການໃຊ້ inline string literals ສໍາລັບການສອບຖາມ SQL. ການປະຕິບັດນີ້ເຮັດໃຫ້ການຄາດຕະກໍາຢ່າງງຽບໆປະສິດທິພາບຂອງດັດສະນີຖານຂໍ້ມູນທີ່ວາງແຜນໄວ້ຢ່າງລະມັດລະວັງຂອງທ່ານ, ນໍາໄປສູ່ການສອບຖາມທີ່ຊ້າລົງ ແລະປະສົບການຂອງຜູ້ໃຊ້ທີ່ບໍ່ດີ. ສໍາລັບເວທີເຊັ່ນ Mewayz, ບ່ອນທີ່ການຈັດການຂໍ້ມູນທີ່ມີປະສິດທິພາບແມ່ນສໍາຄັນສໍາລັບການຄຸ້ມຄອງການດໍາເນີນທຸລະກິດ, ນີ້ແມ່ນຕົວຂ້າປະສິດທິພາບທີ່ທ່ານບໍ່ສາມາດຈ່າຍໄດ້.

Index Magic and the Parameterized Savior

ທຳອິດ, ໃຫ້ເຮົາເຂົ້າໃຈວ່າເປັນຫຍັງດັດຊະນີຈຶ່ງສຳຄັນຫຼາຍ. ດັດຊະນີຖານຂໍ້ມູນແມ່ນຄ້າຍຄືດັດຊະນີໃນປຶ້ມ; ມັນອະນຸຍາດໃຫ້ SQL Server ເພື່ອຊອກຫາຂໍ້ມູນໂດຍບໍ່ມີການສະແກນທຸກຫນ້າດຽວ (ຫຼືແຖວ). ເມື່ອທ່ານດໍາເນີນການສອບຖາມດ້ວຍຂໍ້ `WHERE`, ຕົວເພີ່ມປະສິດທິພາບການສອບຖາມຊອກຫາດັດຊະນີທີ່ດີທີ່ສຸດທີ່ຈະໃຊ້. ກຸນແຈຂອງ magic ນີ້ແມ່ນການຄາດເດົາ. ເມື່ອທ່ານໃຊ້ການສອບຖາມແບບພາລາມິເຕີ, ທ່ານໃຫ້ຮູບແບບທີ່ຊັດເຈນ ແລະສອດຄ່ອງໃຫ້ກັບຕົວເພີ່ມປະສິດທິພາບ.

ນີ້ແມ່ນຄວາມແຕກຕ່າງ. ພິຈາລະນາຕົວຢ່າງ Dapper ສອງອັນນີ້:

// ນີ້ແມ່ນບໍ່ດີ - String Concatenation
var userId = "12345";
var sql = $"SELECT * FROM ຜູ້ໃຊ້ WHERE UserId = {userId}";
var user = connection.Query(sql);

ກັບ

// ນີ້ແມ່ນດີ - Parameterized Query
var sql = "ເລືອກ * ຈາກຜູ້ໃຊ້ WHERE UserId = @UserId";
var user = connection.Query(sql, new { UserId = 12345 });

ຕົວຢ່າງທຳອິດສ້າງສະຕຣິງ SQL ທີ່ເປັນເອກະລັກສຳລັບທຸກໆ `userId` ທີ່ແຕກຕ່າງກັນ. ຈາກທັດສະນະຂອງ SQL Server, ມັນເຫັນການສອບຖາມໃຫມ່ຫມົດໃນແຕ່ລະຄັ້ງ: ຫນຶ່ງສໍາລັບ `UserId = 12345`, ອື່ນສໍາລັບ `UserId = 67890`, ແລະອື່ນໆ. ຕົວຢ່າງທີສອງສົ່ງສະຕຣິງແບບສອບຖາມ ດຽວກັນ ທຸກໆຄັ້ງ, ພຽງແຕ່ປ່ຽນຄ່າພາຣາມິເຕີເທົ່ານັ້ນ. ຄວາມສອດຄ່ອງນີ້ແມ່ນພື້ນຖານຂອງການປະຕິບັດການສອບຖາມທີ່ມີປະສິດທິພາບ.

ວິທີ Caching Plan Query String Literals Sabotage

ຫຼັກຂອງບັນຫາແມ່ນຢູ່ໃນ Query Plan Cache. SQL Server ລວບລວມສາຍ SQL ຂອງທ່ານເຂົ້າໃນແຜນການປະຕິບັດ - ແຜນຜັງສໍາລັບວິທີການດຶງຂໍ້ມູນ. ການລວບລວມຂໍ້ມູນນີ້ແມ່ນລາຄາແພງ, ດັ່ງນັ້ນ SQL Server ຈື່ງເອົາແຜນການເຫຼົ່ານີ້ເພື່ອໃຊ້ຄືນໃຫມ່. ດ້ວຍການສອບຖາມຕົວກໍານົດການ, ແຜນການສໍາລັບ `SELECT * FROM ຜູ້ໃຊ້ WHERE UserId = @UserId` ໄດ້ຖືກລວບລວມຄັ້ງດຽວ, ເກັບໄວ້ໃນຖານຄວາມຈໍາ, ແລະນໍາໃຊ້ຄືນໃຫມ່ສໍາລັບທຸກໆການໂທຕໍ່ໄປ, ໂດຍບໍ່ຄໍານຶງເຖິງມູນຄ່າ ID ຕົວຈິງ. ແຜນ​ການ​ທີ່​ເກັບ​ໄວ້​ນີ້​ໄດ້​ຖືກ​ອອກ​ແບບ​ເພື່ອ​ໃຫ້​ມີ​ປະ​ສິດ​ທິ​ຜົນ​ການ​ນໍາ​ໃຊ້​ດັດ​ຊະ​ນີ​ຢູ່​ໃນ​ຖັນ `UserId`.

ເມື່ອທ່ານໃຊ້ inline string literals, ແຕ່ລະຄ່າທີ່ເປັນເອກະລັກຈະສ້າງ SQL string ທີ່ເປັນເອກະລັກ. SQL Server ປະຕິບັດແຕ່ລະຄົນເປັນການສອບຖາມໃຫມ່, ບັງຄັບໃຫ້ມັນເສຍວົງຈອນ CPU ໃນການລວບລວມແລະສ້າງແຜນການປະຕິບັດໃຫມ່ທຸກໆຄັ້ງ. ອັນນີ້ເຮັດໃຫ້ແຜນຜັງຂອງແຜນຜຸພັງຢ່າງໄວວາດ້ວຍແຜນດຽວກັນ, ໃຊ້ຄັ້ງດຽວ, ຂັບໄລ່ແຜນການທີ່ເປັນປະໂຫຍດອື່ນໆ ແລະເສຍຄວາມຊົງຈຳ. ສໍາຄັນກວ່ານັ້ນ, ຜູ້ເພີ່ມປະສິດທິພາບມັກຈະບໍ່ສາມາດນໍາໃຊ້ດັດຊະນີທີ່ດີທີ່ສຸດສໍາລັບການສອບຖາມແບບດຽວເຫຼົ່ານີ້, ບາງຄັ້ງເຮັດໃຫ້ການສະແກນຕາຕະລາງແທນທີ່ຈະຊອກຫາ. ດັດຊະນີປະສິດທິພາບສູງຂອງທ່ານກາຍເປັນເຄື່ອງປະດັບທີ່ບໍ່ມີປະໂຫຍດ.

ຜົນກະທົບດ້ານປະສິດທິພາບທີ່ທ່ານບໍ່ສາມາດລະເລີຍ

ຜົນ​ຂອງ​ການ​ຕ້ານ​ການ​ແບບ​ນີ້​ແມ່ນ​ຮ້າຍ​ແຮງ​ແລະ​ສົມ​ທົບ​ກັນ​ໃນ​ໄລ​ຍະ​ເວ​ລາ.

💡 DID YOU KNOW?

Mewayz replaces 8+ business tools in one platform

CRM · Invoicing · HR · Projects · Booking · eCommerce · POS · Analytics. Free forever plan available.

Start Free →
  • ການນຳໃຊ້ CPU ສູງ: ການລວບລວມຂໍ້ມູນແບບສອບຖາມຄົງທີ່ເຮັດໃຫ້ CPU ຂອງເຊີບເວີຖານຂໍ້ມູນຂອງທ່ານເພີ່ມຂຶ້ນ.
  • ເວລາການຕອບຄຳຖາມຊ້າ: ການສອບຖາມໃຊ້ເວລາດົນກວ່າເພາະວ່າພວກມັນຂາດແຄດ ແລະອາດຈະເຮັດການສະແກນເຕັມຕາຕະລາງ.
  • Plan Cache Bloat: cache ຖືກອຸດຕັນດ້ວຍແຜນການໃຊ້ຄັ້ງດຽວ, ເຮັດໃຫ້ປະສິດທິພາບຂອງການສອບຖາມທັງໝົດຢູ່ໃນເຊີບເວີ.
  • ຄວາມສ່ຽງດ້ານຄວາມປອດໄພ: ວິທີນີ້ເປີດປະຕູສູ່ການໂຈມຕີແບບສີດ SQL, ຊ່ອງໂຫວ່ທີ່ສໍາຄັນທີ່ພາລາມິເຕີການສອບຖາມປ້ອງກັນໂດຍປົກກະຕິ.

ສຳ​ລັບ​ລະ​ບົບ​ປະ​ຕິ​ບັດ​ການ​ທຸ​ລະ​ກິດ​ເຊັ່ນ Mewayz, ເຊິ່ງ​ຈັດ​ການ​ຂໍ້​ມູນ modular ສະ​ລັບ​ສັບ​ຊ້ອນ​ສໍາ​ລັບ​ບໍ​ລິ​ສັດ, ບັນ​ຫາ​ເຫຼົ່າ​ນີ້​ສາ​ມາດ​ເຮັດ​ໃຫ້​ການ​ຕອບ​ສະ​ຫນອງ​ຂອງ​ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​, ສົ່ງ​ຜົນ​ກະ​ທົບ​ໂດຍ​ກົງ​ຜະ​ລິດ​ຕະ​ພັນ​ຂອງ​ຜູ້​ໃຊ້​ແລະ​ຄວາມ​ພໍ​ໃຈ.

ການ​ແກ້​ໄຂ​ບັນ​ຫາ: ຮັບ​ເອົາ​ພາ​ລາ​ມິ​ເຕີ​ແລະ​ການ​ທົບ​ທວນ​ຄືນ​ລະ​ຫັດ​ຂອງ​ທ່ານ

ການ​ແກ້​ໄຂ​ແມ່ນ​ງ່າຍ​ດາຍ​ແລະ​ສອດ​ຄ່ອງ​ກັບ​ການ​ປະ​ຕິ​ບັດ​ທີ່​ດີ​ທີ່​ສຸດ​ທີ່​ທ່ານ​ຄວນ​ຈະ​ປະ​ຕິ​ບັດ​ຕາມ​. ໃຊ້ການສອບຖາມທີ່ມີພາລາມິເຕີກັບ Dapper ສະເໝີ. Dapper ເຮັດໃຫ້ມັນງ່າຍຢ່າງບໍ່ຫນ້າເຊື່ອໂດຍການອະນຸຍາດໃຫ້ທ່ານຜ່ານພາລາມິເຕີເປັນວັດຖຸທີ່ບໍ່ເປີດເຜີຍຊື່ຫຼືຕົວກໍານົດການເຄື່ອນໄຫວ. ນີ້ບໍ່ພຽງແຕ່ຮັບປະກັນຄໍາຮ້ອງສະຫມັກຂອງທ່ານຕໍ່ກັບການສີດ SQL, ແຕ່ຍັງຮັບປະກັນການສອບຖາມຂອງທ່ານເປັນ cache-friendly ແລະສາມາດ leverage ດັດຊະນີຂອງທ່ານຢ່າງຖືກຕ້ອງ.

ນອກຈາກນັ້ນ, ຕິດຕາມ cache ແຜນຂອງ SQL Server ຂອງທ່ານຢ່າງເປັນປົກກະຕິ. ຊອກຫາການສອບຖາມ "Adhoc" ຈໍານວນຫລາຍ, ເຊິ່ງມັກຈະເປັນສັນຍານບອກເຖິງບັນຫານີ້. ໃຊ້ເຄື່ອງມືເຊັ່ນ SQL Server Management Studio (SSMS) ເພື່ອວິເຄາະປະສິດທິພາບການສອບຖາມ ແລະກໍານົດການສະແກນບ່ອນທີ່ການຊອກຫາຄວນຈະເກີດຂຶ້ນ. ໂດຍການຮັບຮອງເອົາພາລາມິເຕີ ແລະ ການຕິດຕາມຢ່າງຕັ້ງໜ້າ, ທ່ານປົດລັອກທ່າແຮງອັນເຕັມທີ່ຂອງຊັ້ນຖານຂໍ້ມູນຂອງທ່ານ, ຮັບປະກັນວ່າແພລດຟອມເຊັ່ນ Mewayz ສາມາດສະໜອງປະສິດທິພາບທີ່ໄວ ແລະເຊື່ອຖືໄດ້ທີ່ທຸລະກິດສະໄໝໃໝ່ຕ້ອງການ.

ຄຳຖາມທີ່ຖາມເລື້ອຍໆ

ສະຕຣິງ C# ກໍາລັງຂັດຂວາງການປະຕິບັດຖານຂໍ້ມູນຂອງເຈົ້າຢ່າງງຽບໆ

ຖ້າທ່ານເປັນນັກພັດທະນາ .NET ໂດຍໃຊ້ Dapper ສໍາລັບການເຂົ້າເຖິງຂໍ້ມູນຂອງທ່ານ, ທ່ານໄດ້ເລືອກອັນດີສໍາລັບປະສິດທິພາບ ແລະງ່າຍດາຍ. Dapper ເປັນ micro-ORM ທີ່ດີເລີດທີ່ເຮັດໃຫ້ທ່ານໃກ້ຊິດກັບໂລຫະ, ຫຼີກເວັ້ນການ overhead ແລະຄວາມຊັບຊ້ອນຂອງກອບຂະຫນາດໃຫຍ່. ແຕ່ອໍານາດນີ້ມາພ້ອມກັບຄວາມຮັບຜິດຊອບ. ນິໄສການເຂົ້າລະຫັດທີ່ເບິ່ງຄືວ່າຄືຊິບໍ່ມີ, ແຜ່ຂະຫຍາຍຢູ່ໃນຄໍາຮ້ອງສະຫມັກ C#, ອາດຈະເຮັດໃຫ້ປະສິດທິພາບຂອງ SQL Server ຂອງທ່ານ: ການໃຊ້ inline string literals ສໍາລັບການສອບຖາມ SQL. ການປະຕິບັດນີ້ເຮັດໃຫ້ການຄາດຕະກໍາຢ່າງງຽບໆປະສິດທິພາບຂອງດັດສະນີຖານຂໍ້ມູນທີ່ວາງແຜນໄວ້ຢ່າງລະມັດລະວັງຂອງທ່ານ, ນໍາໄປສູ່ການສອບຖາມທີ່ຊ້າລົງ ແລະປະສົບການຂອງຜູ້ໃຊ້ທີ່ບໍ່ດີ. ສໍາລັບເວທີເຊັ່ນ Mewayz, ບ່ອນທີ່ການຈັດການຂໍ້ມູນທີ່ມີປະສິດທິພາບແມ່ນສໍາຄັນສໍາລັບການຄຸ້ມຄອງການດໍາເນີນທຸລະກິດ, ນີ້ແມ່ນຕົວຂ້າປະສິດທິພາບທີ່ທ່ານບໍ່ສາມາດຈ່າຍໄດ້.

Index Magic ແລະ Parameterized Savior

ທຳອິດ, ໃຫ້ເຮົາເຂົ້າໃຈວ່າເປັນຫຍັງດັດຊະນີຈຶ່ງສຳຄັນຫຼາຍ. ດັດຊະນີຖານຂໍ້ມູນແມ່ນຄ້າຍຄືດັດຊະນີໃນປຶ້ມ; ມັນອະນຸຍາດໃຫ້ SQL Server ເພື່ອຊອກຫາຂໍ້ມູນໂດຍບໍ່ມີການສະແກນທຸກຫນ້າດຽວ (ຫຼືແຖວ). ເມື່ອທ່ານດໍາເນີນການສອບຖາມດ້ວຍຂໍ້ `WHERE`, ຕົວເພີ່ມປະສິດທິພາບການສອບຖາມຊອກຫາດັດຊະນີທີ່ດີທີ່ສຸດທີ່ຈະໃຊ້. ກຸນແຈຂອງ magic ນີ້ແມ່ນການຄາດເດົາ. ເມື່ອທ່ານໃຊ້ການສອບຖາມແບບພາລາມິເຕີ, ທ່ານໃຫ້ຮູບແບບທີ່ຊັດເຈນ ແລະສອດຄ່ອງໃຫ້ກັບຕົວເພີ່ມປະສິດທິພາບ.

ວິທີ Query String Literals Sabotage Caching

ຫຼັກຂອງບັນຫາແມ່ນຢູ່ໃນ Query Plan Cache. SQL Server ລວບລວມສາຍ SQL ຂອງທ່ານເຂົ້າໃນແຜນການປະຕິບັດ - ແຜນຜັງສໍາລັບວິທີການດຶງຂໍ້ມູນ. ການລວບລວມຂໍ້ມູນນີ້ແມ່ນລາຄາແພງ, ດັ່ງນັ້ນ SQL Server ຈື່ງເອົາແຜນການເຫຼົ່ານີ້ເພື່ອໃຊ້ຄືນໃຫມ່. ດ້ວຍການສອບຖາມຕົວກໍານົດການ, ແຜນການສໍາລັບ `SELECT * FROM ຜູ້ໃຊ້ WHERE UserId = @UserId` ໄດ້ຖືກລວບລວມຄັ້ງດຽວ, ເກັບໄວ້ໃນຖານຄວາມຈໍາ, ແລະນໍາໃຊ້ຄືນໃຫມ່ສໍາລັບທຸກໆການໂທຕໍ່ໄປ, ໂດຍບໍ່ຄໍານຶງເຖິງມູນຄ່າ ID ຕົວຈິງ. ແຜນ​ການ​ທີ່​ເກັບ​ໄວ້​ນີ້​ໄດ້​ຖືກ​ອອກ​ແບບ​ເພື່ອ​ໃຫ້​ມີ​ປະ​ສິດ​ທິ​ຜົນ​ການ​ນໍາ​ໃຊ້​ດັດ​ຊະ​ນີ​ຢູ່​ໃນ​ຖັນ `UserId`.

ຜົນກະທົບດ້ານປະສິດທິພາບທີ່ທ່ານບໍ່ສາມາດລະເລີຍ

ຜົນ​ຂອງ​ການ​ຕ້ານ​ການ​ແບບ​ນີ້​ແມ່ນ​ຮ້າຍ​ແຮງ​ແລະ​ສົມ​ທົບ​ກັນ​ໃນ​ໄລ​ຍະ​ເວ​ລາ.

ການ​ແກ້​ໄຂ​ບັນ​ຫາ: ຮັບ​ເອົາ​ພາ​ລາ​ມິ​ເຕີ​ແລະ​ການ​ທົບ​ທວນ​ຄືນ​ລະ​ຫັດ​ຂອງ​ທ່ານ

ການ​ແກ້​ໄຂ​ແມ່ນ​ງ່າຍ​ດາຍ​ແລະ​ສອດ​ຄ່ອງ​ກັບ​ການ​ປະ​ຕິ​ບັດ​ທີ່​ດີ​ທີ່​ສຸດ​ທີ່​ທ່ານ​ຄວນ​ຈະ​ປະ​ຕິ​ບັດ​ຕາມ​. ໃຊ້ການສອບຖາມທີ່ມີພາລາມິເຕີກັບ Dapper ສະເໝີ. Dapper ເຮັດໃຫ້ມັນງ່າຍຢ່າງບໍ່ຫນ້າເຊື່ອໂດຍການອະນຸຍາດໃຫ້ທ່ານຜ່ານພາລາມິເຕີເປັນວັດຖຸທີ່ບໍ່ເປີດເຜີຍຊື່ຫຼືຕົວກໍານົດການເຄື່ອນໄຫວ. ນີ້ບໍ່ພຽງແຕ່ຮັບປະກັນຄໍາຮ້ອງສະຫມັກຂອງທ່ານຕໍ່ກັບການສີດ SQL, ແຕ່ຍັງຮັບປະກັນການສອບຖາມຂອງທ່ານເປັນ cache-friendly ແລະສາມາດ leverage ດັດຊະນີຂອງທ່ານຢ່າງຖືກຕ້ອງ.

ເຄື່ອງມືທຸລະກິດຂອງທ່ານທັງໝົດຢູ່ບ່ອນດຽວ

ຢຸດການຫຼີ້ນເກມຫຼາຍແອັບ. Mewayz ລວມ 208 ເຄື່ອງ​ມື​ສໍາ​ລັບ​ພຽງ​ແຕ່ $49/ເດືອນ — ຈາກ​ສາງ​ເຖິງ HR, ການ​ຈອງ​ກັບ​ການ​ວິ​ເຄາະ. ບໍ່ຈຳເປັນຕ້ອງມີບັດເຄຣດິດເພື່ອເລີ່ມຕົ້ນ.

ລອງໃຊ້ Mewayz ຟຣີ →

Try Mewayz Free

All-in-one platform for CRM, invoicing, projects, HR & more. No credit card required.

Start managing your business smarter today

Join 30,000+ businesses. Free forever plan · No credit card required.

Ready to put this into practice?

Join 30,000+ businesses using Mewayz. Free forever plan — no credit card required.

Start Free Trial →

Ready to take action?

Start your free Mewayz trial today

All-in-one business platform. No credit card required.

Start Free →

14-day free trial · No credit card · Cancel anytime