Rumah >pangkalan data >tutorial mysql >Bagaimanakah EF 6 Interception Boleh Menyelesaikan Tamat Masa Pertanyaan Berterusan Disebabkan oleh Menghidu Parameter?

Bagaimanakah EF 6 Interception Boleh Menyelesaikan Tamat Masa Pertanyaan Berterusan Disebabkan oleh Menghidu Parameter?

DDD
DDDasal
2024-12-25 05:07:14964semak imbas

How Can EF 6 Interception Solve Persistent Query Timeouts Caused by Parameter Sniffing?

EF 6 Parameter Sniffing Solution: Mengatasi Tamat Masa Pertanyaan

Walaupun kecekapan SQL yang dihasilkan oleh pertanyaan LINQ kepada Entiti anda, pelaksanaannya melalui EF 6 mengalami tamat masa pertanyaan berterusan. Ini mungkin disebabkan oleh penghidu parameter, teknik pengoptimuman prestasi yang digunakan oleh enjin pangkalan data. Tetapi anda tidak boleh hanya menambah arahan "OPTION RECOMPILE" terus pada pertanyaan EF anda.

Penyelesaian: Gunakan EF Interception

EF 6 menawarkan ciri pemintasan yang membolehkan anda untuk memanipulasi arahan SQL sebelum ia dilaksanakan pada pangkalan data. Dengan melaksanakan DbCommandInterceptor tersuai, anda boleh menambah petunjuk pertanyaan, termasuk "OPTION RECOMPILE," pada arahan dalaman.

Berikut ialah pelaksanaan pemintas sedemikian:

public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        addQueryHint(command);
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        addQueryHint(command);
    }

    private static void addQueryHint(IDbCommand command)
    {
        if (command.CommandType != CommandType.Text || !(command is SqlCommand))
            return;

        if (command.CommandText.StartsWith("select", StringComparison.OrdinalIgnoreCase) &amp;&amp; !command.CommandText.Contains("option(recompile)"))
        {
            command.CommandText = command.CommandText + " option(recompile)";
        }
    }
}

Untuk menggunakan pemintas ini , cuma tambah baris berikut pada permulaan permohonan anda:

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

Ini akan memastikan bahawa semua arahan SQL yang dijana EF mempunyai pembayang "OPTION RECOMPILE" yang dilampirkan padanya, menghalang penghidu parameter dan meningkatkan prestasi pertanyaan.

Atas ialah kandungan terperinci Bagaimanakah EF 6 Interception Boleh Menyelesaikan Tamat Masa Pertanyaan Berterusan Disebabkan oleh Menghidu Parameter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn