Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengelakkan Menghidu Parameter dalam Pertanyaan Dinamik EF 6?

Bagaimanakah Saya Boleh Mengelakkan Menghidu Parameter dalam Pertanyaan Dinamik EF 6?

Linda Hamilton
Linda Hamiltonasal
2024-12-23 20:22:13438semak imbas

How Can I Avoid Parameter Sniffing in EF 6 Dynamic Queries?

Parameter Menghidu dalam EF 6

Apabila berurusan dengan pertanyaan dinamik yang besar dalam Rangka Kerja Entiti 6 (EF 6), anda mungkin menghadapi masalah prestasi disebabkan oleh parameter menghidu. Ini berlaku apabila EF 6 menyimpan cache pelan pelaksanaan pertanyaan berdasarkan parameter awal yang diluluskan, mengakibatkan pelaksanaan tidak cekap apabila parameter berubah.

Satu penyelesaian untuk menangani penghidu parameter adalah dengan membenamkan pilihan seperti "OPTION RECOMPILE" ke dalam arahan SQL. Ini membayangkan pangkalan data untuk menyusun semula rancangan pelaksanaan setiap kali pertanyaan dilaksanakan. Walau bagaimanapun, EF 6 tidak menyokong penambahan pilihan sedemikian secara asli.

Penyelesaian: Ciri Pemintasan EF

EF 6 menyediakan ciri pemintasan yang membolehkan anda memanipulasi arahan SQL dalamannya sebelum mereka dihukum bunuh. Ini membolehkan anda membenamkan pilihan seperti "OPTION RECOMPILE" secara dinamik.

Untuk menggunakan ciri ini, anda boleh mencipta kelas IDbCommandInterceptor tersuai. Contohnya:

public class OptionRecompileHintDbCommandInterceptor : IDbCommandInterceptor
{
    // Add "OPTION RECOMPILE" hint to SQL commands before execution
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> 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) && !command.CommandText.Contains("option(recompile)"))
        {
            command.CommandText = command.CommandText + " option(recompile)";
        }
    }
}

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

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

Dengan melaksanakan penyelesaian ini, anda boleh mengelak daripada menghidu parameter dan meningkatkan prestasi pertanyaan dinamik anda dalam EF 6.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelakkan Menghidu Parameter dalam Pertanyaan Dinamik EF 6?. 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