ในระยะสั้นฉันจะเห็นด้วยกับ CTO ของคุณ คุณอาจได้รับประสิทธิภาพบางอย่างโดยค่าใช้จ่ายในการปรับขนาดได้ (หากคำเหล่านั้นสับสนฉันจะอธิบายด้านล่าง) ความกังวลที่ใหญ่ที่สุดสองข้อของฉันคือการบำรุงรักษาและการไม่มีตัวเลือกในการปรับขนาดในแนวนอน (สมมติว่าคุณต้องการสิ่งนั้น)
ความใกล้เคียงกับข้อมูล: ลองย้อนกลับไปก่อน มีบางเหตุผลที่ดีสำหรับการกดรหัสลงในฐานข้อมูล ฉันจะยืนยันว่าสิ่งที่ยิ่งใหญ่ที่สุดคือความใกล้เคียงกับข้อมูล - ตัวอย่างเช่นหากคุณคาดหวังว่าการคำนวณจะคืนค่าจำนวนหนึ่ง แต่สิ่งเหล่านี้เป็นการรวมตัวกันของเร็กคอร์ดหลายล้านเร็กคอร์ด เครือข่ายที่จะรวมกันที่อื่นนั้นสิ้นเปลืองอย่างมหาศาลและสามารถฆ่าระบบของคุณได้อย่างง่ายดาย เมื่อกล่าวถึงสิ่งนี้คุณสามารถบรรลุความใกล้ชิดของข้อมูลในรูปแบบอื่นโดยใช้แคชหรือฐานข้อมูลการวิเคราะห์ที่มีการรวมกลุ่มบางส่วนเสร็จล่วงหน้า
ประสิทธิภาพของรหัสใน DB:ผลการปฏิบัติงานรองเช่น "แคชแผนการดำเนินการ" นั้นยากที่จะโต้แย้ง บางครั้งแผนปฏิบัติการที่แคชอาจเป็นสิ่งที่เป็นลบมากหากแผนการดำเนินการที่ไม่ถูกต้องถูกแคช ขึ้นอยู่กับ RDBMS ของคุณคุณอาจได้รับประโยชน์สูงสุดจากสิ่งเหล่านี้ แต่คุณจะไม่ได้รับ SQL ที่เกินขอบเขตในกรณีส่วนใหญ่ ฉันจะยืนยันว่าภาษาที่คอมไพล์หรือ JIT ส่วนใหญ่มักจะทำงานได้ดีกว่า SQL เทียบเท่าของพวกเขา (เช่น T-SQL หรือ PL / SQL) สำหรับการดำเนินงานขั้นพื้นฐานและการเขียนโปรแกรมที่ไม่ใช่เชิงสัมพันธ์ (การจัดการสตริง, ลูป ฯลฯ ) ไม่เสียอะไรที่นั่นถ้าคุณใช้บางสิ่งบางอย่างเช่น Java หรือ C # เพื่อทำตัวเลขซ้ำซ้อน การปรับให้เหมาะสมแบบละเอียดนั้นก็ค่อนข้างยากเช่นกันบนฐานข้อมูลคุณ มักจะติดอยู่กับ B-tree ทั่วไป (ดัชนี) เป็นโครงสร้างข้อมูลเดียวของคุณ เพื่อความเป็นธรรมการวิเคราะห์อย่างเต็มรูปแบบรวมถึงสิ่งต่าง ๆ เช่นการทำธุรกรรมที่ยาวนานขึ้นการเพิ่มระดับการล็อก ฯลฯ สามารถเติมหนังสือได้
การบำรุงรักษา: SQL เป็นภาษาที่ยอดเยี่ยมสำหรับสิ่งที่มันถูกออกแบบมาเพื่อทำ ฉันไม่แน่ใจว่ามันเป็นแบบที่ดีสำหรับตรรกะแอปพลิเคชัน เครื่องมือและวิธีปฏิบัติส่วนใหญ่ที่ทำให้ชีวิตของเรานั้นทนทาน (TDD, การเปลี่ยนโครงสร้าง ฯลฯ ) ยากที่จะนำไปใช้กับการเขียนโปรแกรมฐานข้อมูล
ประสิทธิภาพเทียบกับความสามารถในการปรับขยาย:ในการชี้แจงข้อกำหนดเหล่านี้ฉันหมายถึงสิ่งนี้: ประสิทธิภาพคือความรวดเร็วในการที่คุณคาดหวังว่าคำขอเดียวจะต้องผ่านระบบของคุณ (และกลับสู่ผู้ใช้) ในขณะที่สมมติว่าโหลดต่ำ สิ่งนี้มักจะถูก จำกัด ด้วยสิ่งต่าง ๆ เช่นจำนวนของเลเยอร์ทางกายภาพที่ผ่านไปการเพิ่มประสิทธิภาพของเลเยอร์เหล่านั้นเป็นอย่างไร ฯลฯ ความสามารถในการปรับขนาดคือการเปลี่ยนแปลงประสิทธิภาพเมื่อเพิ่มจำนวนผู้ใช้ / โหลด คุณอาจมีประสิทธิภาพปานกลาง / ต่ำ (กล่าวคือ 5 วินาที + สำหรับการร้องขอ) แต่ความสามารถในการปรับขยายที่ยอดเยี่ยม (สามารถรองรับผู้ใช้หลายล้านคน) ในกรณีของคุณคุณอาจจะประสบกับประสิทธิภาพที่ดี แต่ความสามารถในการปรับขนาดของคุณจะถูก จำกัด โดยเซิร์ฟเวอร์ขนาดใหญ่ที่คุณสามารถสร้างได้ เมื่อถึงจุดหนึ่งคุณจะถึงขีด จำกัด นั้นและถูกบังคับให้หันไปหาสิ่งต่าง ๆ เช่นการเรียงลำดับซึ่งอาจไม่สามารถทำได้ขึ้นอยู่กับลักษณะของแอปพลิเคชัน
การเพิ่มประสิทธิภาพก่อนวัย: ในที่สุดฉันคิดว่าคุณทำผิดพลาดในการปรับให้เหมาะสมก่อนเวลาอันควร ในขณะที่คนอื่น ๆ ชี้ให้เห็นคุณไม่ได้มีการวัดจริง ๆ แสดงให้เห็นว่าวิธีการอื่น ๆ จะทำงานอย่างไร เราไม่สามารถสร้างต้นแบบเต็มรูปแบบเพื่อพิสูจน์หรือหักล้างทฤษฎีได้เสมอ ... แต่โดยทั่วไปฉันมักลังเลที่จะเลือกวิธีที่ใช้ในการแลกเปลี่ยนความสามารถในการบำรุงรักษา .
แก้ไข: ในแง่บวกการปรับขนาดแนวตั้งสามารถยืดได้ค่อนข้างไกลในบางกรณี เท่าที่ฉันรู้ดังนั้นทำงานบนเซิร์ฟเวอร์เดียวสำหรับบางครั้ง ฉันไม่แน่ใจว่ามันตรงกับผู้ใช้ 10,000 คนของคุณอย่างไร (ฉันเดาว่ามันขึ้นอยู่กับลักษณะของสิ่งที่พวกเขากำลังทำในระบบของคุณ) แต่มันให้ความคิดว่าคุณสามารถทำอะไรได้บ้าง ตัวอย่างที่น่าประทับใจยิ่งขึ้นสิ่งนี้เพิ่งได้รับความนิยมอย่างที่คนคนหนึ่งเข้าใจได้ง่าย)
แก้ไข 2: เพื่อชี้แจงและแสดงความคิดเห็นในบางสิ่งที่ยกมาที่อื่น:
- เรื่องความสอดคล้องของอะตอม - ความสอดคล้องของกรดอาจเป็นข้อกำหนดของระบบ ข้างต้นไม่ได้โต้แย้งกับสิ่งนั้นจริง ๆ และคุณควรตระหนักว่าความสอดคล้องของกรดไม่ต้องการให้คุณใช้ตรรกะทางธุรกิจทั้งหมดของคุณภายในฐานข้อมูล ด้วยการย้ายรหัสซึ่งไม่จำเป็นต้องอยู่ในฐานข้อมูลคุณกำลังบังคับให้มันทำงานในสภาพแวดล้อมทางกายภาพของส่วนที่เหลือของฐานข้อมูล - มันเป็นการแข่งขันสำหรับทรัพยากรฮาร์ดแวร์เดียวกันกับส่วนการจัดการข้อมูลจริงของฐานข้อมูลของคุณ สำหรับการปรับขนาดรหัสออกไปยังเซิร์ฟเวอร์ฐานข้อมูลอื่น ๆ (แต่ไม่ใช่ข้อมูลจริง) - แน่นอนว่าอาจเป็นไปได้แต่สิ่งที่คุณได้รับตรงนี้นอกเหนือจากค่าลิขสิทธิ์เพิ่มเติมในกรณีส่วนใหญ่ เก็บสิ่งที่ไม่จำเป็นต้องอยู่บนฐานข้อมูลออกจากฐานข้อมูล
- Re: ประสิทธิภาพของ SQL / C # - เนื่องจากนี่เป็นหัวข้อที่น่าสนใจเรามาเพิ่มการสนทนากันสักหน่อย คุณสามารถเรียกใช้โค้ดเนทีฟ / Java / C # ในฐานข้อมูลได้ แต่เท่าที่ฉันรู้นั่นไม่ใช่สิ่งที่ถูกกล่าวถึงที่นี่ - เรากำลังเปรียบเทียบการใช้โค้ดแอปพลิเคชันทั่วไปในบางสิ่งเช่น T-SQL กับ C # มีปัญหาหลายอย่างที่แก้ไขได้ยากด้วยรหัสเชิงสัมพันธ์ในอดีต - พิจารณาปัญหา "การลงชื่อเข้าใช้พร้อมกันสูงสุด" ซึ่งคุณมีบันทึกที่ระบุการเข้าสู่ระบบหรือการออกจากระบบและเวลาและคุณต้องคิดออกว่า จำนวนผู้ใช้สูงสุดที่เข้าสู่ระบบในแต่ละครั้งคือ ทางออกที่ง่ายที่สุดที่เป็นไปได้คือการวนซ้ำระเบียนและเพิ่ม / ลดจำนวนตัวนับในขณะที่คุณพบการเข้าสู่ระบบ / ออกจากระบบและการติดตามสูงสุดของค่านี้อาจฉันไม่รู้) สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือเคอร์เซอร์ (โซลูชันเชิงสัมพันธ์ล้วนมีความซับซ้อนแตกต่างกันและพยายามที่จะแก้ปัญหาโดยใช้ขณะที่ลูปส่งผลให้ประสิทธิภาพแย่ลง) ในกรณีนี้ใช่แล้วโซลูชัน C # นั้นเร็วกว่าสิ่งที่คุณสามารถทำได้ใน T-SQL, ช่วงเวลา ที่อาจดูไกล แต่ปัญหานี้สามารถประจักษ์เองได้อย่างง่ายดายในระบบการเงินถ้าคุณกำลังทำงานกับแถวที่แสดงถึงการเปลี่ยนแปลงที่เกี่ยวข้องและจำเป็นต้องคำนวณการรวมตัวกันของหน้าต่าง การเรียกใช้ proc ที่จัดเก็บมีแนวโน้มที่จะมีราคาแพงกว่า - เรียกใช้ SP เล็กน้อยเป็นล้านครั้งและดูว่าการเปรียบเทียบกับการเรียกใช้ฟังก์ชัน C # ได้อย่างไร ฉันพูดถึงตัวอย่างอื่น ๆ ด้านบน - ฉันยังไม่พบใครใช้ตารางแฮชที่เหมาะสมใน T-SQL (อันที่ให้ประโยชน์บางอย่าง) ในขณะที่มันค่อนข้างง่ายที่จะทำใน C # อีกครั้งมีสิ่งที่ดีเลิศที่น่ากลัวและสิ่งที่พวกเขาไม่น่ากลัว เช่นเดียวกับที่ฉันไม่ต้องการเข้าร่วม SUMs และ GROUP BYs ใน C # ฉันไม่ต้องการเขียนอะไรโดยเฉพาะอย่างยิ่ง CPU ที่เข้มข้นใน T-SQL