Django ORM에서 select_related와 prefetch_related의 차이점은 무엇입니까?
장고 문서에서는
select_related()
쿼리 실행 시 추가 관련 객체 데이터를 선택하여 "외부 키 관계"를 선택합니다.
prefetch_related()
는 각 관계에 대해 개별 조회를 수행하고 Python에서 "joining"을 수행합니다.
'파이썬에서 결합을 한다'는 것은 무슨 뜻입니까?예를 들어 설명해주실 수 있나요?
키 에는, 「외부 키」를 으로 알고 .select_related
의 관계에 「M2M」을 사용해 prefetch_related
맞습니까거맞 ??
당신의 이해는 대부분 옳습니다.은 you 다 you you youselect_related
때, 즉 '하나의 오브젝트 '하나의 오브젝트', '하나의 오브젝트'입니다.OneToOneField
★★★ForeignKey
를 사용합니다.prefetch_related
'일정'은 '일정'은 '일정'은 '일정'은 '일정'은 '일정'은 아니다.ManyToManyField
reverse의 "s"를 지정합니다.ForeignKey
'의를 명확히 위해서입니다.ForeignKey
는 예를 들어 과 같습니다. s"면 되다.
class ModelA(models.Model):
pass
class ModelB(models.Model):
a = ForeignKey(ModelA)
ModelB.objects.select_related('a').all() # Forward ForeignKey relationship
ModelA.objects.prefetch_related('modelb_set').all() # Reverse ForeignKey relationship
점은 '하다'는 것입니다.select_related
는 SQL에 가입하기 때문에 SQL Server에서 테이블의 일부로 결과를 반환합니다. prefetch_related
한편, 다른 쿼리를 실행하여 원래 오브젝트의 용장 컬럼을 줄입니다(ModelA
★★★★★★★★★★★★★★★★★★★★★」 하면 .prefetch_related
할 수 select_related
참조해 주세요.
은 ''는 것이다.prefetch_related
서버에 하기 위해서 ID 가 있습니다.이다소 수 있습니다.이 작업은 다소 시간이 걸릴 수 있습니다.거래에서 좋은 방법이 있을지는 모르겠지만, 장고는 항상 리스트를 보내고 SELECT...라고 말하는 것으로 알고 있습니다.WHERE PK IN (..........) : PK IN (......) 。이 경우 프리페치된 데이터가 희박한 경우(예를 들어 사람들의 주소에 링크된 미국 주(州) 오브젝트)는 매우 좋지만, 일대일에 가까우면 통신에 많은 시간을 낭비할 수 있습니다.확실하지 않은 경우 둘 다 시도해 보고 어느 쪽이 더 나은지 확인하십시오.
위에서 설명한 내용은 기본적으로 데이터베이스와의 통신에 관한 것입니다., Python 에서는 Python을 사용합니다.prefetch_related
에는 데이터베이스의 각 개체를 나타내기 위해 단일 개체를 사용할 수 있다는 추가적인 이점이 있습니다.★★★★★★★★★★★★★★★★ select_related
파이톤이라는 곡입니다.Python의 오브젝트에는 메모리 오버헤드가 꽤 있기 때문에 이것도 고려할 수 있습니다.
두 방법 모두 동일한 목적을 달성하여 불필요한 DB 쿼리를 제거합니다.그러나 효율성을 위해 서로 다른 접근 방식을 사용합니다.
이러한 방법 중 하나를 사용하는 유일한 이유는 하나의 큰 쿼리가 많은 작은 쿼리보다 더 나은 경우입니다.Django는 데이터베이스에 대해 온 디맨드 쿼리를 실행하는 대신 대용량 쿼리를 사용하여 메모리 내에 모델을 미리 만듭니다.
select_related
는 각 조회에 대해 조인을 수행하지만 조인된 모든 테이블의 열을 포함하도록 선택 영역을 확장합니다.아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.
조인에는 쿼리의 행 수를 곱할 수 있습니다.외부 키 또는 일대일 필드에서 가입을 수행할 경우 행 수는 증가하지 않습니다.,, 대대대 대, 대, 대, 대, 대, 대장고는 래 restricts so so so so so so so so so so so so를 제한하고 있습니다.select_related
예상외로 대규모 가입으로 이어지지 않는 관계에서요
의 "파이썬에 가입"prefetch_related
명령어는.조인할 각 테이블에 대해 개별 쿼리를 만듭니다.WHERE IN 절을 사용하여 다음과 같은 각 테이블을 필터링합니다.
SELECT "credential"."id",
"credential"."uuid",
"credential"."identity_id"
FROM "credential"
WHERE "credential"."identity_id" IN
(84706, 48746, 871441, 84713, 76492, 84621, 51472);
행 수가 너무 많을 수 있는 단일 조인을 실행하는 대신 각 테이블을 개별 쿼리로 분할합니다.
이미 게시된 답변을 검토했습니다.그냥 실제 예시로 답변을 추가하는 게 좋을 것 같아서요.
관련된 장고 모델이 3개 있다고 칩시다.
class M1(models.Model):
name = models.CharField(max_length=10)
class M2(models.Model):
name = models.CharField(max_length=10)
select_relation = models.ForeignKey(M1, on_delete=models.CASCADE)
prefetch_relation = models.ManyToManyField(to='M3')
class M3(models.Model):
name = models.CharField(max_length=10)
서 질문할 수 .M2
및 그 모델M1
를 사용한 select_relation
[ ] 및 [ ]M3
를 사용한 prefetch_relation
syslog.syslog.syslog.
이미 말씀드린 바와 M1
M2
는 입니다.ForeignKey
단, 임의의 경우 1개의 레코드만 반환됩니다.M2
물건.에도 같은 것이 적용됩니다.OneToOneField
뿐만 아니라.
★★★★★★★★★★★★★★★★★.M3
M2
는 입니다.ManyToManyField
합니다.M1
★★★★★★★★★★★★★★★★★★.
를 들어, 2는 2로, 2는 2로 있습니다.M2
'''」m21
,m22
같은 5개의 어소시에이트가 있는M3
를 1,2,3,4,5
있는 것을 할 때.M3
M2
관련을 고르다
순서:
- ★★
m21
★★★★★★ 。 - " " " 를 쿼리합니다.
M3
m21
가 ID인1,2,3,4,5
. -
m22
및 other " " " " " 。M2
★★★★★★★★★★★★★★★★★★.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.1,2,3,4,5
m21
,m22
오브젝트, select_related 옵션을 사용하면 이미 가져온 동일한 ID에 대해 DB에 대해 두 번 쿼리합니다.
사용하는 prefetch_related를 얻으려고 M2
를합니다.이 ID(: ID)를 하는 동안 된 ID를 합니다.M2
테이블과 마지막 단계로 장고는 다음 항목에 대한 쿼리를 만듭니다.M3
로, 자신의 ID가 "" " " " " " 입니다.M2
합류하다M2
파이썬을 사용하다
모든 ""를 할 수 .M3
비단뱀 조인
언급URL : https://stackoverflow.com/questions/31237042/whats-the-difference-between-select-related-and-prefetch-related-in-django-orm
'programing' 카테고리의 다른 글
사용자가 IE를 사용하고 있는지 확인합니다. (0) | 2023.01.15 |
---|---|
JavaScript에는 인터페이스 타입(Java의 'interface' 등)이 있습니까? (0) | 2022.12.31 |
목록 이해 대 람다 + 필터 (0) | 2022.12.31 |
Jest를 사용하여 NUXT.js 및 Vue.js 앱을 테스트합니다.'mapState()에서 [vuex] 모듈 네임스페이스를 찾을 수 없음' 및 '[vuex] 알 수 없는 작업 유형'을 가져오는 중 (0) | 2022.12.31 |
char가 숫자인지 문자인지를 확인합니다. (0) | 2022.12.31 |