Jag har en vy som joinar in ett flertal tabeller till min huvudtabell. Låt säga att jag sedan ställer en fråga som endast hämtar kolumner från huvudtabellen i vyn, kommer joinarna ändå att utföras och slöa ner frågan, eller får jag ungefär samma prestanda som om jag ställt frågan "SELECT Col1,Col2 FROM [HuvudTabell]? Jag kan nästan svära på att hela frågan körs, oavsett vilka kolumner du tar med. Enklast är att titta på execution plan. Martin, självklart, det borde vara det första jag testade i st f att fråga :-) Testade lite snabbt här och det verkar mycket riktigt som om 2005:an är kapabel att utesluta tabeller som inte ingår i resultatet Jag har följande tabeller (kraftigt förenklat) : Hej, Det kanske är självklart, men som jag ser det gör jag en left join (så det är ointressant om det extra villkoret utesluter rader i den joinade tabellen) , och frågar inte efter någon kolumn i den tabellen...då borde den väl inte behöva utföra joinen? Du kan vara tvungen att förklara som om jag vore tre år gammal :-) Om du har flera poster i FreeFieldComboItems där villkoret "FC1.ID = dbo.Task.FreeCombo1" är sant kommer du få "dubletter" i resultatet. Därför kommer innehållet i FreeFieldComboItems påverka resultatet även om det inte finns någon kolumn därifrån. Ok jag förstår. Kombinationen "FC1.ID = dbo.Task.FreeCombo1 AND FC1.Index=0" ger dock alltid en rad men det kan ju vara tufft för SQL-servern att luska ut, utan att fysiskt joina tabellerna...surt men det går kanske inte att komma runt... Generellt sett så måste optimizern <b>alltid</b> pilla på alla tabeller.intern hantering av join:ar
Sv: intern hantering av join:ar
Men det kan ju hända att någon DBMS klarar av att slopa de tabeller som inte behövs för att snabba upp det hela, men jag tvivlar på att det finns en sådan logik.Sv: intern hantering av join:ar
Om jag förstått det rätt så eliminerar SQL2005 oanvända tabeller men SQL2000 gör det bara ibland.Sv:intern hantering av join:ar
Skall testa detta när jag kommer hem...jag skall försöka komma ihåg att publicera resultaten här...Sv:intern hantering av join:ar
Sv: intern hantering av join:ar
<info>
Task
====
Header
Project
=======
Name
FreeFieldComboItems
===================
ID
Value
</info>
och sedan följande vy:
<code>
ALTER VIEW [dbo].[TaskViewTest]
AS
SELECT dbo.Task.Header
dbo.Project.Name AS ProjectName,
FC1.Value as FreeComboValue1
FROM dbo.Task
LEFT OUTER JOIN dbo.Project ON dbo.Project.ID = dbo.Task.ProjectID
LEFT OUTER JOIN dbo.FreeFieldComboItems FC1 ON FC1.ID = dbo.Task.FreeCombo1 and FC1.[Index]=0
</code>
Det skumma är att om jag ställer följande fråga:
<code>
SELECT Header FROM TaskViewTest
</code>
så skippar den enligt execution plan:en Projekt-joinen men INTE FreeFieldComboItems-joinen!? Några tips?Sv:intern hantering av join:ar
Eftersom du ställer ett explicit villkor FC1.[Index]=0
så vore det ju rent felaktigt av DBMS att hoppa över det, eller hur :)Sv: intern hantering av join:ar
Sv:intern hantering av join:ar
/JohanSv: intern hantering av join:ar
Sv:intern hantering av join:ar
MEN!
Det finns alltid (nästan) ett (eller flera) undantag.
Läs om ett undantag här:
http://sqlblog.com/blogs/tibor_karaszi/archive/2008/01/12/non-trusted-constraints-and-performance.aspx
/Håkan