Al enige tijd ben ik me aan het verdiepen in optimalisatie in Sql Server 2005. Nu lees ik dat je een view moet gebruiken als je veel joins gebruikt. Gedaan, maar leverde eigelijk geen verschil. Daarna kwam ik iets tegen dat je views kan indexeren. Ook hier op Got wordt geroepen dat het kan, maar kan niet echt vinden hoe iemand het werkend gekregen heeft. Dus gegoogled, diverse links gevonden waaronder: http://www.akadia.com/services/sqlsrv_matviews.html
Dit heb ik geprobeerd met een simpele (ansi) inner join tussen 2 tabbelen met een gezamelijke resultset van zo'n 800.000 records. Groot genoeg lijkt me dat er op de view gequeried dient te worden en niet op de achterliggende base tables.Ergens heb ik gelezen dat de resultset wel enige grootte moet hebbel wil deze echt 1 op 1 gebruikt wordt voor de query op de view.
Als voorbeeld heb ik deze code uitgevoerd in Sql Server Management Studio Express
Om te testen of er op de view of op de base tables gequeried wordt gebruik ik deze code:
Dit levert dit op:
Ook een join op 5 tabellen, een gecombineerde unique clusterd key geprobeerd, maar krijg het niet voor elkaar. Wat zie ik over het hoofd?
Dit heb ik geprobeerd met een simpele (ansi) inner join tussen 2 tabbelen met een gezamelijke resultset van zo'n 800.000 records. Groot genoeg lijkt me dat er op de view gequeried dient te worden en niet op de achterliggende base tables.Ergens heb ik gelezen dat de resultset wel enige grootte moet hebbel wil deze echt 1 op 1 gebruikt wordt voor de query op de view.
Als voorbeeld heb ik deze code uitgevoerd in Sql Server Management Studio Express
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| use EenDummyDatabase go SET SHOWPLAN_ALL OFF GO SET NUMERIC_ROUNDABORT OFF GO SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL ON GO SET ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON GO -- Create the Index View DROP VIEW VW_summary go CREATE VIEW VW_summary WITH SCHEMABINDING AS SELECT tabelA.id AS a_id, tabelB.id as b_id, tabelB.amount from dbo.tabelA inner join dbo.tabelB on tabelA.id = tabelB.tabelA_id GO -- Create UNIQUE CLUSTERED index on the view CREATE UNIQUE CLUSTERED INDEX IVW_summary ON VW_summary (b_id) GO |
Om te testen of er op de view of op de base tables gequeried wordt gebruik ik deze code:
SQL:
1
2
3
4
| SET SHOWPLAN_ALL ON go select top 100 * from VW_summary |
Dit levert dit op:
code:
1
2
3
4
5
| select top 100 * from VW_summary
|--Top(TOP EXPRESSION:((100)))
|--Hash Match(Inner Join, HASH:([EenDummyDatabase].[dbo].[tabelA].[id])=([EenDummyDatabase].[dbo].[tabelB].[tabelA_id]), RESIDUAL:([EenDummyDatabase].[dbo].[tabelB].[tabelA_id]=[EenDummyDatabase].[dbo].[tabelA].[id]))
|--Index Scan(OBJECT:([EenDummyDatabase].[dbo].[tabelA].[deleted]))
|--Clustered Index Scan(OBJECT:([EenDummyDatabase].[dbo].[tabelB].[PK_tabelB])) |
Ook een join op 5 tabellen, een gecombineerde unique clusterd key geprobeerd, maar krijg het niet voor elkaar. Wat zie ik over het hoofd?