Comment 12
-
이리
2017.01.06 14:41
-
흑흑
2017.01.06 20:35
이렇게 하면 어떨까요?SELECT site_code, sensor_idFROM [surveydb].[dbo].[survey_body]where [timestamp] between DATEADD (DD, -95, GETDATE()) and GETDATE()AND ([calc_value] >= 700AND [sensor_type] = 3unionSELECT site_code, sensor_idFROM [surveydb].[dbo].[survey_body]where [timestamp] between DATEADD (DD, -95, GETDATE()) and GETDATE()AND [calc_value] <= -400)AND [sensor_type] = 3 -
쿼리쫌 ^^
2017.01.07 15:56
이리님 안녕 하십니까 반갑습니다 ^^
1.특정기간동안의 데이터 중에서,
2.센스번호가 3 번인 센스 중에서
3.값이 700 넘거나, 또는 -400 보다 작은 값이라면
출력 하는 것 입니다
흑흑님 감사 합니다
시간이 2배가 걸립니다 ^^
해결할 방법이 있을까요,,,,
-
추억만이
2017.01.07 17:34
Between 을 이렇게 변경해보세요
(timestamp > getdate()-96 and timestamp <=getdate() ) -
흑흑
2017.01.08 10:02
timestamp에 인덱스 있나요?
-
추억만이
2017.01.08 21:51
인덱스가 있다해도 소용없죠..현재쿼리는 ^_^
-
jude
2017.01.09 18:28
우선 인덱스가 있는지 체크가 필요합니다.
이때 인덱스는 sensor_type + timestamp 순 또는 그 반대 로 된게 좋을것 같습니다.
그게 아니라면 timestamp라도 있어야 할거 같구요.
저 인덱스가 있음에도 느리다면,
plan을 확인해보시고, 저 인덱스를 왜 안타게 되었는지도 파악이 필요할거고, 어째뜬 저 인덱스를 타도록 유도해야 합니다.
그럼에도 느리다면,데이타가 너무 많다..라고 볼 수 도! 있을것 같습니다.
집계성 테이블을 이용하는것도 고려를 해보시기 바랍니다.
추가적으로,...
include index 또는 covered index에 대해서 공부해보시면 좋을것 같습니다.
위 인덱스에,
calc_value,site_code, sensor_id 등등을 인덱스에 추가해보는건데요.
covered index나 include index는 정말 답안나올때 해보시면 좋을거 같습니다.
-
쿼리쫌 ^^
2017.01.10 08:17
추억만이님 해봤는데, 시간은 똑같습니다 ^^
인덱스는 캡쳐해서 올립니다. 키값을 말씀하시는거 같은데 timestamp 에는 키값이 있습니다
jude 님 공부좀 더 해 보겠습니다 ㅠ
다들 조언주셔서 감사 드립니다. ^^
-
추억만이
2017.01.10 09:30
키가 인덱스이긴하지만 또 키와는 구분될수있어요
현재는 키가 클러스터드인덱스입니다.
그럼방법이 3가지로 구분되는데
중요한건 제가 적은 대로 쿼리변경은 필수이고
1.timestamp에 non clustered 인덱스를 생성한다.
2.covered index를 생성한다.
3.pk drop 후 키변경한다.
겠네요 -
jude
2017.01.10 12:36
0.between 을 < 와 > 로 쪼개야만 특정인덱스(아래의 idx_surbey_body_01 와 같은) 타는건 아닙니다.
최초에 만드신 쿼리는 아래의 인덱스를 타는데 전혀 무리가 없다고 보입니다.
쿼리에서 timestamp 컬럼을 조작하는 부분(convert나 substring등의 조작)이 없기 때문입니다.1.인덱스는 컬럼에 종속적으로 만들어지는게 아닙니다.
따라서 1-1)timestamp컬럼을 선두로 하는 인덱스를 추가로 만들거나
즉, idx_surbey_body_01 : sensor_type + timestamp 또는 timestamp + sensor_type
1-2)또는 기존의 PK 를 순서(site_code + timestamp + sensor_id)를 timestamp + site_code + sensor_id의 순서를 바꿔서
리빌드 해보는게 맞을 것으로 보입니다.(추천안함)
2.위와 같은 별도의 인덱스를 추가해서 해봤을때도 여전히 느리다면,idx_surbey_body_01 인덱스에 value컬럼을 include 해보는것도
방법이긴 하겠으나,idx_surbey_body_01 만으로도 충분히 나오지 않겠나 싶습니다.
3.위에서 1-2)pk의 순서를 바꾸는 것은
해당 테이블을 사용하는 다른 쿼리들이 있을 수 있어 다른 쿼리들에 영향을 줄 수 있으므로,
추천하지 않습니다.
결론은,idx_surbey_body_01 : sensor_type + timestamp 으로 인덱스 추가!
-
jude
2017.01.10 09:42
캡쳐된 화면만으로는. Primary key 에대한 것만 학인됩니다.추가적으로 어떤 인덱스가 더 있는
지확인이안됩니다만...
말씀하시는 걸로봐서...는 인덱스의 계념이 약한거 같습니다
쿼리가 어떤인덱스를 타기위해서 필요한 조건이 있습니다
위 Pk인덱스의 경우,그러한 조건을 만족하지 못한다고 볼수있습니다.
다음과 같이 인덱스를추가해보세요.
Idx_survery_body_01 : sensor_type,timestamp -
건우아빠
2017.01.10 11:48
메뉴- 쿼리- 데이타베이스 엔진 튜닝 관리자에서 쿼리분석 이 있습니다.
실행할 sql문을 마우스로 선택하시고 이 메뉴를 선택하시면 쿼리에 필요한 인덱스등을 자동으로 분석하여 만들어 줍니다.
만들어진 내용을 스크립트로 받을수 있습니다.
하나하나를 실행하면서 쿼리릐 속도가 어떻게 변하는지를 보시면 쉽게 이해가 올듯 합니다.
실행계획을 보시고 뭐가 문제인가를 아신다면 이런 질문을 하시지는 않을듯 합니다.
mssql에서 지원하는 튜닝 기능만 잘 이용하셔도 충분 합니다. 전문 DBA를 하실게 아니면 딱 그정도면 될듯 합니다.
모든걸 아는것 보자 특정 분야 한두개를 정말 잘하시면 되고 나머지는 기본적으로 남들이 말하는걸 이해 하는정도로만 아시면 됩니다.
기본적인걸 이해라는 정도도 많이 공부 하셔야 되지만요.
실행계획을 올려주시면 분석이 편할 거 같습니다.