Optymalizacja zapytania SQL

0

Witajcie.
Nie jestem specjalistą od SQL ale samemu ciekawi mnie jakie jest rozwiązanie następującego problemu.
Mianowicie mam problem, gdyż moje zapytanie działa poprawnie, jednak bardzo wolno.
Może jest jakaś opcja optymalizacji samego zapytania?

select MCDCDIT.createdDate as DataPowstania,
	PJBOM.TransDate as DataKonsumpcji,
	ID.M_CDCDIId as CDI,
	IT.itemGroupId as GrupaTowaru,
	PJBOM.itemId as KodTowaru
	from InventDim as ID
	join ProdJournalBOM as PJBOM on ID.inventDimId = PJBOM.inventDimId
	join InventTable as IT on PJBOM.itemId = IT.itemId
	join M_CDCDITable as MCDCDIT on ID.M_CDCDIId = MCDCDIT.CDIId
	where (MCDCDIT.createdDate >= (@DateFrom)) 
		and (PJBOM.itemId = (@ItemId))
		and (PJBOM.dataAreaId = '63')
5

Zapytanie jest proste i nie ma co w nim optymalizować, jeśli chodzi o sql.
Bez znajomości planu zapytania, statystyk, i czy są w ogóle indeksy, strzelałbym że najwięcej można zyskać przez założenie indeksu warunkowego na (PJBOM.dataAreaId = '63', PJBOM.itemId) i indeksu na (MCDCDIT.createdDate).

0

Hej,
jeżeli jeden raz wykonujesz takie zapytanie lub raz na jakiś czas, to nie ma się co zastanawiać, jeżeli działa to w sensownym czasie. Jeżeli jednak to zapytanie jest wykorzystywane w jakimś procesie real time, to warto się zastanowić może nad nieco inną strukturą bazy. Moim zdaniem, strukturę bazy powinno się tworzyć pod sposób jej wykorzystywania, a ten kierunek myślenia, chyba nie jest za bardzo typowy w bazach danych :) jeżeli się mylę, to wyprowadźcie mnie z błędu :)

0

Zakładam, że warunek na datę nie odcina zbyt wielu rekordów. Wtedy wystarczy zmusić engine, żeby użył w pierwszej kolejności indeksu PJBOM(itemId, dataAreaId). Zakładam, tak jak koledzy pisali, że pola joina są poindeksowane. Na oracle'u nazywa się to hintem, na mssql musisz sam sprawdzić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1