الاستعلام عن البيانات في الوقت الحقيقي من مشكلة الكمون المفاجئة قاعدة بيانات SQL

StackOverflow https://stackoverflow.com/questions/872400

  •  22-08-2019
  •  | 
  •  

سؤال

ونحن اختبار أحد التطبيقات التي من المفترض أن عرض البيانات في الوقت الحقيقي لعدة مستخدمين على أساس الثاني 1. يتم إدخال بيانات جديدة من 128 صفوف كل ثانية واحدة عن طريق تطبيق الملقم إلى datatbase SQL ثم لا بد من الاستعلام من قبل كافة المستخدمين مع القديمة المرجعية 128 صفوف أخرى.

ولقد اختبرنا الوقت الاستعلام وأنها لم تتجاوز 30 milliseonds. أيضا وظيفة اجهة استدعاء الاستعلام لم يستغرق أكثر من 50 ميلي ثانية مع معالجة البيانات وجميع

وقمنا بتطوير تطبيق الاختبار الذي يخلق موضوع واتصال SQL لكل مستخدم. يصدر المستخدم 7 الاستفسارات كل 1 ثانية. كل شيء يبدأ غرامة، وأي مستخدم يحتاج إلى أكثر من 300 ميلي ثانية لسلسلة 7 بيانات (استعلامات). ومع ذلك، وبعد 10 دقيقة، وتجاوز الكمون 1 ثانية ويحافظ على زيادة. نحن لا نعرف إذا كانت المشكلة هي من خادم SQL 2008 التعامل مع طلبات متعددة في نفس الوقت، وكيفية التغلب على هذه المشكلة.

وهنا لدينا العميل اختبار ما اذا كان قد تساعد. لاحظ أن العميل والخادم تتم على نفس الجهاز 8 وحدة المعالجة المركزية مع 8 GB 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