[SQL] SQL WHERE ID IN (ID1, ID2, ..., IDN)
SQLSQL WHERE ID IN (ID1, ID2, ..., IDN)
나는 ID의 큰 목록을 검색 쿼리를 작성해야합니다.
나는 표준 SQL을 작성해야합니다, 그래서 우리는 많은 백엔드 (MySQL은, 파이어 버드, SQLServer에, 오라클, PostgreSQL의를 ...)을 지원 않습니다.
아이디 세트의 크기가 큰 수, 쿼리가 프로그램을 생성 할 것이다. 그래서 가장 좋은 방법은 무엇인가?
SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)
여기에 내 질문입니다. n이 매우 큰 경우 어떻게됩니까? 또한, 어떤 성능에 대한?
SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn
n이 매우 큰 경우, 나는이 방법은 N 제한이없는 생각,하지만 성능에 대한?
foreach (var id in myIdList)
{
var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id);
myObjectList.Add(item);
}
데이터베이스 서버가 네트워크를 통해 조회 할 때 우리는이 방법을 몇 가지 문제를 경험했다. 일반적으로 작은 쿼리를 많이 만드는 대 모든 결과를 검색 한 쿼리를 수행하는 것이 좋습니다. 어쩌면 내가 틀렸다.
이 문제에 대한 올바른 해결책이 있을까요?
해결법
-
==============================
1.옵션 1은 유일하게 좋은 솔루션입니다.
옵션 1은 유일하게 좋은 솔루션입니다.
-
==============================
2.또 다른 접근 방식은 ID 값을 포함하는 다른 테이블을 사용할 수 있습니다. 이 다른 테이블은 제한 반환 된 행에 표에 합류 내부 될 수 있습니다. 이것은 당신이 (시대의 최고의에서 문제가) 동적 SQL이 필요하지 않습니다 있다는 큰 장점이있을 것이다, 당신은 절 무한히 오랫동안이 없습니다.
또 다른 접근 방식은 ID 값을 포함하는 다른 테이블을 사용할 수 있습니다. 이 다른 테이블은 제한 반환 된 행에 표에 합류 내부 될 수 있습니다. 이것은 당신이 (시대의 최고의에서 문제가) 동적 SQL이 필요하지 않습니다 있다는 큰 장점이있을 것이다, 당신은 절 무한히 오랫동안이 없습니다.
당신은 행 당신의 많은 수의 삽입 후 아마도이 조인의 성능을 돕기 위해 인덱스를 생성이 다른 테이블을자를 것이다. 그것은 또한 당신이 아마 당신에게 성능 조정에 더 많은 옵션을 제공, 데이터의 검색에서 이러한 행의 축적을 분리 할 것입니다.
업데이트 : 임시 테이블을 사용할 수 있지만, 당신이해야 심지어는 것을 암시하는 말은하지 않았다. 임시 데이터에 사용되는 영구 테이블 여기에 기재된 장점과 이후 일반적인 솔루션이다.
-
==============================
3.무엇 에드 기네스 제안하는 것은 정말 성능 부스터,이 같은 쿼리를했다
무엇 에드 기네스 제안하는 것은 정말 성능 부스터,이 같은 쿼리를했다
select * from table where id in (id1,id2.........long list)
제가 한 :
DECLARE @temp table( ID int ) insert into @temp select * from dbo.fnSplitter('#idlist#')
그런 다음 내부 기본 테이블과 임시 가입 :
select * from table inner join temp on temp.id = table.id
그리고 성능이 크게 개선되었다.
-
==============================
4.첫 번째 옵션은 확실히 최선의 방법입니다.
첫 번째 옵션은 확실히 최선의 방법입니다.
SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)
그러나 ID의 목록이 매우 큰 것을 고려, 수백만, 당신은 다음과 같은 청크 크기를 고려해야 말 :
당신은 덩어리로 이유를 분할해야합니까?
그것은 항상 나를 위해 마법처럼 일했다. 이뿐만 아니라 동료 개발자를 위해 일하는 것이 희망 :)
-
==============================
5.5 억 개 기록과 푸른 SQL 테이블에 () 명령 ID가> 7 분의 대기 시간의 결과 곳을 MyTable에서 SELECT *를 수행!
5 억 개 기록과 푸른 SQL 테이블에 () 명령 ID가> 7 분의 대기 시간의 결과 곳을 MyTable에서 SELECT *를 수행!
바로이 대신 반환 된 결과를 수행 :
select b.id, a.* from MyTable a join (values (250000), (2500001), (2600000)) as b(id) ON a.id = b.id
조인을 사용합니다.
-
==============================
6.대부분의 데이터베이스 시스템, IN (VAL1, val2만큼, ...)와 OR의 시리즈 같은 계획에 최적화되어 있습니다.
대부분의 데이터베이스 시스템, IN (VAL1, val2만큼, ...)와 OR의 시리즈 같은 계획에 최적화되어 있습니다.
세 번째 방법은 임시 테이블에 값 목록을 가져오고 값이 많이가있는 경우, 대부분의 시스템에서 더 효율적이다 그것을 결합 될 것이다.
이 기사를 읽고 할 수 있습니다 :
-
==============================
7.당신이 뚜렷한 이유도 수없이 데이터베이스를 타격하는 모든 때문에 샘플 3은 그 중 최악의 연기자 나올 것입니다.
당신이 뚜렷한 이유도 수없이 데이터베이스를 타격하는 모든 때문에 샘플 3은 그 중 최악의 연기자 나올 것입니다.
임시 테이블에 데이터를로드하고 그에 가입하는 것은 지금까지 가장 빠른 의해 것입니다. 그 후 IN은 논리합의 그룹보다 약간 더 빠르게 작동합니다.
-
==============================
8.난 당신이 SQLSERVER을 의미 생각하지만, 오라클에 당신은 당신이 지정할 수 있습니다 얼마나 많은 요소 하드 제한이 있습니다 (1000).
난 당신이 SQLSERVER을 의미 생각하지만, 오라클에 당신은 당신이 지정할 수 있습니다 얼마나 많은 요소 하드 제한이 있습니다 (1000).
from https://stackoverflow.com/questions/5803472/sql-where-id-in-id1-id2-idn by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 PostgreSQL을에 정렬과 행의 고정 번호를 삭제합니까? (0) | 2020.05.07 |
---|---|
[SQL] 우리는 SQL에서보기로 매개 변수를 전달할 수 있습니까? (0) | 2020.05.07 |
[SQL] MYSQL을 사용하여 난수를 생성 (0) | 2020.05.07 |
[SQL] 임시 쿼리를 분산 가능하게하는 방법 (0) | 2020.05.07 |
[SQL] 의 차이는 동등 조인, 가입 시타 및 자연 조인 (0) | 2020.05.07 |