2012-09-17 7 views
1

이 작동 :
SELECT * FROM aTable WHERE junk='foo bar';
이 영원히 중단 :
SELECT * FROM aTable WHERE junk~'foo bar';
이 영원히 중단 :
SELECT * FROM aTable WHERE junk~'foo b.*';
잘못 무엇입니까?정규식을 incorectly 데이터베이스에 사용하고 있습니까?

EDIT : SQL 쿼리가 제출되었지만 응답이 없습니다. 이 제공됩니까? 무한 루프, 잘못된 구문 등.

+2

구문이 잘못되면 오류가있는 즉시 응답이 생성됩니다. 그렇다고 잘못 작성된 재귀 적 CTE ('WITH RECURSIVE' 쿼리)와 같이 결코 반환하지 않는 쿼리를 가질 수도 있습니다. 대부분의 나쁜 쿼리는 시스템에 리소스가 부족한 경우 결국 실패하지만 영원히 실행될 쿼리를 작성할 수 있습니다. 유휴 트랜잭션에 의해 보유 된 잠금에서 차단 된 쿼리는 무기한으로 (또는 유휴 트랜잭션이 종료 될 때까지) 지연됩니다. BTW, 내가 말한대로 각 문장에 대해 '설명'결과를 검토 했습니까? 가치가있다. –

+0

왼쪽 고정 검색 용어를 찾으려면 그것을 표현해야합니다. * 많이 * 더 빨라질 것입니다 :'junk ~ '^ foo bar'', 색인으로 지원 될 수 있습니다. 가능하다면 일반적으로'LIKE'를 사용하십시오. 더 빨리, 아직. 이 [dba.SE 관련 질문] (http://dba.stackexchange.com/q/10694/3684) –

답변

2

아무 문제가 없습니다.

정규 표현식을 사용하는 2 개의 쿼리 중 어느 것도 인덱스를 사용하여 최적화 할 수 없습니다.

결과적으로 전체 스캔이 가능하므로 시간이 걸립니다.

2

세 개 모두 맞지만 EXPLAIN을 사용하여 쿼리 계획을 검사하면 계획이 매우 다르다는 것을 알 수 있습니다.

this SQLFiddle- 다른 실행 시간을 참조하십시오. "보기 실행 계획"을 사용하여 쿼리 계획을 검사하십시오.

=은 단일 값에 대해 b-tree 인덱스 조회를 사용하고 있습니다. ~ 버전은 순차적 스캔을 수행하고 있습니다. 그것은 모든 단일 행에 대해 정규식을 시도해야합니다.

Handily 나는 다른 포스트에 대한 답변으로 이것에 대해 썼습니다. this answer에서 LIKESIMILAR TO은 접두사 일치에 적절히 생성 된 색인을 사용할 수 있지만 ~은 사용할 수 없다고 설명합니다.

CREATE INDEX atable_junk_txt_idx ON aTable(junk text_pattern_ops)과 같은 색인을 작성한 다음 LIKE 'foo b%'을 사용해보십시오.

모든 추가 색인은 삽입, 업데이트 및 삭제 때마다 속도가 느려지므로 색인을 만들 필요가 없습니다.

Pg 위키의 Using explain을 참조하십시오.

관련 문제