SQLデータベース突然の待ち時間の問題からリアルタイムデータの照会
-
22-08-2019 - |
質問
私たちは、1秒毎に複数のユーザーのためのリアルタイムデータを表示するようになっているアプリケーションをテストしています。 128行の新しいデータをSQL datatbaseにサーバアプリケーションによって、それぞれ1秒を挿入されて、それは別の参考古い128行と一緒にすべてのユーザーが照会する必要があります。
私たちは、クエリ時間をテストし、それが30 milliseondsを超えませんでした。また、クエリを呼び出すインタフェース機能は、データを処理して50以上のミリ秒を取得し、すべての
ませんでした私たちは、スレッドと、各ユーザーごとにSQL接続を作成し、テスト用のアプリケーションを開発しました。ユーザは、各1秒7つのクエリを発行します。すべてが正常起動し、どのユーザーが7データ系列の300以上のミリ秒(クエリ)を取りません。しかし、10分後に、待ち時間が1秒を超え、増加を続けています。私たちは、この問題は、同時に複数の要求を処理するSQLサーバ2008からかどうかを知り、そしてどのような問題を克服するためにはありません。
それが役立つかもしれない場合は、ここに私たちのテストクライアントです。クライアントとサーバは、8 GBのRAMと同じ8 CPUマシン上で行われていることに注意してください。今、私たちは、データベースが私たちのために最適なソリューションではないかもしれないかどうかを疑問視しています。
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の知識に基づいている - それはまだ正しいかどうかわからない。
あなたがインサートの多くを行う場合は、インデックスは最終的に時代遅れになりますし、インデックスが再構築されるまで、サーバーは自動的にテーブルスキャンに切り替わります。これのいくつかは自動的に行われますが、パフォーマンスのこの種が重要な場合は、定期的に再インデックスを強制することもできます。