본문 바로가기

일기

오늘 배운 것들

1. 

메인 쿼리를 짜는데 속도가 유독 안나오는 부분이 있었다.

대상 테이블 데이터가 많아서 그런듯 했다.

고심하다가, 오라클 힌트를 줘봤다.


/*+ INDEX (table명, index명) */

4초 중반에서 2초 후반대로 떨어졌으니 제법 효과가 컸다.

그런데 희한하게 Cost는 증가했는데, 속도는 빨라졌다. 

http://tip.daum.net/question/62998450

여기 설명이 잘 나와있는데 요약하자면 옵티마이저가 모든 경우의 수를 다 알고 있지 않기 때문에 오는 문제 같다.

옵티마이저의 한계랄까.. 이것도 그럼 ai가 발전하면 더 좋아질수도..?


2.

그런데 문제는 이 동일한 테이블을 union 해서 두번 호출한다는 것이었다.

table1

union all

table1


그런데 가만 생각해보니 그럴 필요가 없는 쿼리였다.

그냥 조건절만 바꿔주면 굳이 union 할 필요가 없었다.

검색을 좀 해보니 아래와 같은 좋은 정리글이 있었다.


http://intomysql.blogspot.kr/2011/01/union-union-all.html

0. UNION 이든지 UNION ALL이든지 사실 그리 좋은 SQL 작성은 아니다. 

    UNION이 필요하다는 것은 사실 두 엔터티(테이블)가 하나의 엔터티(테이블)로 통합이 되었어야 

    할 엔터티들이었는데, 알 수 없는 이유로 분리 운영되는 경우가 상당히 많다. 

    즉 모델링 차원에서 엔터티를 적절히 통합하여 UNION의 요건을 모두 제거하자.


3.

Passing Javascript object and object list to Spring controller


javascript object를 파라미터로 넘길 때는, 문자열로 보내야한다.

위 링크에 잘 정리돼있다.


요약하면...

var data = JSON.stringify(res); // 오브젝트를 문자열로 변환

$.ajax({

            type: "post",

            url: url,

            data: data,

            dataType: "html",

            contentType: 'application/json',

            mimeType: 'application/json',

            async: false,

            success: function(res){

                         },

            error: function(err){               

            }

        });


이런식으로 보내고~


컨트롤러에서는


public String url(@RequestBody Map<String,Object> data, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception { ... }


이렇게 받아서 편하게 쓸 수 있다.


테스트

var testobj = {

        name: 'kim',

        age: 30,

        subject : ['a','b','c']

                   };

console.log(testobj);

console.log('type==='+typeof testobj);

testobj =  JSON.stringify(testobj);

console.log(testobj);

console.log('type==='+typeof testobj);



결과:

Objectage: 30name: "kim"subject: (3) ["a", "b", "c"]__proto__: Object

d07.do:283 type===object

d07.do:285 {"name":"kim","age":30,"subject":["a","b","c"]}

d07.do:286 type===string