MS-SQL 인덱스 조각모음

MS-SQL 2013. 1. 3. 15:01 Posted by Dayis

데이터를 입력,수정,삭제를 하다보면 인덱스에 조각화가 일어난다.

조각화가 많아지면 성능이 느려진다.


1. 인덱스를 다시 작성하는 방법에는 

① DBCC DBREINDEX

② DBCC INDEXDEFRAG

③ ALTER INDEX ALL ON 테이블명 REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90)


여기에서 속도도 가장 빠르고 효율적인 것은 MS-SQL 2005 이상에서 지원하는 아래의 쿼리다.

ALTER INDEX ALL ON 테이블명 REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90)

 

2. 해당 데이터베이스의 모든 테이블의 모든 인덱스를 재정리하는 쿼리

=========================================================================================

DECLARE @i int, @sql varchar(1000)

DECLARE @tablename varchar(1000),@ownerName  varchar(1000)

SET @i = 1

DECLARE DB_Cursor CURSOR FOR 

 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME

OPEN DB_Cursor

FETCH NEXT FROM DB_Cursor

INTO @ownerName, @tablename

WHILE @@FETCH_STATUS = 0

BEGIN

 SET @sql = 'ALTER INDEX ALL ON ' + @ownerName + '.' + @tablename + ' REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90) '

 EXEC (@sql)

 PRINT CONVERT(VARCHAR, @i) + '__' + @ownerName + '.' + @tablename + '............ OK'

 SET @i = @i + 1

 FETCH NEXT FROM DB_Cursor

 INTO @ownerName, @tablename

END

CLOSE DB_Cursor

DEALLOCATE DB_Cursor

=========================================================================================

'MS-SQL' 카테고리의 다른 글

테이블 스키마를 dbo로 변경  (0) 2013.04.14
전체 테이블의 모든 인덱스 조회  (0) 2013.01.03
MS-SQL 전체 테이블 크기 조회 (용량순, 테이블이름순)  (0) 2012.08.16
declare cursor  (0) 2012.06.12
Join절 Update  (0) 2011.11.03

$(document).ready(function(){

/* data-role="content" 높이 100%로 채우기 */

scroll(0, 0);

var header = $("div[data-role='header']:visible");

var footer = $("div[data-role='footer']:visible");

var content = $("div[data-role='content']:visible");

var viewport_height = $(window).height();

var content_height = viewport_height - header.outerHeight() - footer.outerHeight();

content_height -= (content.outerHeight() - content.height());

$("div[data-role='content']").css('min-height',content_height);

});

1. data-role="header" 또는 data-role="footer"에 사용

2. data-position="fixed" : 페이지가 스크롤 되어도 항상 위치 고정

3. data-tap-toggle="false" : 고정된 위치에서 숨김 기능 제거


ASP.NET에서 여러개의 폼 사용시 유효성검사 분리(그룹지정) 방법

 

<asp:TextBox ID="name" runat="server" Width="200px"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="이름을 입력해 주세요." ControlToValidate="name"></asp:RequiredFieldValidator>

 

<asp:TextBox ID="title" runat="server" size="60"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="제목을 입력해 주세요." ControlToValidate="title"></asp:RequiredFieldValidator>

 

<asp:ImageButton ID="List" runat="server" OnClick="LIst_Click" ImageUrl="img/list.gif" />

<asp:ImageButton ID="Write" runat="server" OnClick="Write_reg_Click" ImageUrl="img/write.gif" />

 

위와 같이 유효성 검사를 하게될 시에 List_Click으로 이전 페이지로 돌아 가고 싶을 때 Write_reg_Click시에만 검사해야할 유효성 검사가 List_Click시에도 유효성 검사를 하게 됩니다.

이럴때 ValidationGroup 을 지정해 주면 간단하게 해결 할 수 있습니다.

 

<asp:TextBox ID="name" runat="server" Width="200px"  ValidationGroup="vali"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ValidationGroup="vali" runat="server" ErrorMessage="이름을 입력해 주세요." ControlToValidate="name"></asp:RequiredFieldValidator>

 

<asp:TextBox ID="title" runat="server" ValidationGroup="vali" size="60"></asp:TextBox> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" ValidationGroup="vali" runat="server" ErrorMessage="제목을 입력해 주세요." ControlToValidate="title"></asp:RequiredFieldValidator>

 

<asp:ImageButton ID="List" runat="server" OnClick="LIst_Click" ImageUrl="img/list.gif" />

<asp:ImageButton ID="Write" runat="server" OnClick="Write_reg_Click" ValidationGroup="vali" ImageUrl="img/write.gif" />

 

위와 같이  ValidationGroup="vali"을 지정 해 주면 Write_reg_Click시에만 유효성검사를 실행 하게 됩니다.

AJAX로 Form데이터 전송 (Post/Get)

JAVASCRIPT 2012. 8. 17. 11:48 Posted by Dayis

<SCRIPT LANGUAGE="JavaScript">

<!--

var request;    // URL 요청에 대한 응답을 받아올 객체

var queryString;  // 폼의 모든 입력컨트롤의 값을 QueryString 형태로 저장


/*  

  요청 객체 생성을 위한 랩퍼 함수 

  

  매개변수:

    regType: HTTP 요청 유형. GET 또는 POST

    url: 서버 프로그램의 URL

    asynch: 동기 또는 비동기 모드 선택

*/

function httpRequest(reqType, url, asynch)

{

  if(window.XMLHttpRequest)    // 모질라 기반 브라우저(네스케이프, 파이어폭스)

  {

    request = new XMLHttpRequest();

  }

  else if(window.ActiveXObject)  // IE 기반 브라우저

  {  

    request = new ActiveXObject("MSXML2.XMLHTTP");  // IE 6 이만

    

    if(!request)

    {

      request = new ActiveXObject("Microsoft.XMLHTTP");  // IE 6 이상      

    }

  }


  if(request)

  {

    initReq(reqType, url, asynch);

  }

  else

  {

    alert("이 브라우저는 Ajax 를 지원하지 않습니다.");

  }

}


/*

  생성된 요청 객체의 초기화

  

  매개변수:

    regType: HTTP 요청 유형. GET 또는 POST

    url: 서버 프로그램의 URL

    asynch: 동기 또는 비동기 모드 선택. true 또는 false

*/

function initReq(reqType, url, asynch)

{

  request.onreadystatechange = handleRespone;  // CallBack 함수 지정  


  if(reqType.toLowerCase() == "post")

  {

    // 전송이 post 방식인 경우

    request.open(reqType, url, asynch);

    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charaset=UTF-8");

    request.send(queryString);

  }

  else

  {

    // 전송이 get 방식인 경우

    request.open(reqType, url + queryString, asynch);

    request.send(null);

  }

}


/*

  Ajax 실행 후 CallBack 함수

*/

function handleRespone()

{

  if(request.readyState == 4)

  {

  // 문서 다운로드가 완료되었는가?

    if(request.status == 200)

    {

    // 문서가 정상적으로 로드되었는가?

      result = request.responseText;

      alert(result); ///* 의미 있는 코드를 넣어두면 되겠지

    }

    else

    {

      alert("해당 URL 에 정상적으로 접근하지 못 했습니다.");

    }

  }

}


/*

  시작 포인트 함수

*/

function sendData()

{

  var url = "http://expert0226.tistory.com/52";


  setQueryString();

  httpRequest("POST", url, true);    ///* GET 으로 전송하고 싶다면 주석 설정

  //httpRequest("GET", url, true);  ///* GET 으로 전송하고 싶다면 주석 해제

}


/*

  폼의 모든 입력컨트롤의 값을 QueryString 형태로 저장

*/

function setQueryString()

{

  queryString = "";

  var frm = document.forms[0];

  var numberElements = frm.elements.length;


  for(var i = 0; i < numberElements; i++)

  {

    input = frm.elements[i];


    if(i < numberElements - 1)

    {

      queryString += input.name + "=" + encodeURIComponent(input.value) + "&";

    }

    else

    {

      queryString += input.name + "=" + encodeURIComponent(input.value);

    }

  }

}

//-->

</SCRIPT>


<TABLE width="100%" height="100%">

<FORM METHOD="POST" ACTION="javascript:void%200;" onSubmit="sendData(); return false;">

<TR height="23px">

  <TD width="140px">이름</TD>

  <TD><INPUT TYPE="text" NAME="txtName" value="여름나라" style="width: 100%;" onFocus="this.select();"></TD>

</TR>

<TR>

  <TD>이야기</TD>

  <TD><INPUT TYPE="text" NAME="txtStory" value="겨울이야기" style="width: 100%;" onFocus="this.select();"></TD>

</TR>

<TR>

  <TD colspan="2" align="center"><INPUT TYPE="submit"></TD>

</TR>

</FORM>

</TABLE>


SET NOCOUNT ON

CREATE TABLE #TBLSize 

Tblname varchar(80), 

TblRows int, 

TblReserved varchar(80), 

TblData varchar(80), 

TblIndex_Size varchar(80), 

TblUnused varchar(80) 

)


DECLARE @DBname varchar(80) 

DECLARE @tablename varchar(80)

SELECT @DBname = DB_NAME(DB_ID()) 

PRINT 'User Table size Report for (Server / Database): ' + @@ServerName + ' / ' + @DBName

PRINT '' 

PRINT 'By Size Descending'


DECLARE TblName_cursor CURSOR FOR 

SELECT NAME 

FROM sysobjects 

WHERE xType = 'U'

OPEN TblName_cursor

FETCH NEXT FROM TblName_cursor 

INTO @tablename

WHILE @@FETCH_STATUS = 0 

BEGIN 

INSERT INTO #tblSize(Tblname, TblRows, TblReserved, TblData, TblIndex_Size, TblUnused) 

EXEC Sp_SpaceUsed @tablename

-- Get the next author. 

FETCH NEXT FROM TblName_cursor 

INTO @tablename 

END

CLOSE TblName_cursor 

DEALLOCATE TblName_cursor

SELECT CAST(Tblname as Varchar(30)) 'Table', 

CAST(TblRows as Varchar(14)) 'Row Count', 

CAST(LEFT(TblReserved, CHARINDEX(' KB', TblReserved)) as int) 'Total Space (KB)', 

CAST(TblData as Varchar(14)) 'Data Space', 

CAST(TblIndex_Size as Varchar(14)) 'Index Space', 

CAST(TblUnused as Varchar(14)) 'Unused Space' 

FROM #tblSize 

Order by 'Total Space (KB)' Desc

PRINT '' 

PRINT 'By Table Name Alphabetical'

SELECT CAST(Tblname as Varchar(30)) 'Table', 

CAST(TblRows as Varchar(14)) 'Row Count', 

CAST(LEFT(TblReserved, CHARINDEX(' KB', TblReserved)) as int) 'Total Space (KB)', 

CAST(TblData as Varchar(14)) 'Data Space', 

CAST(TblIndex_Size as Varchar(14)) 'Index Space', 

CAST(TblUnused as Varchar(14)) 'Unused Space' 

FROM #tblSize 

Order by 'Table'

DROP TABLE #TblSize

SET NOCOUNT OFF

'MS-SQL' 카테고리의 다른 글

전체 테이블의 모든 인덱스 조회  (0) 2013.01.03
MS-SQL 인덱스 조각모음  (0) 2013.01.03
declare cursor  (0) 2012.06.12
Join절 Update  (0) 2011.11.03
join, update  (0) 2010.11.22

declare cursor

MS-SQL 2012. 6. 12. 17:08 Posted by Dayis

declare cur cursor for  -- 커서선언

 select a.sayear, a.entsubno, d.saitmcd

   from TEST a

        -- 조회쿼리 


open cur

        

        -- 조회쿼리 항목들을 변수로 선언 (갯수가 동일해야 한다 )

 declare @year char(4)

  ,@entsubno char(6)

  ,@saitmcd char(11)

  

 fetch next from cur into @year, @entsubno, @saitmcd

 

 while @@fetch_status = 0

 begin 

  

  insert into TEST_subitm ( sayear, entsubno, saitmcd)

  values (@year,@entsubno,@saitmcd)

                --실행쿼리부분


 fetch next from cur into @year, @entsubno, @saitmcd

 end

close cur

deallocate cur


---------------------------------------------------


전체적인순서


1. 쿼리로 커서선언

2. 커서 OPEN

3. 데이터 선언

4. 첫번째 레코드의 값을 변수에 셋팅

5. 패치상태가 정상이면 while 반복문 실행

6. 반복문 시작 

7. 실행쿼리 실행

8. 다음 레코드의 값을 변수에 셋팅

9. 반복문 종료

10. 커서 CLOSE

11. 커서메모리 반환

'MS-SQL' 카테고리의 다른 글

MS-SQL 인덱스 조각모음  (0) 2013.01.03
MS-SQL 전체 테이블 크기 조회 (용량순, 테이블이름순)  (0) 2012.08.16
Join절 Update  (0) 2011.11.03
join, update  (0) 2010.11.22
프로시져 사용시 ADO타입  (0) 2010.10.06

이미지 없이 div 라운드 처리

CSS 2012. 6. 1. 17:20 Posted by Dayis

<style> 
.rtop, .rbottom{display:block;} 
.rtop *, .rbottom *{display:block; height:1px; overflow:hidden;} 
.r1{margin:0 5px; background:#CCCCCC} 
.r2{margin:0 3px; border-left:2px solid #CCCCCC; border-right:2px solid #CCCCCC;} 
.r3{margin:0 2px; border-left:1px solid #CCCCCC; border-right:1px solid #CCCCCC;} 
.r4{margin:0 1px; height:2px; border-left:1px solid #CCCCCC; border-right:1px solid #CCCCCC;} 
.box { margin:0; padding:5px 10px; border-left:#CCCCCC solid 1px; border-right:#CCCCCC solid 1px; font-size:12px}

</style>

 

<div id="container" style="background: #fff"> 
      <b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b> 
      <div class="box">이미지 없이 라운딩 보더 표현하기이미지 없이 라운딩 보더 표현하기이미지 없이 라운딩 보더 표현하기이미지 없이 라운딩 보더 표현하기!</div> 
      <b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>

</div> 

이런 것도 있네.. 언젠가 쓸 날이 있겠지..

'정보' 카테고리의 다른 글

Flow Chart 작성 프로그램  (0) 2011.06.01
실시간 브라우저 점유율  (0) 2010.12.09

ASP 파라메터 컨트롤 함수

ASP 2012. 1. 9. 17:25 Posted by Dayis

url 정보의 파라메터 및 쿼리스트링 자유롭게 조정하는 함수개발 중에 만들어진 함수 입니다.
각 페이지마다 링크걸기가 귀찮고, 소스가 지져분해져서 만들게 되었네요.

해당 페이지의 파라메터 정보 즉, 쿼리스트링을 불러오는 함수입니다.
불러온 파라메터의 부분 부분 삭제 및 수정이 가능하여 사용이 편리하다는 장점이 있습니다.

이동할 페이지가 정해져 있고 파라메터로 페이지 컨트롤할 경우 ?chn=blog
? 를 붙여 주시면 됩니다. ^-^ 대부분 아시겠지만 ... 1%를 위해서!!

* 자주 사용하는 함수명은 짧은게 좋아요 !!
* 페이지 이동을 파라메타로 개발하시는 분에게 권하는 함수입니다.
index.asp -> list.asp (x)
index.asp -> index.asp?mode=list (o)

-------------------------------------------------------------------------------------------

 

[2008.03.26] 값 없는 파라메터 필터링
chn=blog&mode=syaku&type=&page=2
위와 같은 파라메터인 경우 &type= 부분은 자동 삭제됩니다.
chn=blog&mode=syaku&page=2

[2008.05.29] 
값이 없는 파라메터 자동 삭제 버그 수정 (위 방법 올바르게 안되는 부분 수정)

이전 페이지 값 가져 오기
예) 로그인 하지않은 상태에서 특정페이지에 접근하게 되면, 이전 페이지의 파라메터 정보를 읽어 
로그인 페이지로 전송하면 됩니다.

[2008.06.30]
쿼리스트링 끝 부분에 & 가 붙는 경우 삭제함.

# 원본 소스
<%@LANGUAGE="VBSCRIPT"%>
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
<% Option Explicit %>

<%
Public Function Para(Ar)
        Dim Reg
        Dim query,reg_query,key,str
        query = Request.ServerVariables("QUERY_STRING")
        
        Set Reg = New RegExp
        Reg.Global = True
        
        '// 2008.03.26 파라메터 필터링 1차 수정
        '//Reg.Pattern = "([A-Za-z0-9_-]+)=(&|$)"
        '//query = Reg.Replace(query,"&")
        
        '// 2008.05.29 파라메터 필터링 2차 수정
        Reg.Pattern = "(&|)([A-Za-z0-9\%\_\-]+)=(&|$)"
        query = Reg.Replace(query,"&")
        
        If IsArray(Ar) Then
                For Each key In Ar
                        str = key(0) & "=" & key(1)
                        Reg.Pattern = "(" & key(0) & ")=([^&]+)?"
                        If key(1) = "" Then
                               query = Reg.Replace(query,"")
                        Else
                               query = Reg.Replace(query,str)
                        End If
                Next 
        
        '// 2008.05.29 이전 페이지 돌아가기
        Else
                If Ar = "HTTP_REFERER" Then
                        query = Request.ServerVariables("HTTP_REFERER")
                        
                        Reg.Pattern = "^(http|ftp|mail|https):\/\/(.*)\/(.*)\?"
                        query = Reg.Replace(query,"")
                End If
        End If
        
        '// 200.06.30 끝부분에 & 붙으면 제거함.
        Reg.Pattern = "&$"
        query = Reg.Replace(query,"")
        Set Reg = Nothing
        
        Para = query
End Function
%>

 

#예제 소스
<%@LANGUAGE="VBSCRIPT"%>
<% Option Explicit %>
<%
'// 현 파라메터 불러오기
response.write Para("") & "<br>"
'// 결과 : chn=blog&mode=syaku&page=2

'// 현 파라메터 일부분 수정하기
response.write Para(Array(Array("mode","kor_no"))) & "<br>"
'// 결과 : chn=blog&mode=kor_no&page=2

'// 현 파라메터 일부분 삭제하기
response.write Para(Array(Array("&page",""))) & "<br>"
'// 결과 : chn=blog&mode=syaku

'// 현 파라메터 여러부분 수정및 삭제하기
response.write Para(Array(Array("chn","good"),Array("mode","end"),Array("&page",""))) & "<br>"
'// 결과 : chn=good&mode=end

'// 이전페이지 파라메터 읽어오기
response.write Para("HTTP_REFERER") & "<br>"
%>

'ASP' 카테고리의 다른 글

ASP 프레임워크(Framework)  (0) 2014.12.05
ASP 입력값 Replace (따옴표, 작은따옴표..)  (0) 2013.05.01
jquery 파일 업로드  (0) 2010.12.10
구글맵  (0) 2010.12.09
구글맵 API Key 생성 URL  (0) 2010.12.01