Entity Framework ช้าเกินไป ตัวเลือกของฉันคืออะไร? [ปิด]


93

ฉันได้ทำตามมนต์ "Don't Optimize Prematurely" และเขียนโค้ดบริการ WCF ของฉันโดยใช้ Entity Framework

อย่างไรก็ตามฉันทำโปรไฟล์ประสิทธิภาพและ Entity Framework ช้าเกินไป (แอปของฉันประมวลผล 2 ข้อความในเวลาประมาณ 1.2 วินาทีโดยที่แอป (เดิม) ที่ฉันเขียนใหม่ทำ 5-6 ข้อความในเวลาเดียวกัน (แอปเดิมเรียก sprocs สำหรับการเข้าถึงฐานข้อมูล)

การทำโปรไฟล์ของฉันชี้ไปที่ Entity Framework โดยใช้เวลาส่วนใหญ่ต่อข้อความ

ตัวเลือกของฉันคืออะไร?

  • มี ORM ที่ดีกว่านี้ไหม
    (สิ่งที่รองรับการอ่านและเขียนวัตถุตามปกติและทำได้เร็ว .. )

  • มีวิธีทำให้ Entity Framework เร็วขึ้นหรือไม่?
    ( หมายเหตุ : เมื่อฉันพูดเร็วกว่าฉันหมายถึงในระยะยาวไม่ใช่การโทรครั้งแรก (การโทรครั้งแรกช้า (15 วินาทีสำหรับข้อความ) แต่นั่นไม่ใช่ปัญหาฉันแค่ต้องการให้มันเร็วเพื่อที่เหลือ ของข้อความ)

  • ตัวเลือกที่ 3 ลึกลับที่จะช่วยให้ฉันใช้บริการได้เร็วขึ้น

หมายเหตุ:การโต้ตอบ DB ส่วนใหญ่ของฉันคือการสร้างและอัปเดต ฉันเลือกและลบน้อยมาก


ฟังดูเหมือนว่า 'linq ช้า' คุณรู้ได้อย่างไรว่าเป็น EF? คุณได้รวบรวมข้อมูลการเปลี่ยนแปลงทั้งหมดของคุณแล้วหรือยัง?
Maess

6
คำตอบบางส่วนชี้ไปที่ข้อความค้นหา จากประสบการณ์ของฉันความช้าใน EF มีส่วนเกี่ยวข้องกับการสืบค้นเพียงเล็กน้อย แต่จะมีค่าใช้จ่ายในการทำให้เป็นจริงแทนและค่าใช้จ่ายเหล่านั้นมักจะเชื่อมโยงกับการติดตามการเปลี่ยนแปลงและผลกระทบต่ออินสแตนซ์ที่สร้างขึ้นอย่างไร น่าเสียดายที่ฉันไม่มีกระสุนเงินสำหรับคุณดังนั้นนี่จึงเป็นเพียงความคิดเห็น แต่ฉันขอแนะนำให้ดูว่าการทำโปรไฟล์เปิดเผยต้นทุนการผลิตที่สูงหรือไม่และหากเป็นเช่นนั้นให้ค้นคว้าว่าสามารถทำได้อย่างไรเกี่ยวกับค่าใช้จ่ายดังกล่าว
Anthony Pegram

@Maess - ฉันคิดว่าฉันระบุว่าฉันทำโปรไฟล์แล้วและพบว่ามันเป็น EF / DB ที่ช้า ไม่ว่าจะด้วยวิธีใดใช่ฉันทำ ฉันทำโปรไฟล์มันและเป็นการโต้ตอบ EF / DB ที่เป็นตัวการสำคัญ
Vaccano

@ แอนโธนี่ - การปรากฏตัวขึ้นเป็นครั้งแรกไม่ใช่หรือ ถ้าเป็นเช่นนั้นคุณคิดถูกว่ามันช้ามาก วิ่งครั้งแรกช้าสุด แต่ตามที่ฉันระบุฉันไม่กังวลกับเรื่องนั้นมากเกินไป เป็นปริมาณงานทั้งหมดที่เป็นปัญหา (ถ้านั่นไม่ใช่สิ่งที่เป็น Materialization ฉันจึงต้องทำการวิจัยเพื่อดูว่ามันเป็นสาเหตุของปัญหาของฉันหรือไม่)
Vaccano

1
@Vaccano ไม่การทำให้เป็นรูปธรรมเป็นกระบวนการในการรับข้อมูลจากฐานข้อมูลและสร้างอินสแตนซ์และเติมกราฟของวัตถุเพื่อแสดงข้อมูลนั้น ฉันไม่ได้พูดถึงประสิทธิภาพการทำงานครั้งแรกเนื่องจากโค้ดถูกกระตุก (หรือแม้กระทั่งในขณะที่ Sql Server อาจสร้างแผนการดำเนินการสืบค้น) แต่สิ่งที่เกิดขึ้นทุกครั้งที่คุณได้รับข้อมูลในรูปแบบของวัตถุ
Anthony Pegram

คำตอบ:


45

คุณควรเริ่มต้นด้วยการสร้างโปรไฟล์คำสั่ง SQL ที่ออกโดย Entity Framework ขึ้นอยู่กับการกำหนดค่าของคุณ (POCO, เอนทิตีการติดตามตนเอง) มีพื้นที่มากมายสำหรับการปรับให้เหมาะสม คุณสามารถดีบักคำสั่ง SQL (ซึ่งไม่ควรแตกต่างกันระหว่างโหมดดีบักและโหมดรีลีส) โดยใช้ObjectSet<T>.ToTraceString()เมธอด หากคุณพบข้อความค้นหาที่ต้องการการเพิ่มประสิทธิภาพเพิ่มเติมคุณสามารถใช้การคาดการณ์บางอย่างเพื่อให้ข้อมูลเพิ่มเติมกับ EF เกี่ยวกับสิ่งที่คุณพยายามทำให้สำเร็จ

ตัวอย่าง:

Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10

ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

สามารถแทนที่ด้วย:

var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

ฉันแค่พิมพ์ออกมาจากหัวดังนั้นนี่ไม่ใช่วิธีดำเนินการอย่างแน่นอน แต่ EF จะทำการเพิ่มประสิทธิภาพที่ดีหากคุณบอกทุกอย่างที่คุณรู้เกี่ยวกับข้อความค้นหา (ในกรณีนี้เราจะต้องใช้หมวดหมู่ - ชื่อ) แต่นี่ไม่เหมือนกับการโหลดอย่างกระตือรือร้น (db.Products.Include ("Categories")) เนื่องจากการคาดการณ์สามารถลดปริมาณข้อมูลที่จะโหลดได้


40
คำตอบนี้ฟังดูสมเหตุสมผลจนกว่าคุณจะทราบว่าประเภทที่ไม่ระบุตัวตนไม่สามารถเข้าถึงได้นอกเหนือจากวิธีการที่กำหนดไว้ หากคุณต้องการโหลดอ็อบเจ็กต์ที่ซับซ้อนและไม่เขียน megamoth คุณจะต้องแยกประเภทที่ไม่ระบุชื่อใหม่ของคุณออกเป็น POCO บางประเภท อีกครั้งที่เกือบจะฟังดูสมเหตุสมผลจนกว่าคุณจะรู้ว่าในการทำเช่นนั้นคุณจะต้องตอบแทนกรอบความร่วมมือของคุณเอง ซึ่งเป็นเรื่องไร้สาระ
ดั๊ก

5
สิ่งนี้ส่งผลให้ความเร็วเพิ่มขึ้น 15x-20x สำหรับฉัน
Dave Cousineau

12
คำตอบที่น่าสนใจและเป็นประโยชน์ยังคงใช้ได้ในภายหลัง @ Doug: ซึ่งไม่ใช่เรื่องไร้สาระจริงๆเนื่องจากคุณปรับให้เหมาะสม (โดยใช้การคาดการณ์) แบบสอบถามเพียงไม่กี่คำที่คุณต้องการใช้ประโยชน์เพิ่มเติม EF และ POCO ให้ค่าเริ่มต้นที่สมเหตุสมผลซึ่งดีมาก!
วิกเตอร์

2
@ Doug แอปพลิเคชันส่วนใหญ่มีโมเดลมุมมองสำหรับสถานการณ์ที่ดูอย่างเดียวใช่ไหม อาจทำแผนที่ได้มากพอ ๆ กับที่คุณดึงข้อมูลออกมา
Casey

4
ฉันเคยรู้สึกว่าออมคืออนาคต มันสมเหตุสมผลแล้วจนกระทั่งฉันเริ่มใช้มัน แล้วฉันได้พบDapper ตอนนี้เมื่อเห็นวิธีแก้ปัญหาเช่นนี้ฉันก็รู้สึกแย่กับความซับซ้อนที่เพิ่มขึ้นอย่างรวดเร็ว การเขียนบทคัดย่อ SQL ใน C # ไม่มีทางไปได้ตลอดชีวิต
Michael Silver

80

ความจริงของเรื่องนี้ก็คือผลิตภัณฑ์เช่น Entity Framework มักจะทำงานช้าและไม่มีประสิทธิภาพเนื่องจากมีการเรียกใช้โค้ดมากขึ้น

ฉันยังพบว่ามันโง่ที่มีคนแนะนำว่าควรเพิ่มประสิทธิภาพการสืบค้น LINQ ดู SQL ที่สร้างขึ้นใช้ debuggers รวบรวมล่วงหน้าทำตามขั้นตอนเพิ่มเติมมากมาย ฯลฯ เช่นเสียเวลามาก ไม่มีใครว่า - ลดความซับซ้อน! ทุกคนต้องการที่จะรวบรวมสิ่งต่าง ๆ เพิ่มเติมโดยทำตามขั้นตอนให้มากขึ้น (เสียเวลา)

แนวทางสามัญสำนึกจะไม่ใช้ EF หรือ LINQ เลย ใช้ SQL ธรรมดา มันไม่มีอะไรผิดปกติ เพียงเพราะมีความคิดในหมู่โปรแกรมเมอร์และพวกเขารู้สึกอยากใช้ผลิตภัณฑ์ใหม่ทุกชิ้นที่มีอยู่ไม่ได้หมายความว่าจะดีหรือจะได้ผล โปรแกรมเมอร์ส่วนใหญ่คิดว่าถ้าพวกเขารวมโค้ดใหม่ทุกชิ้นที่ออกโดย บริษัท ขนาดใหญ่มันจะทำให้พวกเขาเป็นโปรแกรมเมอร์ที่ฉลาดขึ้น ไม่เป็นความจริงเลย การเขียนโปรแกรมแบบสมาร์ทส่วนใหญ่เกี่ยวกับการทำสิ่งต่างๆให้มากขึ้นโดยให้ปวดหัวน้อยลงไม่แน่นอนและใช้เวลาน้อยที่สุด จำไว้ - เวลา! นั่นคือองค์ประกอบที่สำคัญที่สุดดังนั้นพยายามหาวิธีที่จะไม่เสียมันไปกับการแก้ปัญหาในโค้ดที่ไม่ดี / ป่องที่เขียนขึ้นเพื่อให้สอดคล้องกับ 'รูปแบบ' ที่แปลก ๆ

ผ่อนคลายสนุกกับชีวิตหยุดพักจากการเขียนโค้ดและหยุดใช้คุณสมบัติพิเศษรหัสผลิตภัณฑ์ "รูปแบบ" ชีวิตนั้นสั้นและอายุการใช้งานของโค้ดของคุณก็สั้นลงและไม่ใช่วิทยาศาสตร์จรวดอย่างแน่นอน ลบเลเยอร์เช่น LINQ, EF และอื่น ๆ และโค้ดของคุณจะทำงานได้อย่างมีประสิทธิภาพจะปรับขนาดและใช่มันจะยังคงดูแลรักษาได้ง่าย สิ่งที่เป็นนามธรรมมากเกินไปเป็น 'แบบแผน' ที่ไม่ดี

และนั่นคือวิธีแก้ปัญหาของคุณ


156
นี่คือการโยนทารกออกไปพร้อมกับอ่างน้ำ คุณเพิ่มประสิทธิภาพคอขวดมันโง่ที่จะโยน EF ออกไปเพราะมันช้าเกินไปในไม่กี่แห่งในขณะที่คนอื่น ๆ ส่วนใหญ่ทำงานได้เร็วมาก ทำไมไม่ใช้ทั้งสองอย่าง? EF จัดการกระบวนงานที่จัดเก็บไว้และ SQL ดิบได้ดี ฉันเพิ่งแปลงแบบสอบถาม LINQ-to-SQL ที่ใช้เวลา 10+ วินาทีเป็น SP ที่ใช้เวลา ~ 1 วินาที แต่ฉันจะไม่โยน LINQ-to-SQL ทั้งหมดออก ช่วยประหยัดเวลาได้มากในกรณีที่ง่ายกว่าโดยมีรหัสน้อยกว่าและมีพื้นที่สำหรับข้อผิดพลาดน้อยลงและแบบสอบถามได้รับการตรวจสอบคอมไพเลอร์และตรงกับฐานข้อมูล รหัสน้อยลงทำให้การบำรุงรักษาง่ายขึ้นและมีพื้นที่สำหรับข้อผิดพลาดน้อยลง
JulianR

12
โดยรวมแล้วคำแนะนำของคุณนั้นดี แต่ฉันคิดว่าไม่ถูกต้องที่จะละทิ้ง EF หรือนามธรรมอื่น ๆ เพราะคำแนะนำเหล่านี้ทำงานได้ไม่ดีถึง 10% ของเวลา
JulianR

50
SQL ธรรมดา = ดูแลรักษาง่าย? ไม่เป็นความจริงสำหรับแอปขนาดใหญ่ที่มีตรรกะทางธุรกิจมากมาย การเขียน SQL ที่ใช้ซ้ำได้ซับซ้อนไม่ใช่เรื่องง่ายที่จะทำ โดยส่วนตัวแล้วฉันมีปัญหาด้านประสิทธิภาพบางอย่างกับ EF แต่ปัญหาเหล่านี้ไม่ได้เปรียบเทียบกับประโยชน์ของ ORM ที่เหมาะสมในแง่ของ RAD และการทำให้สิ่งต่างๆแห้ง (หากมีความซับซ้อนในระดับใดก็ตามที่เกี่ยวข้อง)
MemeDeveloper

13
+ 10 ^ 100 นามธรรมมากเกินไปเป็น 'แบบแผน' ที่ไม่ดี
Makach

58
-1. "EF จะช้าและไม่มีประสิทธิภาพเสมอ" ฉันไม่เห็นว่าทำไมคุณถึงยืนยันว่าสิ่งนี้เป็นความจริงที่สมบูรณ์ การมีเลเยอร์มากขึ้นจะทำให้บางอย่างช้าลง แต่ความแตกต่างนั้นจะสังเกตเห็นได้หรือไม่นั้นขึ้นอยู่กับสถานการณ์เช่นปริมาณข้อมูลและประเภทของการสืบค้นข้อมูล สำหรับฉันแล้วนี่ก็เหมือนกับการพูดว่า 'C # จะช้าและไม่มีประสิทธิภาพเสมอ' เพราะมันเป็นนามธรรมที่สูงกว่า C ++ หลายคนเลือกที่จะใช้มันเนื่องจากผลผลิตที่ได้รับมากกว่าการสูญเสียประสิทธิภาพการชั่งน้ำหนัก (ถ้ามี) เช่นเดียวกับ EF
Despertar

37

คำแนะนำอย่างหนึ่งคือการใช้ LINQ กับ Entity Framework สำหรับคำสั่ง CRUD แบบบันทึกเดียวเท่านั้น

สำหรับการค้นหาที่เกี่ยวข้องมากขึ้นการค้นหารายงาน ฯลฯ เขียนขั้นตอนการจัดเก็บและเพิ่มเข้าไปในรูปแบบนิติบุคคล Framework ตามที่อธิบายไว้ใน MSDN

นี่เป็นแนวทางที่ฉันใช้กับไซต์ของฉันสองแห่งและดูเหมือนว่าจะเป็นการประนีประนอมที่ดีระหว่างผลผลิตและประสิทธิภาพ Entity Framework จะไม่สร้าง SQL ที่มีประสิทธิภาพสูงสุดสำหรับงานในมือเสมอไป และแทนที่จะใช้เวลาในการหาสาเหตุการเขียนขั้นตอนที่จัดเก็บไว้สำหรับการสืบค้นที่ซับซ้อนกว่านั้นช่วยประหยัดเวลาได้จริง เมื่อคุณคุ้นเคยกับกระบวนการนี้แล้วการเพิ่ม procs ที่จัดเก็บไว้ในโมเดล EF ของคุณก็ไม่ยุ่งยากมากนัก และแน่นอนว่าประโยชน์ของการเพิ่มลงในโมเดลของคุณก็คือคุณจะได้รับสิ่งดีๆที่พิมพ์มาจากการใช้ ORM


คุณมีความคิดเกี่ยวกับวิธีการที่ใช้ในการนั่งร้านเช่น db.athlete.find (id) เป็นต้นเปรียบเทียบกับ ADO.NET หรือ dapper อย่างไร ??
เป็นกับดัก

15

หากคุณกำลังดึงข้อมูลเพียงอย่างเดียวจะช่วยได้มากเมื่อคุณบอกให้ EF อย่าติดตามเอนทิตีที่ดึงข้อมูลมา ทำได้โดยใช้ MergeOption.NoTracking EF จะสร้างแบบสอบถามดำเนินการและยกเลิกการกำหนดค่าเริ่มต้นของผลลัพธ์ไปยังออบเจ็กต์ แต่จะไม่พยายามติดตามการเปลี่ยนแปลงเอนทิตีหรือสิ่งใด ๆ ในลักษณะนั้น หากแบบสอบถามนั้นเรียบง่าย (ใช้เวลาไม่นานในการรอฐานข้อมูลเพื่อส่งคืน) ฉันพบว่าการตั้งค่าเป็น NoTracking สามารถเพิ่มประสิทธิภาพการสืบค้นได้สองเท่า

ดูบทความ MSDN เกี่ยวกับ MergeOption enum:

การแก้ไขข้อมูลประจำตัวการจัดการสถานะและการติดตามการเปลี่ยนแปลง

ดูเหมือนจะเป็นบทความที่ดีเกี่ยวกับประสิทธิภาพของ EF:

ประสิทธิภาพและกรอบเอนทิตี


9
ก่อนที่ใครจะทำเช่นนี้อาจเป็นความคิดที่ดีที่จะอ่านที่นี่ stackoverflow.com/questions/9259480/…
leen3o

6

คุณบอกว่าคุณมีโปรไฟล์การสมัคร คุณมีประวัติออมด้วยหรือไม่? มีผู้สร้างโปรไฟล์ EF จาก Ayende ซึ่งจะเน้นจุดที่คุณสามารถเพิ่มประสิทธิภาพโค้ด EF ของคุณได้ คุณสามารถค้นหาได้ที่นี่:

http://efprof.com/

โปรดจำไว้ว่าคุณสามารถใช้แนวทาง SQL แบบเดิมควบคู่ไปกับ ORM ของคุณได้หากคุณต้องการเพิ่มประสิทธิภาพ

หากมี ORM ที่เร็วขึ้น / ดีขึ้น? ทั้งนี้ขึ้นอยู่กับรูปแบบวัตถุ / ข้อมูลของคุณคุณอาจจะพิจารณาใช้หนึ่งในไมโคร ORMs เช่นDapper , MassiveหรือPetaPoco

เว็บไซต์ Dapper เผยแพร่เกณฑ์มาตรฐานเชิงเปรียบเทียบที่จะทำให้คุณทราบว่าพวกเขาเปรียบเทียบกับ ORM อื่น ๆ อย่างไร แต่เป็นที่น่าสังเกตว่า micro-ORM ไม่รองรับชุดคุณลักษณะที่สมบูรณ์ของ ORM แบบเต็มเช่น EF และ NH

คุณอาจต้องการที่จะดูที่RavenDB นี้เป็นฐานข้อมูลที่ไม่สัมพันธ์ (จาก Ayende อีกครั้ง) ที่ช่วยให้คุณเก็บ POCOs โดยตรงกับไม่มีการทำแผนที่ที่จำเป็น RavenDB ได้รับการปรับให้เหมาะสมสำหรับการอ่านและทำให้ชีวิตของนักพัฒนาง่ายขึ้นมากโดยการลบความจำเป็นในการจัดการสคีมาและการแมปวัตถุของคุณกับสคีมานั้น อย่างไรก็ตามทราบว่านี้เป็นวิธีการที่แตกต่างกันอย่างมีนัยสำคัญกับการใช้วิธีการออมและเหล่านี้จะระบุไว้ในเว็บไซต์ของผลิตภัณฑ์


4

ฉันพบคำตอบโดย @Slauma ที่นี่มีประโยชน์มากสำหรับการเร่งความเร็ว ฉันใช้รูปแบบเดียวกันสำหรับทั้งส่วนแทรกและการอัปเดต - และประสิทธิภาพที่พุ่งสูงขึ้น


2

จากประสบการณ์ของฉันปัญหาไม่ได้อยู่ที่ EF แต่เป็นวิธีการของ ORM เอง

โดยทั่วไปแล้ว ORM ทั้งหมดจะประสบปัญหาN + 1 ที่ไม่ได้รับการปรับแต่งการสืบค้นและอื่น ๆ การคาดเดาที่ดีที่สุดของฉันคือการติดตามการสืบค้นที่ทำให้ประสิทธิภาพการทำงานลดลงและพยายามปรับแต่งเครื่องมือ ORM หรือเขียนส่วนนั้นใหม่ด้วย SPROC


2
มีคนคอยบอกฉันเรื่องนี้ แต่ฉันจะตั้งค่าคำสั่ง select ง่ายๆโดยใช้ ADO แบบเก่าและการเลือกแบบง่าย ๆ แบบเดียวกันโดยใช้บริบท EF และ EF นั้นช้ากว่ามาก ฉันอยากจะชอบ EF มาก แต่มันทำให้ชีวิตยากขึ้นแทนที่จะง่ายขึ้น
Sinaesthetic

1
@Sinaesthetic แน่นอนว่ามันช้าลง ในทำนองเดียวกันรหัสที่เขียนโดยใช้ Linq to Objects มักจะช้ากว่ารหัสที่เขียนโดยไม่มีมัน คำถามคือไม่จริงๆไม่ว่าจะเป็นเร็วขึ้นหรือเร็ว (ว่ามันอาจจะเป็นไปได้เมื่ออยู่ภายใต้ฝากระโปรงก็ยังคงมีการออกแบบสอบถามที่คุณกำลังออกด้วยมือ?) แต่ไม่ว่า 1) ก็ยังคงเร็วพอสำหรับความต้องการของคุณ 2) มันจะช่วยประหยัด คุณใช้เวลาเขียนโค้ด 3) ผลประโยชน์ชดเชยต้นทุน จากรายการเหล่านั้นฉันคิดว่า EF เหมาะสมกับโครงการมากมาย
Casey

@Sinaesthetic ฉันจะเพิ่มด้วยว่าหากคุณไม่ใช้ ORM สิ่งที่เกิดขึ้นบ่อยกว่านั้นไม่ใช่ว่าแบบสอบถาม SQL แต่ละรายการได้รับการปรับแต่งและปรับให้เหมาะสมที่สุด แต่แอปพลิเคชันจะจบลงด้วยการพัฒนาแบบออร์แกนิกภายในองค์กรไม่ดี - ได้รับการสนับสนุน ORM ที่มีประสิทธิภาพต่ำเว้นแต่ว่าทีมของคุณจะมีระเบียบวินัยเป็นพิเศษและมีความกังวลอย่างมากเกี่ยวกับประสิทธิภาพ
Casey

1

นี่เป็นอ็อพชันที่ไม่ใช่เฟรมเวิร์กแบบธรรมดาที่โหลดที่ 10,000 / วินาทีโดยมี 30 ฟิลด์หรือมากกว่านั้น ทำงานบนแล็ปท็อปเครื่องเก่าซึ่งอาจเร็วกว่านั้นในสภาพแวดล้อมจริง

https://sourceforge.net/projects/dopersistence/?source=directory


1

ฉันพบปัญหานี้เช่นกัน ฉันเกลียดการทิ้ง EF เพราะมันทำงานได้ดี แต่มันก็ช้า ในกรณีส่วนใหญ่ฉันแค่ต้องการค้นหาบันทึกหรืออัปเดต / แทรก แม้แต่การดำเนินการง่ายๆเช่นนี้ก็ช้า ฉันดึงข้อมูล 1100 รายการจากตารางกลับมาเป็นรายการและการดำเนินการนั้นใช้เวลา 6 วินาทีด้วย EF สำหรับฉันสิ่งนี้นานเกินไปแม้แต่การประหยัดก็ใช้เวลานานเกินไป

ฉันลงเอยด้วยการสร้าง ORM ของตัวเอง ฉันดึงข้อมูล 1100 รายการเดียวกันจากฐานข้อมูลและ ORM ของฉันใช้เวลา 2 วินาทีเร็วกว่า EF มาก ทุกอย่างที่มี ORM ของฉันเกือบจะในทันที ข้อ จำกัด เพียงอย่างเดียวในตอนนี้คือใช้งานได้กับ MS SQL Server เท่านั้น แต่สามารถเปลี่ยนให้ทำงานร่วมกับผู้อื่นเช่น Oracle ได้ ฉันใช้ MS SQL Server สำหรับทุกอย่างในตอนนี้

หากคุณต้องการลอง ORM ของฉันที่นี่คือลิงค์และเว็บไซต์:

https://github.com/jdemeuse1204/OR-M-Data-Entities

หรือหากคุณต้องการใช้นักเก็ต:

PM> ติดตั้งแพ็คเกจหรือ -M_DataEntities

เอกสารอยู่ที่นั่นเช่นกัน


0

ควรเพิ่มประสิทธิภาพหลังจากที่คุณทำโปรไฟล์แล้วเท่านั้น หากคุณพบว่าการเข้าถึง DB ช้าคุณสามารถแปลงเป็นการใช้โพรซีเดอร์ที่เก็บไว้และเก็บ EF หากคุณพบว่านั่นคือ EF ที่ช้าคุณอาจต้องเปลี่ยนไปใช้ ORM อื่นหรือไม่ใช้ ORM เลย


0

เรามีแอปพลิเคชันที่คล้ายกัน (Wcf -> EF -> ฐานข้อมูล) ที่ทำ 120 คำขอต่อวินาทีได้อย่างง่ายดายดังนั้นฉันมั่นใจว่า EF ไม่ใช่ปัญหาของคุณที่นี่ตามที่กล่าวไว้ฉันได้เห็นการปรับปรุงประสิทธิภาพครั้งใหญ่ด้วยการสืบค้นที่รวบรวม


98% ของรหัสของฉันคือสร้างและอัปเดตการโทร ฉันไม่รู้ว่ามันสร้างความแตกต่างหรือเปล่า แต่มันช้ากว่า 120 ต่อวินาทีมาก
Vaccano

ใช่นั่นจะไม่ใช่แอปพลิเคชันทั่วไปฉันขอแนะนำให้คุณกำหนดโปรไฟล์แอปพลิเคชันของคุณ สำหรับเรามันอ่านเป็นส่วนใหญ่ ...
np-hard

0

ฉันใช้ EF, LINQ เป็น SQL และ dapper Dapper เร็วที่สุด ตัวอย่าง: ฉันต้องการ 1,000 ระเบียนหลักโดยแต่ละระเบียนย่อย 4 รายการ ฉันใช้ LINQ เป็น sql ใช้เวลาประมาณ 6 วินาที จากนั้นฉันเปลี่ยนไปใช้ dapper เรียกข้อมูลชุดบันทึก 2 ชุดจากขั้นตอนที่เก็บไว้เดียวและสำหรับแต่ละระเบียนเพิ่มระเบียนย่อย เวลารวม 1 วินาที

นอกจากนี้กระบวนงานที่เก็บไว้ยังใช้ฟังก์ชันค่าตารางที่มีการใช้ข้ามฉันพบว่าฟังก์ชันค่าสเกลาร์ช้ามาก

คำแนะนำของฉันคือใช้ EF หรือ LINQ กับ SQL และสำหรับบางสถานการณ์ให้เปลี่ยนเป็น dapper


-1

Entity Framework ไม่ควรทำให้เกิดปัญหาคอขวดที่สำคัญ โอกาสที่จะมีสาเหตุอื่น ๆ คุณสามารถลองเปลี่ยน EF เป็น Linq2SQL ทั้งสองมีคุณสมบัติเปรียบเทียบและโค้ดควรแปลงได้ง่าย แต่ในหลาย ๆ กรณี Linq2SQL เร็วกว่า EF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.