데이터가 제법 많은 목록에서 제목을 LIKE 검색하는 경우,

혹은 공백을 포함한 문자열의 공백 제거 후 검색을 하는 경우,

속도 이슈가 발생한다. 


이런 경우 DBMS에서 제공하는 FullTextSearch 기능을 사용하면 훨씬 빠른 결과를 얻을 수 있다. 


그런데 Devexpress GridControl을 사용하는 경우.... 

AutoFilter에서 검색시 Filter 정보에는 

contains([검색필드명], N'검색어') 로 입력되며,


실제로 DBMS에서 실행되는 Query문을 확인해보면 

    (isnull(CharIndex(N'검색어', [검색필드명]), 0) > 0 


이런 식이다... 대략 낭패 OTL


어찌해야 AutoFilter에서  FullTextSearch를 사용할 수 있을까?


찾아보니 아래와 같이 ICustomFunctionOperatorFormattable 인터페이스를 구현한 클래스를 추가하면 가능하다는 것을 알았다.


< 구현 방법 >


1. ICustomFunctionOperatorFormattable 를 구현한 클래스를 생성한다.

이름 지정과 포멧 함수 구현이 핵심인 듯...

using System.Data;
using DevExpress.Xpo.DB;
using DevExpress.Data.Filtering;

public class FullTextContainsFunction : ICustomFunctionOperatorFormattable {
    #region ICustomFunctionOperator Members
    // Evaluates the function on the client 
    public object Evaluate(params object[] operands) {
        // Full text search is not available on the client and should not be used there 
        throw new NotImplementedException();
    }
    public string Name {
        get { return "FullTextContains"; }
    }
    public Type ResultType(params Type[] operands) {
        return typeof(bool);
    }
    #endregion
    #region ICustomFunctionOperatorFormattable Members
    // The function's expression to be evaluated on the server 
    public string Format(Type providerType, params string[] operands) {
        // This example implements the function for MS SQL databases only 
        if (providerType == typeof(MSSqlConnectionProvider))
            return string.Format("contains({0}, {1})", operands[0], operands[1]);
        throw new NotSupportedException(string.Concat("This provider is not supported: ", 
            providerType.Name));
    }
    #endregion
}


2. 프로그램 시작시 ICustomFunctionOperatorFormattable 를 구현한 클래스의 인스턴스를 CriteriaOperator에 커스텀 함수로 등록한다.


// program.cs 나 MainForm 에 추가한다.

CriteriaOperator.RegisterCustomFunction(new FullTextContainsFunction());



3. 그리고 필터에서 검색시 아래와 같이 필터를 입력한다.


CriteriaOperator.Parse("FullTextContains([필드명], '검색어')");




결과는 아주 잘 작동한다.


* 참고 : https://documentation.devexpress.com/CoreLibraries/3246/DevExpress-ORM-Tool/Examples/How-to-Implement-a-Full-Text-Search







간혹, DB가 손상되는 경우가 있다. 


하지만 이런 경우에도 DB 백업시 Checksum 옵션을 사용하지 않으면 정상 백업이 가능하다.

심지어 CheckSum 옵션을 사용했는데도 불구하고 정상 백업되는 경우가 있다. 


이런 일을 방지하고자 한다면, 

우선 dbcc checkdb 로 오류 검사를 한후 

오류가 없는경우 Database Backup 을 하면 된다.



SET @sql = 'DBCC CHECKDB (' + QuoteName(@name) + ') WITH ... options ...' EXEC sp_executesql @sql IF @@ERROR <> 0 BEGIN .. Error Handler ... END ... Continue with backup ...


dbcc checkdb로 해당 DB를 체크한 후, 오류 발생시 @@ERROR가 0이 아니므로 가능한 코드겠다




* 참고 

@@ERROR : https://technet.microsoft.com/ko-kr/library/ms190193(v=sql.105).aspx

* 원문

http://forums.sqlteam.com/t/only-create-backup-if-dbcc-checkdb-is-ok/9459/2


DB 에러 로그를 확인해보면.. 서비스를 재시작하지도 않았는데..


시도때도 없이 database를 시작하고 있다.

찾아봤더니.. AUTO_CLOSE 옵션 때문이라고함.

기본 ON으로 되어있어.. 자꾸 재시작하는 것~

이것 때문에 IO 부하가 생기고 Performance도 떨어짐

가끔 프로그램에서 DB 연결이 끊어지는 오류가 발생하기도 한다.


해결방법은


ALTER DATABASE [데이터베이스명] SET AUTO_CLOSE OFF


AUTO_CLOSE 를 OFF 하면 된다고.. 함.



* 참고

https://msdn.microsoft.com/en-us/library/ms190249.aspx

https://msdn.microsoft.com/ko-kr/library/bb402929.aspx

http://blog.sqlauthority.com/2016/09/22/sql-server-set-auto_close-database-option-off-better-performance/

 

1. -- DB분리 ( DB가 사용중 일 경우 분리 안됨. 모든 연결을 끊고 한다.)
    use master
    exec sp_detach_db [데이터베이스명], 'true'

 

 

2. -- 파일 이동
     mdf, ldf 파일을 이동한다.

 

 

3. -- DB 붙이기

exec sp_attach_db [데이터베이스명], 'MDF파일 물리 경로', 'LDF파일 물리 경로'

 

       3.1. -- mdf만 붙이기
            exec sp_attach_single_file_db [데이터베이스명], 'MDF파일 물리 경로'

 

3.2. -- 붙인DB 가 (읽기전용)인경우
     옮긴 디렉터리 권한을 수정한 후 DB를 다시 분리(sp_detach_db) 후 붙인(sp_attach_db)다.

 

 

MSSQL 에서 천단위 컴마를 찍고 싶을 때

 

SELECT CONVERT(VARCHAR(50), CAST(20000 AS MONEY), 1)

 

결과는  20,000.00

 

MONEY 타입은 소숫점 둘째자리까지 표현됨.

소숫점을 없애고 싶으면 REPLACE 하면됨

 

SELECT  REPLACE(CONVERT(VARCHAR(50), CAST(20000 AS MONEY), 1) , '.00', '')

 

결과는 20,000

 

 

 

MSSQL의 CAST AND CONVERT 도움말 중

money and smallmoney Styles

When expression is money or smallmoney, style can be one of the values shown in the following table. Other values are processed as 0.

Value

Output

0 (default)

No commas every three digits to the left of the decimal point, and two digits to the right of the decimal point; for example, 4235.98.

1

Commas every three digits to the left of the decimal point, and two digits to the right of the decimal point; for example, 3,510.92.

2

No commas every three digits to the left of the decimal point, and four digits to the right of the decimal point; for example, 4235.9819.

126

Equivalent to style 2 when converting to char(n) or varchar(n)

 

 

 

 

참고  : http://msdn.microsoft.com/en-us/library/ms187928.aspx

* tempDB 를 tempDB2 로 변경하기

ALTER DATABASE tempDB
SET single_user
go

ALTER DATABASE tempDB
MODIFY NAME = tempDB2
go

ALTER DATABASE tempDB
SET multi_user

  1. 돼지고기국밥 2019.12.27 17:45 신고

    위 코드가 안되면 이걸로

    ALTER DATABASE [YourDbName]
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE;


SELECT DATEPART(dw, GETDATE()) 

결과 >
1 - 일
2 - 월
3 - 화
4 - 수
5 - 목
6 - 금
7 - 토

+ Recent posts