db_select가 db_query보다 훨씬 느리다면 왜 사용하고 싶습니까?


답변:


88

SelectQuery를 사용해야하는 5 가지 이유가 있습니다.

  • 다양한 조건, 조인, 필드 등으로 동적 쿼리를 작성하고 있습니다. 예제는 field_read_fields () 를 참조하십시오 .

  • 소위 Extenders 를 사용하려고합니다 . 익스텐더의 예는 PagerDefault ( pager_query () 대신 ) 및 TableSort ( tablesort_sql () 대신 )입니다. 이를 통해 SelectQuery에 추가 기능을 추가 할 수 있습니다. 사용자 정의 테이블의 데이터를 사용하여 호출기로 정렬 가능한 테이블을 작성하는 방법 도 참조하십시오 . . 예 : node_page_default () .

  • 다른 모듈이 쿼리를 변경하도록 허용하려고합니다. 그런 다음 소위 태그를 추가하면 SelectQuery가 해당 태그에 대한 해당 변경 후크를 자동으로 호출합니다. 내 Privatemsg 모듈을 사용하여 이것에 크게 의존하고 있습니다 (이미 D6에서 사용자 정의 쿼리 작성기를 사용하여 이미 수행했습니다).

  • node_access 시스템을 사용하여 노드 만 표시하려면 사용자가 볼 수 있어야합니다. 'query_access'태그를 $ query에 추가하십시오. db_rewrite_sql ()을 대체합니다.

  • SelectQuery에는 지원되는 모든 데이터베이스에서 코드가 동일하게 작동하도록하는 몇 가지 기능이 있습니다. 예를 들어 SelectQuery :: orderRandom ()이 있습니다. LIKE 조건이있는 경우-> condition ( 'field', $ value, 'LIKE')는 항상 대소 문자를 구분하지 않는 비교가되도록합니다. D6에서는 속도가 훨씬 느린 LOWER ()를 사용해야했습니다. 그러나 AFAIK, 현재이 둘 이상은 없습니다.

이러한 이유 중 어느 것도 특정 사례에 적용되지 않으면 db_query ()를 사용하십시오.


1
orderRandom () 및 대소 문자를 구분하지 않는 LIKE와 같은 데이터베이스 이식성 기능을 다섯 번째로 추가했습니다.
Berdir

6
여섯 번째 이유는 데이터베이스 간 호환성을 추가하는 것입니다. 예를 들어, Oracle 쿼리는 MySQL, Postgres 등과는 다른 방식으로 구문이 다릅니다. db_select ()에서 올바른 구문을 생성하는 코드를 작성하는 것이 오라클과 호환되지 않는 쿼리 코드보다 훨씬 쉽습니다. db_query ()에 직접 덤프됩니다.
BrianV

9

에 관한 문서는db_query() 말합니다 :

단순한 쿼리 문자열 인 경우 SELECT 쿼리에이 함수를 사용하십시오. 호출자 또는 다른 모듈이 조회를 변경해야하는 경우 대신 db_select ()를 사용하십시오.


고마워,하지만 그것은 구체적이지 않다. '단순 쿼리 문자열'의 정의는 해석하기에 매우 개방적입니다. 6 조인으로 4 개의 테이블을 선택하는 경우 여전히 간단한 쿼리입니까, 아니면 db_select () 대신 수행해야합니까?
Chris Cohen

3
"단순 쿼리"에 관한 것이 아니라 "단순 쿼리 문자열 " 에 관한 것인데 단순하다는 것은 실제로 하드 코딩되어 있고 동적이 아니라는 것을 의미합니다. 자세한 내용은 내 답변을 참조하십시오 :)
Berdir

9

작은 성능 향상에 비해 가독성, 유지 관리 성 및 데이터베이스 간 호환성을 선호하므로 항상 db_select를 사용합니다. 또한, 언급 한 문제에 주어진 숫자는 전반적인 성능의 잘못된 이미지를 제공한다고 생각합니다. 우리는 하나 이상의 열을 반환 할 때 종종 밀리 초 범위에서 실행되는 쿼리에 대해 300 마이크로 초 차이를 이야기하고 있습니다. 그리고 1 회만 오버 헤드 (클래스 로딩)가 있고 전체 (페이지) 요청의 차이가 훨씬 적더라도 놀라지 않을 것입니다.


성능 차이는 그렇게 간단하지 않습니다. db_query 및 db_select 성능 비교를 참조 하십시오 . Berdir의 답변에 언급 된 특수 기능 중 하나가 필요하지 않은 경우 일반적으로 db_select보다 db_query를 권장합니다.
geerlingguy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.