adhoc 쿼리를 과도하게 호출 시 cached plan이 저장 가능한 공간을 초과 할 수 있음.
아래의 경우 1회만 사용되는 plan이 대부분인 케이스
1회만 사용되는 plan을 sp_executesql 형태로 변경하거나 동일 plan을 사용하도록 유도가 필요함
-- 모든 cached plan을 조회
select objtype, count(*) as cnt, sum(convert(bigint, size_in_bytes))/(1024*1024) as size_mb
from sys.dm_exec_cached_plans
--where usecounts = 1
group by objtype
order by cnt desc
/**
objtype cnt size_mb
Adhoc 156329 6906 <--
Prepared 3708 967
View 1285 181
Proc 215 253
**/
-- cached plan 사용 횟수가 1회 경우만 조회
select objtype, count(*) as cnt, sum(convert(bigint, size_in_bytes))/(1024*1024) as size_mb
from sys.dm_exec_cached_plans
where usecounts = 1
group by objtype
order by cnt desc
/**
objtype cnt size_mb
Adhoc 153763 1889 <--
Prepared 3145 242
Proc 41 19
**/
query_hash 통한 이슈 query 확인
이슈 query 확인 후 수정
-- 실행 count가 1인 경우만 조회
select query_hash, count(*) as cnt
from sys.dm_exec_query_stats
where execution_count = 1
group by query_hash
order by cnt desc
/**
query_hash cnt
0xD1CC06V33C082806 135420 <--- 확인
0x3129830A6071HND2 2108
0x30E30C19A239CX39 218
0x690CY4EC5110G475 218
~
**/
-- 이슈 query text 확인
select top 100 st.text
from sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text (qs.sql_handle) as st
where qs.query_hash = 0xD1CC06V33C082806
/**
USE master INSERT INTO *******************
USE master INSERT INTO *******************
**/
// 리스트 확인
chkconfig --list [프로그램명]
// Linux 시작시 실행되도록 설정
chkconfig [프로그램명] on
// Linux 시작시 실행되지 않도록 설정
chkconfig [프로그램명] off
// Linux 런 레벨별로 시작시 실행되도록 설정
chkconfig --level [레벨] [프로그램명] on
// Linux 런 레벨별로 시작시 실행되지 않도록 설정
chkconfig --level [레벨] [프로그램명] off
[root@zetawiki ~]# alias | grep cp
alias cp='cp -i'
해결 방법
방법 1) 아래와 같이 cp 앞에 역슬래시를 넣으면 alias 대신 원래의 명령어가 실행된다.
[root@zetawiki ~]# \cp 1.txt 2.txt
[root@zetawiki ~]# cat 2.txt
hello
방법 2) 전체경로 사용
[root@zetawiki ~]# /bin/cp 1.txt 2.txt
[root@zetawiki ~]# cat 2.txt
hello
const today = new Date();
const tomorrow = new Date();
// Add 1 Day
tomorrow.setDate(today.getDate() + 1);
입력한 날짜(yyyyMMdd)가 유효한 날짜인지 검사
function is_valid_date(date_str)
{
var yyyyMMdd = String(date_str);
var year = yyyyMMdd.substring(0,4);
var month = yyyyMMdd.substring(4,6);
var day = yyyyMMdd.substring(6,8);
if (!is_number(date_str) || date_str.length!=8)
return false;
if (Number(month)>12 || Number(month)<1)
return false;
if (Number(last_day(date_str))<day)
return false;
return true;
}
yyyy-MM-dd 날짜 문자열을 Date형으로 반환
function to_date2(date_str)
{
var yyyyMMdd = String(date_str);
var sYear = yyyyMMdd.substring(0,4);
var sMonth = yyyyMMdd.substring(5,7);
var sDate = yyyyMMdd.substring(8,10);
//alert("sYear :"+sYear +" sMonth :"+sMonth + " sDate :"+sDate);
return new Date(Number(sYear), Number(sMonth)-1, Number(sDate));
}
function is_leap_year(date_str)
{
var year = date_str.substring(0,4);
if (year%4 == 0)
{
if (year%100 == 0)
return (year%400 == 0);
else
return true;
}
else
return false;
}
주어진 날짜(yyyyMMdd, yyyyMM) 그 달의 마지막 날짜를 반환
function last_day(date_str)
{
var yyyyMMdd = String(date_str);
var days = "31";
var year = yyyyMMdd.substring(0,4);
var month = yyyyMMdd.substring(4,6);
if (Number(month) == 2)
{
if (is_leap_year(year+month+"01"))
days = "29";
else
days = "28";
}
else if (Number(month) == 4 || Number(month) == 6 || Number(month) == 9 || Number(month) == 11)
days = "30";
return days;
}
오늘 날짜 중 연도 반환
function get_today_year()
{
var today = new Date();
return today.getYear();
}
오늘 날짜 중 Month반환. format: MM
function get_today_month()
{
var today = new Date();
return (today.getMonth()+1) > 9 ? (today.getMonth()+1) : "0" + (today.getMonth()+1)
}