>데이터 베이스 >MySQL 튜토리얼 >EF 6 동적 쿼리에서 매개 변수 스니핑을 방지하려면 어떻게 해야 합니까?

EF 6 동적 쿼리에서 매개 변수 스니핑을 방지하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-23 20:22:13438검색

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

EF 6의 매개변수 스니핑

Entity Framework 6(EF 6)에서 대규모 동적 쿼리를 처리할 때 성능 문제가 발생할 수 있습니다. 매개변수 스니핑으로 인해. 이는 EF 6이 전달된 초기 매개 변수를 기반으로 쿼리의 실행 계획을 캐시하여 매개 변수가 변경될 때 비효율적인 실행을 초래할 때 발생합니다.

매개 변수 스니핑 문제를 해결하는 한 가지 솔루션은 "OPTION RECOMPILE"과 같은 옵션을 포함하는 것입니다. SQL 명령에. 이는 쿼리가 실행될 때마다 데이터베이스가 실행 계획을 다시 컴파일하도록 암시합니다. 그러나 EF 6은 기본적으로 이러한 옵션 추가를 지원하지 않습니다.

해결책: EF 가로채기 기능

EF 6은 내부 SQL 명령을 조작할 수 있는 가로채기 기능을 제공합니다. 실행되기 전에. 이를 통해 "OPTION RECOMPILE"과 같은 옵션을 동적으로 포함할 수 있습니다.

이 기능을 활용하려면 사용자 정의 IDbCommandInterceptor 클래스를 생성할 수 있습니다. 예:

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)";
        }
    }
}

이 인터셉터를 사용하려면 애플리케이션 시작 부분에 다음 줄을 추가하기만 하면 됩니다.

DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

이 솔루션을 구현하면 매개변수 스니핑 및 EF 6에서 동적 쿼리 성능을 향상시키세요.

위 내용은 EF 6 동적 쿼리에서 매개 변수 스니핑을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.