유용한 DMV

IT/Programming/MSSQL 2015. 5. 12. 10:42
   -- Top SPs By Execution Count (SQL 2008)
    SELECT TOP (100) p.name AS 'SP Name', qs.execution_count,
    ISNULL(qs.execution_count/DATEDIFF(Second, qs.cached_time, GetDate()), 0) AS 'Calls/Second',
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime', qs.total_worker_time AS 'TotalWorkerTime', 
    qs.total_elapsed_time, qs.total_elapsed_time/qs.execution_count AS 'avg_elapsed_time', qs.last_elapsed_time,
    qs.cached_time, qs.last_execution_time
    FROM sys.procedures AS p
    INNER JOIN sys.dm_exec_procedure_stats AS qs
    ON p.object_id = qs.object_id
    ORDER BY qs.execution_count DESC;
   
    -- Top SPs By Execution Count (SQL 2005)
    SELECT TOP (100) qt.text AS 'SP Name', qs.execution_count AS 'Execution Count', 
    qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',
    qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
    qs.total_worker_time AS 'TotalWorkerTime',
    qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',
    qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads,
    DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
    WHERE qt.dbid = db_id() -- Filter by current database
    ORDER BY qs.execution_count DESC

 

 

설정

트랙백

댓글

WASD 키와 방향키가 서로 바뀌었을 때

IT/Programming/Solution/Tip 2015. 3. 8. 22:41

내 키보드에 얼마 전 WASD 키를 입력하면 방향키로 인식되고, 방향키를 입력하면 WASD로 입력되는 현상이 나타났었다.

정말 이 난해한 상황에 굉장히 당황 -_-; 하며 혹시라도 켜놓은 프로그램 중 이러한 키보드 매핑 변경 옵션이 있는지 찾아보았는데..

 

그런건 아니었고, 키보드의 fn 혹은 fn의 역할을 하는 기능키와 W를 눌렀을 때 발동되는 기능이라고 한다.

 

거 참 희한한 기능이 다 있네.. 게임을 즐기는 누군가에게는 필요한 기능일지도 모르겠다.

설정

트랙백

댓글

로그 테이블 설계 원칙

IT/Programming/MSSQL 2015. 2. 25. 19:55

1년정도 지표처리 작업을 해오면서 느꼈던 나만의 로그 테이블 설계 원칙을 작성해본다.

 

1. LogDB에는 2차 가공 데이터는 없어야 한다.

-> DB에 박혀있는 값을 가공하여 DB에 INSERT 하는 것은 삼가야 한다.

-> 추가적인 가공이 필요한 데이터는 Tool 에서 진행하도록 한다.

 

2. 알아보기 쉽게. 간단하게 작성되어야 한다. 그렇지만 운영상에 필요한 정보는 반드시 존재하여야 한다.

-> 개발자가 LogDB를 SELECT 하는 것 만으로도 해당 로그가 어떠한 이유에서 발생한 것인지를 명확하게 알 수 있어야 한다.

-> 개발자가 생각하기에 비교적 필요없는 정보라고 할지라도, 운영상에 필요한 정보라면 반드시 남기도록 한다.

-> 특히나, 운영상에 필요한 정보가 Tool 에서 자주 요청되는 정보의 성격이라면 타협의 여지 없이 DB에 남겨야한다.

 

3. 공통 로그 포맷은 죄악이다.

-> 개발의 편의성을 위하여 모든 로그에 대해서 공통된 포맷을 사용하는 경우가 왕왕있다. 공통된 로그 포맷으로도 완벽히 제어할 수 있다면 문제는 없지만, 보통 그렇지 않다. 필요한 칼럼이 있으면 억지로 구겨넣지 말고 늘려야 한다.

 

4. 하나의 칼럼에는 하나의 정보만을 담는다.

-> 로그 시스템이 DW 이상급의 크기를 갖추지 않는다는 전제 하에, 하나의 칼럼에는 하나의 정보만을 담는 것이 좋다.

-> 개발자가 SELECT 하였을 때 WHERE 절로 바로 검색가능한 로그 포맷이어야 한다.

 

설정

트랙백

댓글

HTML Input="file" 확장자 필터링

IT/Programming/Programming 2014. 11. 21. 15:48

HTML input 태그에서 type을 file 로 지정하여 파일을 업로드하고자 할 때, accept 인자를 통해서 확장자 필터링을 할 수 있다.

 

대부분의 확장자 필터링은 아래와 같은 코드로 필터링할 수 있다.

<input type="file" accept=".FILETYPE" />

 

 

▶ CSV
<input type="file" accept=".csv" />

- 주의) 만약 엑셀 CSV 파일을 화면에 띄우고자 업로드할 경우, 아래와 같은 타입은 사용하면 안된다.

  • text/csv
  • application/csv
  • text/comma-separated-values (works in Opera only).
  •  

     

    Excel Files 2003-2007 (.xls)

    <input type="file" accept="application/vnd.ms-excel" />

     

    Excel Files 2010 (.xlsx)

    <input type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />

     

    Text Files (.txt)

    <input type="file" accept="text/plain" />

     

     Image Files (.png/.jpg/etc)

    <input type="file" accept="image/*" />

     

    HTML Files (.htm,.html)

    <input type="file" accept="text/html" />

     

    Video Files (.avi, .mpg, .mpeg, .mp4)

    <input type="file" accept="video/*" />

     

    Audio Files (.mp3, .wav, etc)

    <input type="file" accept="audio/*" />

     

    PDF Files

    <input type="file" accept=".pdf" />

    출처 : http://stackoverflow.com/questions/11832930/html-input-file-accept-attribute-file-type-csv

    설정

    트랙백

    댓글

    (Javascript) getElementsByName() 이 작동하지 않을 때

    IT/Programming/Solution/Tip 2014. 11. 4. 12:32

    javascript 자체를 필요할 때만 잠깐 쓰다보니 했던 실수를 계속 하게 된다.

    나는 이상하게도 유독히 getElementsByName() 함수를 쓸 때 실수를 하곤 하는데, 그 케이스를 정리해본다.

     

    1. getElementsByName 을 GetElementsByName 이라고 작성하는 경우

    ==> --; 어.. 음.. 다른 언어에서 하던 네이밍 습관때문에 이런 것 같다. 보통은 함수의 첫자는 대문자이니깐.

    javascript 에서는 getElementsByName 이다.

     

    2. getElementsByName 을 getElementByName 이라고 작성하는 경우

    ==> name은 중복될 수 있는 요소이기 때문에, ID를 가져오는 함수인 getElementById 와 다르게 Element 에 s가 붙어 복수형이 된다. 주의하자.

    http://anow.tistory.com/148 참고!

     

    3. 배열 첨자를 사용하지 않았을 때

    ==> 이를테면 "TEST" 라는 이름을 가지고 있는 input 박스가 여러개인데,

    document.getElementsByName("TEST") 으로 object를 가져오고 해당 object를 그냥 열람하려고 할 때.

    이런 경우는 반드시 배열 첨자를 사용하여 가져와야 한다. 아래의 코드를 참고하자.

     

    ** 해당 이름을 가지고 있는 박스가 하나밖에 없더라도 배열 첨자를 사용해야한다. 하나밖에 없으므로 0 번째 요소를 가져오면 된다.

     

    1)

    document.getElementsByName("TEST")[0].value = "...";

     

    2)

    var obj;

    obj = document.getElementsByName("TEST");

    obj[0].value = "...";

     

     

    위의 1, 2 코드 모두 같은 코드다. getElementsByNames 이 object를 반환하고 이를 배열 첨자를 통해 참조하는 코드이다.

    이해에 어려운 사람들을 위해서 위의 1, 2 코드를 첨부하니 참고하길 바란다.

     

     

    test.zip

     

    설정

    트랙백

    댓글