>För att få den data jag behöver i en fråga måste jag göra en selfJoin: ( tror jag ) kör nvarchar för jag använder unicode, och behöver lagra mycket text. Som jag antar det vill du slå upp två av egenskaperna för en produkt från product_content tabellen: Jo visst det är så jag vill ha det men det jag bara ha de som matchar med product tabellen. Så jag tror detta funkar . Tack! Men du kan som sagt bara lagra drygt 4000 tecken i en nvarchar-kolumn, hur mycket du än vill lagra mer. En rad i SQL Server kan max vara 8KB stor vilket ger ungefär 8060 bytes plus overhead. Eftersom unicode tar 2 bytes att lara för varje tecken så kan du max ha 4030 tecken, minus andra kolumners storlek. Varför använder du inte en LEFT OUTER JOIN som jag föreslagit? Det finns risk för du inte får med dig alla data annars. Det poster som saknar något värde som matchar nåon av joinerna kommer inte med i resultatet annars.Self join, bästa prestanda?
Har två tabeller med produktData.
product - id,product_id,----
product_content - id,product_id, field_id,content
För att få den data jag behöver i en fråga måste jag göra en selfJoin: ( tror jag )
...men är detta det bästa sättet, frågan käns långsam?
DB är stor och content, product_conten fält har typen nvarchar(8000), vilket ej går att ändra.
SELECT DISTINCT pc.product_id,pc.content ProductName,pc2.content ProdctDescr
FROM product p
JOIN product_content pc ON p.product_id = pc.product_id
JOIN product_content pc2 ON p.product_id = pc2.product_id
WHERE pc.descr_fieldname_id = 44 --ProdctDescrSv: Self join, bästa prestanda?
Vilken är den data du behöver då? Jag tror inte du behöver en self join, och du gör dessutom ingen selfjoin i det exempel du skrev.
product - id,product_id,----
product_content - id,product_id, field_id,content
>...content, product_conten fält har typen nvarchar(8000), vilket ej går att ändra.
Det finns ingen anledning att ha datatyp nvarchar(8000) på en kolumn eftersom du ändå inte kan lagra mer än 4030 tecken i den (cirka, beroende på andra kolumner i tabellen) eftersom varje tecken tar två bytes lagringsplats.
Att frågan känns långsam beror väl på dåliga index. Dessutom ser den inte korrekt ut, borde det inte vara WHERE pc2.descr_fieldname_id = 44 --ProdctDescr?Sv: Self join, bästa prestanda?
berhöver få ut allt i en query, product_contnent besrkiver namn, storlek, år etc
allt detta finns i content fältet och styrs via field_id.
måste joina på product_id Sv: Self join, bästa prestanda?
SELECT DISTINCT pc.product_id, pc.content ProductName, pc2.content ProdctDescr
FROM product p LEFT OUTER JOIN
product_content pc ON p.product_id = pc.product_id AND pc.descr_fieldname_id = 43 LEFT OUTER JOIN
product_content pc2 ON p.product_id = pc2.product_id AND pc2.descr_fieldname_id = 44
Om det är så att descr_fieldname_id för ProductName är 43 och 44 för ProdctDescr.Sv: Self join, bästa prestanda?
SELECT DISTINCT pc.product_id, pc.content ProductName, pc2.content ProdctDescr
FROM product p
JOIN product_content pc ON p.product_id = pc.product_id AND pc.descr_fieldname_id = 43
JOIN product_content pc2 ON p.product_id = pc2.product_id AND pc2.descr_fieldname_id = 44
Fattar dock inte skillnaden då jag tidigare använde :
WHERE AC.DESCR_FIELDNAME_ID = 44
AND AC2.DESCR_FIELDNAME_ID = 41
Eller är det någon skillnad, får exakt samma resultat....jag är nog bara seg, det är ju fredag! Tack ändåSv: Self join, bästa prestanda?
Designen låter lite tveksam, constraints blir t ex onödigt svåra att uttrycka, men den fungerar väl så visst.
Att du joinar på product_id gör det inte till en self join, den görs från en tabell till samma tabell igen.Sv: Self join, bästa prestanda?