programing

변수 사용 시 느린 sql 문

goodjava 2022. 11. 11. 23:36

변수 사용 시 느린 sql 문

MariaDB 10.1.26에 대해 실행 중인 다음 SQL 문이 있으며, 최대 2.000개의 행으로 즉각적인 결과를 제공합니다.

select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00')) 
and datetime between '2018-11-01 00:00:00' and '2018-11-02 00:00:00';

datetime 필드에 변수와 함께 다음 문을 사용하면 실행 시간이 5.5초까지 걸립니다.

set @startdate = cast('2018-11-01 00:00:00' as datetime);
set @enddate = cast('2018-11-02 00:00:00' as datetime);
select value, datetime from Schuppen 
where (value = (select min(value) from Schuppen where (measure = 'temp') 
    and datetime between @startdate and @enddate)) 
and datetime between @startdate and @enddate;

데이터 행이 많을수록 문을 실행하는 데 시간이 더 오래 걸립니다.변수에 따라 진술의 동작이 달라지는 것 같습니다.

여기 무슨 일 있어?

MySQL Workbench를 사용하고 있으며 @variable은 특정 Atribute에 대해 서로 다른 테이블을 조회/검색하는 데 매우 유용합니다.저도 비슷한 문제에 부딪혔어요.다른 스레드를 훑어보고 다른 것을 시도한 후 @variable을 해당 변수를 검색하는 테이블 내의 컬럼과 정확히 동일한 유형 및 인코딩으로 설정하면 정상적으로 동작합니다.

예를 들어 다음과 같습니다.

SET @keyword = CONVERT(CAST("KEYWORD" AS CHAR(8)) USING ASCII);

이 경우 테이블의 고객 검색 컬럼 cname은 CHAR(8) 유형으로 ASC를 사용하여 인코딩됩니다.II:

SELECT * FROM CUSTOMERS WHERE cname=@keyword;

쿼리할 테이블이 여러 개 있는 경우(여기서 cname은 1개의 CHAR(10)과 다른 CHAR(8)))를 수행할 수 있습니다.

SET @keyword = "KEYWORD";
SELECT * FROM CUSTOMERS WHERE cname=CONVERT(CAST(@keyword AS CHAR(8)) USING ASCII);
SELECT * FROM EMPLOYEES WHERE cname=CONVERT(CAST(@keyword AS CHAR(10)) USING ASCII);

문제는 쿼리 옵티마이저가 변수를 사용할 때 적절한 인덱스를 찾지 못한다는 것입니다.이것은 이미 알려진 문제.

사용하시는 경우EXPLAIN두 쿼리 모두 차이를 알 수 있습니다.필요하지 않을 때는 변수를 피하도록 하십시오.

첫 번째 쿼리의 경우 옵티마이저는 선택된 값을 "See"하고 인덱스를 완전히 사용하여 선택한 범위를 보다 효율적으로 충족시킬 수 있다고 판단합니다.

두 번째 쿼리의 경우 옵티마이저는 범위를 정의하는 두 가지 값을 인식하지 못하고 대신 FULL SCAN으로 폴백하기로 결정합니다.

언급URL : https://stackoverflow.com/questions/53462728/slow-sql-statement-when-using-variables