私は次のように定義されたデータベースを持っています:
create table Classes (
Id INT not null,
Text NVARCHAR(255) null,
primary key (Id)
)
create table Documents (
Id INT not null,
Title NVARCHAR(MAX) null,
Abstract NVARCHAR(MAX) null,
Year INT null,
primary key (Id)
)
create table Documents_Tokens (
DocumentFk INT not null,
TokenFk INT not null
)
create table Documents_Classes (
DocumentFk INT not null,
ClassFk INT not null
)
create table Tokens (
Id INT not null,
Text NVARCHAR(255) null,
primary key (Id)
)
ドキュメントとクラス、およびドキュメントとトークンの間にはam:mの関係があります。
特定の統計を確認したいと思います。1つの統計はAで、クラスとトークンの共起を測定します。私は現在、この統計を次のように決定しています。
with combs as
(
select
a.Id as classid,
a.text as class,
b.Id as tokenid,
b.text as token
from dbo.Classes as a
cross join dbo.Tokens as b
)
,A as
(
select token, class, count(distinct DocumentFk) as A from
(
select
token,
class,
DocumentFk
from combs
inner join dbo.Documents_Classes on classid = ClassFk
group by token, DocumentFk, class
intersect
select
token,
class,
DocumentFk
from combs
inner join dbo.Documents_Tokens on tokenid = tokenFk
group by token, DocumentFk, class
) T group by token, class
)
...
残念ながら、このクエリには時間がかかります(クエリアナライザを実行した後にインデックスを追加しました)。これはAを決定するための最も効率的な方法ですか?そうでない場合は、より良い方法がありますか?また、基盤となるデータベース構造を変更して、処理を高速化することもできます...
フィードバックをいただければ幸いです。