2017-09-27 10 views
0
SELECT 
    XYZ_ID 
FROM XYZ 
WHERE 
    SUBSTR(Processor_Key, 24, 5) = '01000' AND 
    SUBSTR(Processor_Key, 32, 5) = '00900' AND 
    SUBSTR(Processor_Key, 40, 5) = '00070' AND 
    SUBSTR(Processor_Key, 48, 5) = '10000' AND 
    SUBSTR(Processor_Key, 56, 5) = '66000' AND 
    SUBSTR(Processor_Key, 64, 5) = '09000' AND 
    SUBSTR(Processor_Key, 72, 5) = '00050'; 

쿼리를 최적화하고 쿼리 비용을 줄이는 방법은 무엇입니까?SUBSTR로 쿼리를 최적화하는 방법

+4

substr을 제거하십시오. 필요하지 않은 방식으로 데이터를 저장하십시오. 또는 응용 프로그램 코드에서 데이터 처리를 처리하십시오. 그렇지 않으면, 당신은 꽤 많이 붙어 있습니다. – Strawberry

+0

데이터는 사용자가 어디에서든지 사용할 수 있습니다. 응용 프로그램 데이터 처리가 불가능하며 여기에 더미 데이터 만 추가했습니다. – user8413514

답변

3

을 downvoted 될 위험이 높은,하지만 하나의 LIKE 표현으로 많은 SUBSTR 통화를 대체하는 것입니다 작동 할 한 가지 :

SELECT XYZ_ID 
FROM XYZ 
WHERE 
    Processor_Key LIKE '_______________________01000___00900___00070___10000___66000___09000___00050%'; 

이 능가 할 수있는 이유는 원래 쿼리입니다 LIKE 표현이 프로세서 키의 처음 77 문자를 최대 하나의 단일 패스로 만들어 평가할 수 있습니다. 원래 쿼리에서 결정을 내리기 위해 각각을 평가해야 할 수도있는 SUBSTR에 대해 7 가지의 다른 호출을합니다.

@Gordon과 위의 의견에서 지적한 것처럼, 장기적인 해결책은 키를 개별 열로 나누고 각 키를 인덱싱하는 것일 수 있습니다. 이렇게하면 데이터베이스의 모든 기능을 활용할 수 있습니다 (예 : 색인 생성을 통해.

1

수 없습니다. SQL 엔진은이 쿼리에 전통적인 인덱스를 사용할 수 없습니다.

어떤 옵션이 있습니까? 문자열이 실제로 어떻게 보이는지에 따라 전체 텍스트 검색을 사용할 수 있습니다.

또는 코드를 별도의 열로 끌어 와서 해당 열에 인덱스를 만들 수도 있습니다. 아마도 코드는 실제로 의미가 있습니다. 삽입시이 작업을 명시 적으로 수행하거나 트리거를 사용하여 열을 채울 수 있습니다.

또 다른 대안은 최신 버전의 MySQL에서 사용할 수 있습니다. 각 하위 문자열에 대해 생성 된 열을 생성 한 다음 색인을 생성 할 수 있습니다.