รายการส่วนเฟรมเวิร์ก Arithabort อยู่แต่ยังคงค้นคือช้า

0

คำถาม

ฉันมีเรียบง่าย query

var count =  await _context.ExchangeRate.AsNoTracking().CountAsync(u => u.Currency == "GBP");

โต๊ะมีแค่ 3 คอลัมน์และ 10 อยละของแถวสำรองข้อมูลออกมา

ตอนที่ฉันพยายามที่จะประมวลผลการสืบค้นอกจากจัก 5 โครงการมันคือการ 2.3 วินาทีสำหรับครั้งแรกและ 500ms(+-100)สำหรับต่อมาขอร้องให้. ตอนที่ฉันเจอที่เดียวกับการร้องขอใน SSMS มันเป็นคืนอยู่เกือบจะไม่มีเวลา(45ms ย่างที่เห็นในภาษา sql วิเคราะห์พฤติกรรม).

ฉันต้องการจัดเตรียมไว้ ARITHABORT ใน EF จาก ที่นี่

ตอนที่ฉันเห็นในภาษา sql วิเคราะห์พฤติกรรมมันเป็นการตั้งค่า ARITHABORT อยู่แต่ยังคงสืบค้นต้องใช้เวลาเดียวกันสำหรับคนแรกการร้องขอฟวิ่งแอนด์โลนแต่พลาดและโดนร้องขอไป

sql profiler screen shot

ยังไงฉันก็จะประสบความสำเร็จในส่วความเร็วเหมือนกับ SSMS query ต้องใช้ความเร็วที่มากมาย ฉันต้องการสืบค้นที่จะหนีไปจริงความเร็วของฉันโครงการมีสำคัญที่สุต้องการกลับมาตอบสนองใน 1 วินาที(จำเป็นต้องทำให้ atleast 5 ง่าย DB โทรหา..ถ้า 1 เรียกใช้ 500ms แล้วมันเป็นการข้าม 1 วินาทีสำคัญที่สุ)

แก้ไข

พยายามกับแม้แต่ ADO.Net. การประหารงเวลาไปตามที่เห็นในภาษา sql วิเคราะห์พฤติกรรมคือ 40ms ที่ไหนที่เมื่อมันถึงรหัสมันคือเกือบจะ 400ms. ดังนั้นมันจะแตกต่างนักหนาเลย

        using (var conn = new SqlConnection(connectionString))
        {
            var sql = "select count(ExchangeRate) as cnt from ExchangeRate  where Currency = 'GBP'";

            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "SET ARITHABORT ON; " + sql;
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            conn.Open();
            var t1 = DateTime.Now;
            var rd =  cmd.ExecuteReader();
            var t2 = DateTime.Now;
            TimeSpan diff = t2 - t1;

           Console.WriteLine((int)diff.TotalMilliseconds);
          
          while (rd.Read())
          {
               Console.WriteLine(rd["cnt"].ToString());
          }
            conn.Close();
        }
1

คำตอบที่ดีที่สุด

0

ของคุณ"ทำงานครั้งแรก@title"สร้างสถานการณ์จำลองคือโดยปกติแล้วคนหนึ่งออกในรูปของไฟฟ้าสถิตย์ initialization ของ DbContext. นี่คือที่ที่พวก DbContext ทำงานออกของมัน mappings สำหรับครั้งแรกและก็จะเกิดขึ้นตอนแรกกับการค้นหาคือประหาร รอความช่วยเหลือจากเข้าไปเพื่อหลีกเลี่ยงมัน occurring สำหรับผู้ใช้ที่จะง่ายอย่าง"อุ่นขึ้นอยู่"กับการค้นหาว่าวิ่งหนีตอนที่บริการเริ่มขึ้น..สำหรับตัวอย่างหลังจากบริการของคุณ initializes ย่างง่ายดายเพียงต้องใส่อะไรบางอย่างเหมือนต่อไปนี้:

// Warm up the DbContext
using (var context = new AppDbContext())
{
    var hasUser = context.Users.Any();
}

นี่ยังเสิร์ฟเป็นด่วนเริ่มต้นตรวจสอบว่าฐานข้อมูลคือ reachable และตอบสนอง. การสืบค้นตัวมันเองจะทำมาอย่างเร็วปฏิบัติการแต่ง DbContext จะแก้ไขมัน mappings ตอนนี้ดังนั้นพใหม่ที่ถูกสร้าง DbContext โหจะตอบสนองโดยไม่มี incurring ที่ใช้ระหว่างอยากขอให้ช่วยอะไรหน่อย

สำหรับดิบการแสดงถ้ามันยังไม่มีการนั่นต้องใช้เวลาสักพักแล้วมัดเป็นการร้องขอ, อย่า ทำให้มัน async. Asynchronous ขอร้องให้เป็น ไม่ เร็วพวกเขาเป็นจริงค่อนช้าลง ใช้ async ขอร้องให้ต่อต้านค DbContext เป็นเรื่อง ensuring ของคุณเว็บเซิร์ฟเวอร์/โปรแกรมด้านคือตอบสนองได้แล้ตอนอาจแพงฐานข้อมูลปฏิบัติการกำลังจัดการอยู่ ถ้าคุณต้องการการตอบสนองให้เร็วที่สุดเท่าที่เป็นไปได้ใช้ synchronous โทรมา

ต่อให้แน่ใจว่ามันมีช่องข้อมูลคุณกำลังกรองต่อในกรณีนี้นเงินตราต่างประเทศเป็นสร้างดัชนีค้นหา. มีสนามเรียกว่าสัญลักษณ์ของเงินตราของคุณอยู่ในรายการที่มีข้อความแทนที่จะเป็น CurrencyId FK(int)ชี้ให้เป็นสัญลักษณ์ของเงินตราประวัติอยู่แล้วเป็นพิเศษกำลังทำดัชนีรายการใช้จ่ายที่ indexes บ integers นเล็กลง/เร็วกว่าพวกนั้นบนเชือก.

คุณยังไม่ต้องการจะรบกวกับ AsNoTracking เมื่อใช้เป็น Count กับการค้นหา. AsNoTracking ใช้กับฝืตอนที่คุณกำลัง entities(ToList/ToArray/Single/Firstเป็นต้น) เพื่อหลีกเลี่ยงมี DbContext ถือไปยังเป็นการอ้างอิงไปที่กลับมารายการ. ตอนที่คุณใช้ Count/Any หรือภาพจะกลับมาคุณสมบัติจาก entities ใช้ Select ไม่มีรายการกลับมาเพื่อเธอสามารถพิสูจน์ได้

ยังคิดถึงเครือข่าย latency ระหว่างที่โปรแกรมของคุณรหัสกำลังทำงานอยู่และปลอกฐานข้อมูลเซิร์ฟเวอร์ พวกเขาเหมือนเครื่องหรือมีการเชื่อมต่อระบบเครือข่ายอยู่ในเล่นเหรอ? ยังไงนี้เปรียบเทียบตอนที่คุณกำลังแสดงเป็น SSMS query? ใช้วิเคราะห์พฤติกรรมคุณสามารถเห็นอะไรภาษา sql EF ที่จริงแล้วส่งไปจากฐานข้อมูลเหมือนกัน ทุกอย่างอยู่ในเงื่อนไขของเวลาเป็นต้นทุนของ:ได้สิ่งที่ร้องขอมาต้องการให้ DB ได้ผลลัพธ์จากข้อมูลกลับไปที่ requester,กำลังวิเคราะห์นั้นการตอบสนองเลย (ถ้าในกรณีที่คุณกำลัง entities,allocating,populating รวจสอต่อที่มีอยู่จะอ้างอิงไปยังเป็นต้...ในกรณีของนับเป็นต้น เช็คที่มีอยู่จะอ้างอิงไปยัง)

Lastly เพื่อให้แน่ใจว่าคุณเริ่มที่ได้เล่นเต็ม,แน่ใจว่าคุณ DbContexts lifetimes คือให้สั้นๆ ถ้าเป็น DbContext เป็นยังเปิดและมีจำนวนของติดตามค้นข้อมูลที่หนีต่อต้านใน(การเลือกโดยไม่มี entities AsNoTracking)พวกนั้นตามรายการจะอ้างอิงไปยัง accumulate และสามารถลบการแสดงค่ำคืนที่ลืมไม่ลงสำหรับอนาคตบค้นข้อมูลถึงแม้ว่าคุณใช้ AsNoTracking เป็น EF นดูจะตรวจสผ่านมันตามรอยจะอ้างอิงไปยังสำหรับ entities นั่นอาจเป็นกปรับใช้จะ/เกี่ยวข้องกับใหม่ของคุณค้นข้อมูล. หลายครั้งแล้วฉันเห็นกลุ่มผู้พัฒนามเดาว่า DbContexts คือ"แพง"ดังนั้นพวกเขา opt จะ instantiate พวกเขาบอกให้น้อยที่สุดเท่าที่ทำได้เพื่อหลีกเลี่ยงพวกนั้นต้องใช้เงินมากแค่เพียงเพื่อจบการทำปฏิบัติการมากกว่าแพงมาตลอดเวลา

กับเรื่องทั้งหมดที่พิจารณามันถี่ถ้วนแล้วยัง,EF จะไม่ เร็วที่สุด เท่าที่ดิบภาษา sql. มันเป็น ORM อร์สฝึกถูกออกแบบมาเพื่อให้มันผิดธรรมเนียมต่อศานอข่ายนอกโปรแกรมเมื่อมันมาพร้อมที่จะทำงานกับข้อมูล มันสะดวกซื้อพร้อมในการทำงานกับรายการเรียนมากกว่า sanitizing และงานเขียนของตัวเองดิบภาษา sql ทุกครั้งมักมีราคาสูงเสมอ

2021-11-23 21:59:24

เท่าที่ความเห็นของเธอเกี่ยวกับเครือข่าย latency ทั้งสอง SSMS&ส่งรหัสเป็นของฉันเครื่อง..db อยู่ในเซิร์ฟเวอร์...และสำหรับอีกเรื่องนึงที่ฉันต้องเดียวกับการค้นหา(นี่คือ POC). ดังนั้นกับเดียวกันบนเครือข่าย latency SSMS สามารถดึงใน 40ms อยู่ไหนเหมือข่ายนอกรหัสคือกา 500ms.....แม้แต่พยายามกัน ADO.NET เท่าที่เห็นอยู่ในคำถามทั้งสองกำลัง 500ms
CrazyMonk

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่