수백만 개의 행이있는 상당히 큰 테이블이 있습니다. 두 열이 파이썬 코드에서 전달 된 쌍 목록에 값이있는 행을 선택하는 효율적인 코드를 작성하려고합니다. 합리적인 답변이 게시되었습니다 .
예
select *
from table
where convert(id1) + '-' + id2 in ('2261-7807403','2262-9807403' )
반환 된 테이블은를 통해 데이터 프레임에 저장됩니다 pd.read_sql_query
. 여기에 두 가지 문제가 있습니다 (느린 문제 외에). 하나 id2
는 될 수 있으며 NULL
이러한 행에 대한 쿼리가 실패합니다. 더 중요한 또 다른 문제는 where
절 에있는 튜플 목록의 크기가 1에서 수백만까지 다양 할 수 있다는 것입니다.
내 이해는 큰 목록의 경우 전체 열을 팬더로 파이썬으로 가져온 다음 거기에서 필터링하는 것이 더 낫다는 것입니다. 그러나 적은 수의 목록과 많은 수의 목록 사이를 원활하게 전환하려면 어떻게해야합니까? SQL Server와 Python의 영리한 조합으로 수행 할 수있는 방법이 있습니까?
올바른 유형을 사용하여 값을 전달해야합니다. 한 가지 방법은 파생 테이블을 생성하고 다음을 사용하는 것입니다 join
.
select t.*
from table t join
(values (2261, 7807403), . . .
) v(id1, id2)
on t1.id1 = v.id1 and t.id2 = v.id2;
비교를 위해 값을 문자열로 변환해서는 안됩니다. 이는 "어리석은"일일뿐만 아니라 성능을 심각하게 저하시킬 수 있습니다.
에 관해서는 NULL
특수 논리가 없다면들, 그들은 일치하지 않습니다. SQL에는 널 안전 비교가 없습니다.
select t.*
from table t join
(values (2261, 7807403), . . .
) v(id1, id2)
on (t1.id1 = v.id1 or t1.id1 is null and t2.id2 is null) and
(t.id2 = v.id2 or t1.id1 is null and t2.id2 is null);
이는 실행 계획에 영향을 미칠 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다