私はSQL Server 2012を使用していますが、検索のためのクエリがありますが、実行に時間がかかりすぎます(30行= 6秒)SQL Serverクエリのインデックスが失われましたか?
実行計画をチェックしましたが、インデックスを置くことを提案し、私はどのように私はクエリをスピードアップすることができません。ここで
は私のクエリです:SELECT
dbo.tbRV.ID, dbo.tbRV.IDCompagnie,
dbo.tbPatient.Nom + N', ' + dbo.tbPatient.Prenom AS NomPrenomPatient,
dbo.tbRV.DateRV, dbo.tbRV.HeureDebut,
dbo.tbRV.IDRessource,
coalesce(dbo.tbRessource.Nom ,'') + ' ' + coalesce(dbo.tbRessource.Prenom,'') AS NomPrenomRessource,
dbo.tbPatient.NoApp,
dbo.tbPatient.NomEtablissement, dbo.tbPatient.Adresse1,
tbAdresse.Ville, dbo.tbPatient.TelephoneDomicile,
dbo.tbPatient.TelephoneTravail,
dbo.tbPatient.TelephonePortable,
case
when DD.id is not null then DD.description
else dbo.tbRVObjet.IDObjet
end as idobjet,
dbo.tbPatient.Nom_SansAccent, dbo.tbPatient.Prenom_SansAccent,
dbo.tbPatient.Nom, dbo.tbPatient.Prenom,
dbo.tbRV.IDPatient, dbo.tbPatient.NoAssuranceMaladie,
dbo.tbPatient.DateNaissance, dbo.tbRV.Transit, dbo.tbRV.Annuler,
tbAdresse.Pays, tbAdresse.Province, dbo.tbPatient.Adresse2,
dbo.tbPatient.CodePostal,
case
when AA.id is not null and AA.ID = tbrvobjet.ID then 1 else 0 end as onlyFirst
FROM
tbPatient
INNER JOIN
tbRV ON tbPatient.ID = tbRV.IDPatient
INNER JOIN
tbRessource ON (tbRV.IDRessource = tbRessource.ID) AND (tbRV.IDCompagnie = tbRessource.IDCompagnie)
INNER JOIN
tbRVObjet ON tbRV.ID = tbRVObjet.IDRV
OUTER APPLY
dbo.fn_GetFirstIDRVObjet(tbrv.id) AA
OUTER APPLY (SELECT A.ID, A.Description
FROM tbForfaitEntete A
WHERE A.ID = tbRVObjet.IDForfait
AND ISNULL(tbRVObjet.IsForfaitEntete, 0) = 1) DD
OUTER APPLY (SELECT B.Description
FROM tbRVObjet A
JOIN tbForfaitEntete B ON (A.IDForfait = B.ID AND ISNULL(A.IsForfaitEntete, 0) = 1)
WHERE AA.ID = A.id) BB
OUTER APPLY (SELECT tbPaysISO.Pays, tbProvinceISO.Province, tbVilleISO.Ville
FROM tbPaysISO
JOIN tbProvinceISO ON (tbPaysISO.Langue = tbProvinceISO.Langue)
AND (tbPatient.ProvinceISOChar = tbProvinceISO.ProvinceISOChar)
JOIN tbVilleISO ON (tbProvinceISO.Langue = tbVilleISO.Langue)
AND (tbPatient.IdVille = tbVilleISO.IDVille)
WHERE tbPaysISO.Langue = tbpatient.CodeLangue
AND tbPaysISO.PaysISOChar3 = tbpatient.PaysISOChar3) tbAdresse
、ここでXMLでの実行計画です:
EDIT:https://www.brentozar.com/pastetheplan/?id=HkVYeasNW
:は、ここに私のクエリプランのURLです210
ここに私の検索クエリです:
Select
ID, IDPatient, NomPrenomPatient, DateNaissance, NoAssuranceMaladie,
NomEtablissement, Adresse1, Adresse2, NoApp, ville, province, pays,
CodePostal, TelephoneDomicile, TelephoneTravail, TelephonePortable,
DateRV, HeureDebut, IDObjet, IDRessource, NomPrenomRessource,
Annuler, Transit
From
rqAfficheRechercheRV
Where
IDCompagnie = 1
And (isnull(NomPrenomRessource, '') + isnull(NoApp, '') + isnull(NomEtablissement, '') + isnull(Adresse1, '') + isnull(Ville, '') + isnull(TelephoneDomicile, '') + isnull(TelephoneTravail, '') + isnull(TelephonePortable, '') + isnull(IDObjet, '') + isnull(Nom_SansAccent, '') + isnull(Prenom_SansAccent, '') + isnull(Nom, '') + isnull(Prenom, '') + isnull(IDPatient, '') + isnull(NoAssuranceMaladie, '') + isnull(convert(varchar, DateNaissance), '') + isnull(Pays, '') + isnull(Province, '') + isnull(Adresse2, '') + isnull(CodePostal, '')) like '%881-1360%'
And isnull(onlyFirst,0) = 1
Order by
Nom, Prenom, DateRV DESC, HeureDebut ASC
rqAfficheRechercheRVは
あなたの計画をスクリーンショット形式で読みにくいです。おそらくこれを使用できますか:https://www.brentozar.com/pastetheplan/? IDフィールドにインデックスをクラスタ化していると仮定しますが、LangueフィールドとPaysISOChar3フィールドのインデックスは何ですか? –
@ JacobH情報のおかげで私の質問プランに入れました.PaysISOChar3のフィールドはvarcharフィールドです。 – alexandre
通常、検索クエリにwhere句があります。これはテーブル内のすべてを返すようです。アプリケーションでフィルタリングしますか? – Jesse