it-swarm-korea.com

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

이에 대한 배경은 http://drupal.org/node/1067802 를 참조하십시오.

모든 것을 감안할 때 db_select ()를 사용하고 싶거나 db_query에만 의존 해야하는 상황은 무엇입니까?

69
Chris Cohen

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

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

  • 소위 Extenders 를 사용하려고합니다. 익스텐더의 예는 PagerDefault ( pager_query () 로 대체) 및 TableSort ( tablesort_sql () 로 대체)입니다. 이를 통해 SelectQuery에 추가 기능을 추가 할 수 있습니다. 사용자 정의 테이블의 데이터를 사용하여 호출기로 정렬 가능한 테이블을 만드는 방법은 무엇입니까? . 예 : node_page_default () .

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

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

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

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

88
Berdir

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

9
fietserwin

db_query() 에 대한 문서는 다음과 같습니다.

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

9
marcvangend