大きなプロジェクトでは、Linq2SqlをWebサービス(WCF)で使用することに決めました。一部のデータが追加された後(小さなコンソールアプリから顧客データをインポートした後)、ウェブサービスはそのアプリの存続期間中は鈍化していたことがすぐに分かりました。少し遅れてLinq2Sqlが遅くなる
アプリを再起動するたびに、最初はデータが高速にインポートされてから、10〜15分の読み込み後に速度が低下しました。
私は、メインアプリの小さな部分を模倣したサンプルアプリを作成しようとしました。私は追加する必要が
- 、私たちは、誰もがこのアプリの減速何についての手掛かりを持っていますかなどreqular SqlCommandオブジェクト/ SqlConnectionオブジェクトに置き換えるWebサービスでLinq2Sqlを除外する
を決めましたによって引き起こされる可能性がありますか?
は、ここではいくつかのデータベースクエリを模倣する「最小化」アプリのコードです:
のAppを含むSQL文は、テーブルを作成するために:あなたは、単一のデータ・コンテキストを使用している
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Linq2SqlTest
{
class Program
{
/*
* USE [Linq2SqlTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Adresse](
[id] [int] IDENTITY(1,1) NOT NULL,
[person_id] [int] NOT NULL,
[Gate] [nvarchar](50) NOT NULL,
[Poststed] [nvarchar](50) NOT NULL,
[By] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Adresse] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Adresse] WITH CHECK ADD CONSTRAINT [FK_Adresse_Person1] FOREIGN KEY([person_id])
REFERENCES [dbo].[Person] ([id])
GO
ALTER TABLE [dbo].[Adresse] CHECK CONSTRAINT [FK_Adresse_Person1]
*
*
* USE [Linq2SqlTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Items](
[ItemID] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [nchar](10) NOT NULL,
[PersonID] [int] NOT NULL,
[name] [nvarchar](50) NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED
(
[ItemID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Items] WITH CHECK ADD CONSTRAINT [FK_Items_Person] FOREIGN KEY([PersonID])
REFERENCES [dbo].[Person] ([id])
GO
ALTER TABLE [dbo].[Items] CHECK CONSTRAINT [FK_Items_Person]
*
* USE [Linq2SqlTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NOT NULL,
[AddedDate] [datetime] NOT NULL,
[ssn] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
*/
public static Random randomizer = new Random();
public static String GenerateName()
{
int nLetterCount = (randomizer.Next() % 5) + 3;
String s = "";
for (int i = 0; i < nLetterCount;i++)
{
int r = (randomizer.Next() % 26)+97;
s += Convert.ToChar(r);
}
return s;
}
public static String GenerateFullname()
{
String Fullname = "";
int nNameCount = randomizer.Next() % 3;
nNameCount++;
while (nNameCount>0)
{
if (Fullname.Length == 0)
Fullname = GenerateName();
else
Fullname += " " + GenerateName();
nNameCount--;
}
return Fullname;
}
static void Main(string[] args)
{
DatabaseDataContext db = new DatabaseDataContext();
for (int i = 0; i < 300000;i++)
{
int personid = randomizer.Next() % 100;
Person p = db.Persons.FirstOrDefault(_p=> _p.ssn == personid.ToString());
if (p == null)
{
p = new Person();
p.name = GenerateFullname();
p.ssn = personid.ToString();
p.AddedDate = DateTime.Now;
db.Persons.InsertOnSubmit(p);
db.SubmitChanges();
Adresse a = new Adresse();
a.person_id = p.id;
a.Gate = GenerateFullname();
a.Poststed = GenerateName();
a.By = GenerateName();
db.Adresses.InsertOnSubmit(a);
db.SubmitChanges();
int jj = randomizer.Next() % 10 + 1;
for (int j = 0; j < jj; j++)
{
Item item = new Item();
item.ItemNumber = randomizer.Next().ToString();
item.PersonID = p.id;
db.Items.InsertOnSubmit(item);
db.SubmitChanges();
}
}
else
{
int jj = randomizer.Next() % 10 + 1;
for (int j = 0; j < jj; j++)
{
int number = randomizer.Next();
Item item = db.Items.FirstOrDefault(_i => _i.ItemNumber == number.ToString());
if (item == null)
{
item = new Item();
item.ItemNumber = number.ToString();
item.PersonID = p.id;
db.Items.InsertOnSubmit(item);
}
else
{
item.ItemNumber = randomizer.Next().ToString();
}
db.SubmitChanges();
}
}
Console.WriteLine("\r" + i + " ");
}
}
}
}
どのくらい減速していますか?ここにスケールのアイディアを与えるために、実行時間の印刷物がありますか? – Servy
ANTS Profilerなどのアプリをプロファイリングしようとしたことがありますか? – Xaisoft
@Servy:サンプリングを行うために1つのアプリ(偽の顧客データなど)でデータ転送を行いましたが、当初は約6000人の顧客を抱えていました。 5分後には1分に1500人の顧客になり、10分後には約150人の顧客になりました。 – OddBeck