SQL Server 2012 (또는 2005 이상 버전)에서는 SELECT *...
쿼리의 최상위 SELECT 문에서 성능 문제가 발생할 수 있습니다.
그것은 CTE는 존재 절에서 하위 쿼리에서 뷰 (*),,,의 문제가 아니며, 그렇게 SELECT COUNT(*)..
등, 등을 참고하는 것이이 오라클에 대해서도 아마 사실이며, DB2, 그리고 어쩌면 포스트 그레스 (하지 않도록) 그러나 MySql의 경우 많은 경우 여전히 문제가 될 가능성이 큽니다.
왜 (그리고 최상위 SELECT에서 여전히 문제가 될 수 있는지) 이해하려면 문제가 발생한 이유를 이해하는 것이 도움이됩니다. 이는 SELECT *..
" 모든 열 반환 " 을 의미 하기 때문 입니다. 일반적으로 이것은 실제로 원하는 것보다 훨씬 많은 데이터를 반환 하므로 디스크와 네트워크 모두에서 더 많은 IO를 얻을 수 있습니다.
덜 명확한 것은 SQL 옵티마이 저가 사용할 수있는 인덱스 및 쿼리 계획도 제한한다는 것입니다. 궁극적으로 모든 데이터 열을 반환해야한다는 것을 알고 있기 때문입니다. 특정 열만 원한다는 것을 미리 알 수 있다면 해당 열만있는 인덱스를 활용하여보다 효율적인 쿼리 계획을 사용할 수 있습니다. 운 좋게도이를 미리 알 수있는 방법이 있습니다.이를 통해 열 목록에서 원하는 열을 명시 적으로 지정할 수 있습니다. 그러나 "*"를 사용할 때 "단지 모든 것을 주면 내가 필요한 것을 알아낼 것"이라는 찬성으로 이것을 잊어 버립니다.
예, 모든 열을 처리하는 데 추가 CPU 및 메모리 사용이 있지만이 두 가지에 비해 거의 항상 미미합니다. 필요하지 않은 열에 필요한 추가 디스크 및 네트워크 대역폭이 적고 사용량이 적어야합니다. 모든 열을 포함해야하므로 최적화 된 쿼리 계획
그래서 무엇이 바뀌 었습니까? 기본적으로 SQL Optimizers는 "열 최적화"라는 기능을 성공적으로 통합했습니다. 즉, 쿼리의 상위 수준에서 실제로 열을 사용하려는 경우 하위 수준의 하위 쿼리에서이를 파악할 수 있습니다.
이것의 결론은 쿼리의 낮은 / 내부 레벨에서 'SELECT * ..'를 사용하면 더 이상 중요하지 않다는 것입니다. 대신 실제로 중요한 것은 최상위 SELECT의 열 목록에있는 것입니다. SELECT *..
맨 위에서 사용하지 않으면 다시 한 번 모든 열 을 원한다고 가정해야 하므로 열 최적화를 효과적으로 사용할 수 없습니다.
(*- *
"*"를 사용할 때 열 목록의 변경 사항을 항상 등록하지 않는 뷰에는 다른 사소한 바인딩 문제 가 있습니다.이를 해결하는 다른 방법이 있으며 성능에는 영향을 미치지 않습니다.