문제

우리가 테스트는 응용 프로그램을 실시간 데이터에 대한 여러 사용자는 1 초 단위로.새로운 데이터의 128 행 삽입되는 각각의 중 두 번째에 의해 서버 응용 프로그램으로 SQL datatbase 그것은 쿼리에 의해 모든 사용자와 함께 또 참조 128 개의 행이 있습니다.

우리가 테스트 쿼리 시간 및 초과 30milliseonds;또한 인터페이스 함수를 호출하는 쿼리를 가지고 가지 않은 이상 50 밀리초 단위로 데이터를 처리하고 모든

우리 개발 테스트 응용 프로그램을 생성하는 스레드 SQL 연결 각 당 사용자.사용자 문제를 7 쿼리를 각 1 초입니다.모든 편리하게 액세스 할 수없고,사용자가 300 밀리 대한 7 데이터 시리즈(쿼리).그러나,이후 10 분간,대기 시간을 초과한 1 초에 계속 증가하고 있다.우리는 알지 못하는 경우 문제가에서 SQL server2008 처리에 여러 요청을 같은 시간,그리고 어떻게 극복하기 위해 이러한 문제입니다.

여기 우리의 테스트는 클라이언트는 경우 그것은 도움이 될 수 있습니다.참고하는 클라이언트와 서버에 같은 8CPU 가진 기계 8gb RAM.이제 우리는지 의문을 제기하는 데이터베이스지 않을 수도 있습 있는 최적의 솔루션입니다.

   class Program
{
    static void Main(string[] args)
    {   
        Console.WriteLine("Enter  Number of threads");
        int threads = int.Parse(Console.ReadLine());
        ArrayList l = new ArrayList();
        for (int i = 0; i < threads; i++)
        {
            User u = new User();
            Thread th = new Thread(u.Start);
            th.IsBackground = true;
            th.Start();
            l.Add(u);
            l.Add(th);
        }
        Thread.CurrentThread.Join();
        GC.KeepAlive(l);
    }
}
class User
{
    BusinessServer client ; // the data base interface dll
    public static int usernumber =0 ;

    static TextWriter log;
    public User()
    {
        client = new BusinessServer(); // creates an SQL connection in the constructor
        Interlocked.Increment(ref usernumber);
    }

    public static void SetLog(int processnumber)
    {
        log = TextWriter.Synchronized(new StreamWriter(processnumber + ".txt"));
    }
    public void Start()
    {
        Dictionary<short, symbolStruct> companiesdic = client.getSymbolData();
        short [] symbolids=companiesdic.Keys.ToArray();
        Stopwatch sw = new Stopwatch();
        while (true)
        {

            int current;
            sw.Start();
            current = client.getMaxCurrentBarTime();
            for (int j = 0; j < 7; j++)
            {   
                client.getValueAverage(dataType.mv, symbolids,
                    action.Add, actionType.Buy,
                    calculationType.type1,
                    weightType.freeFloatingShares, null, 10, current, functionBehaviour.difference); // this is the function that has the queries

            }
            sw.Stop();
            Console.WriteLine(DateTime.Now.ToString("hh:mm:ss") + "\t" + sw.ElapsedMilliseconds);
            if (sw.ElapsedMilliseconds > 1000)
            {
                Console.WriteLine("warning");
            }
            sw.Reset();

            long diff = 0;//(1000 - sw.ElapsedMilliseconds);
            long sleep = diff > 0 ? diff : 1000;
            Thread.Sleep((int)sleep);
        }
    }



}
도움이 되었습니까?

해결책

나는 생각한 쿼리를 자체입니다.지 않을 수도 있습니다 시간이 많이 걸어 데이터베이스의 양으로 데이터 증가에 따라 필요할 수 있습니다 더 많은 시간과 방법에 따라 보입니다.당신이 검사를 쿼리할 계획이 있는지 확인을 하는 인덱스를 조회하는 대신 표 검사 데이터를 찾?지 않으면,아마도를 도입 인덱스에 도움이 될 것이다.

다른 팁

경고 :이 답변은 MSSQL 2000에 대한 지식을 기반으로합니다. 여전히 정확한지 확실하지 않습니다.

많은 삽입물을 수행하면 인덱스가 결국 오래되지 않고 서버가 인덱스가 재건 될 때까지 자동으로 테이블 스캔으로 전환됩니다. 이 중 일부는 자동으로 수행되지만 이런 종류의 성능이 중요하다면 정기적으로 리인덱싱을 강제로 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top