동적 SQL-EXEC (@SQL) 대 EXEC SP_EXECUTESQL (@SQL)
SQL Server의 저장 프로 시저에서 동적 SQL 명령을 실행하는 실제 장단점은 무엇입니까?
EXEC (@SQL)
대
EXEC SP_EXECUTESQL @SQL
?
sp_executesql
쿼리 계획 재사용을 촉진 할 가능성이 더 높습니다. 를 사용할 때 sp_executesql
매개 변수는 호출 서명에서 명시 적으로 식별됩니다. 이 훌륭한 기사는이 과정을 설명합니다 .
동적 SQL의 여러 측면에 대해 자주 인용되는 참조는 Erland Sommarskog의 필독서 : " The Curse and Blessings of Dynamic SQL "입니다.
SP_EXECUTESQL의 가장 큰 점은 SQL 인젝션에 관심이있는 경우 매우 유용한 매개 변수화 된 쿼리를 생성 할 수 있다는 것입니다.
Microsoft의 Using sp_executesql 기사에서는 sp_executesql
대신 execute
문을 사용할 것을 권장 합니다.
이 저장 프로 시저가 매개 변수 대체를 지원하기 때문에 sp_executesql은 EXECUTE보다 더 다양합니다. sp_executesql은 SQL Server에서 재사용 할 가능성이 높은 실행 계획을 생성하기 때문에 sp_executesql 이 EXECUTE 보다 효율적 입니다.
따라서 요약 : 문을 사용하지 마십시오execute
. 사용 sp_executesql
.
요즘에는 항상 sp_executesql을 사용합니다. 실제로 매개 변수와 변수를 처리하는 EXEC 용 래퍼입니다.
그러나 매우 큰 데이터베이스에서 쿼리를 조정할 때 OPTION RECOMPILE을 잊지 마십시오. 특히 데이터가 둘 이상의 데이터베이스에 걸쳐 있고 CONSTRAINT를 사용하여 인덱스 스캔을 제한하는 경우에 그렇습니다.
OPTION RECOMPILE을 사용하지 않는 한 SQL Server는 쿼리에 대해 "하나의 크기에 맞는"실행 계획을 만들려고 시도하고 실행될 때마다 전체 인덱스 스캔을 실행합니다.
이것은 탐색보다 훨씬 덜 효율적이며 잠재적으로 쿼리하지 않는 범위로 제한된 전체 인덱스를 스캔하고 있음을 의미합니다.
- 변수 선언
- 명령으로 설정하고 sp의 매개 변수 값 사용과 같은 동적 부분을 추가하십시오 (여기서 @IsMonday 및 @IsTuesday는 sp 매개 변수입니다)
명령을 실행
declare @sql varchar (100) set @sql ='select * from #td1' if (@IsMonday+@IsTuesday !='') begin set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )' end exec( @sql)
참고 URL : https://stackoverflow.com/questions/548090/dynamic-sql-execsql-versus-exec-sp-executesqlsql
'programing tip' 카테고리의 다른 글
JVM의 JIT 컴파일러가 벡터화 된 부동 소수점 명령어를 사용하는 코드를 생성합니까? (0) | 2020.09.06 |
---|---|
config / environments / development.rb에서“consider_all_requests_local”의 목적은 무엇입니까? (0) | 2020.09.06 |
Javascript 배열이 희소합니까? (0) | 2020.09.06 |
IllegalArgumentException은 언제 발생해야합니까? (0) | 2020.09.06 |
Xcode 4에서 인덱싱을 비활성화하는 방법은 무엇입니까? (0) | 2020.09.06 |