SORU
16 Temmuz 2009, PERŞEMBE


Zaman geçip Uygulamak kullanmak İç Katılabilir miyim?

CROSS APPLY kullanmanın temel amacı nedir?

cross apply Eğer bölümleme eğer büyük veri kümelerini seçme zaman daha verimli olabileceğini okudum (belli belirsiz, İnternet üzerinden mesaj yoluyla). (Disk belleği akla geliyor)

Ben deCROSS APPLY doesn't require a UDF as the right-table. biliyorum

INNER JOIN sorguların çoğu (bir-çok ilişkileri), onları CROSS APPLY, kullanmak için yeniden yazın olabilir ama onlar hep bana denk yürütme planları vermek.

Herkes INNER JOIN de çalışır beni nereye CROSS APPLY Bu durumda bir fark yaptığında iyi bir örnek verebilir misiniz?


Düzenleme:

İşte yürütme planları tam olarak aynı olduğu önemsiz bir örnek. (Onlar beni farklı yerde ve cross apply daha hızlı, daha verimli)/nerede olduğunu gösteriyor

create table Company (
    companyId int identity(1,1)
,   companyName varchar(100)
,   zipcode varchar(10) 
,   constraint PK_Company primary key (companyId)
)
GO

create table Person (
    personId int identity(1,1)
,   personName varchar(100)
,   companyId int
,   constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
,   constraint PK_Person primary key (personId)
)
GO

insert Company
select 'ABC Company', '19808' union
select 'XYZ Company', '08534' union
select '123 Company', '10016'


insert Person
select 'Alan', 1 union
select 'Bobby', 1 union
select 'Chris', 1 union
select 'Xavier', 2 union
select 'Yoshi', 2 union
select 'Zambrano', 2 union
select 'Player 1', 3 union
select 'Player 2', 3 union
select 'Player 3', 3 


/* using CROSS APPLY */
select *
from Person p
cross apply (
    select *
    from Company c
    where p.companyid = c.companyId
) Czip

/* the equivalent query using INNER JOIN */
select *
from Person p
inner join Company c on p.companyid = c.companyId

CEVAP
16 Temmuz 2009, PERŞEMBE


Herkes KATILABİLİR de çalışır bana nerede ne zaman HAÇ GEÇERLİ bu durumda bir fark yaratıyor iyi bir örnek verebilir misiniz?

Blogumda ayrıntılı performans karşılaştırması için: makaleye bakın

CROSS APPLY Daha iyi JOIN basit bir durumda olan şeyler üzerinde çalışıyor.

Bu bir t1 her kayıt için t2 3 son kayıtları seçer:

SELECT  t1.*, t2o.*
FROM    t1
CROSS APPLY
        (
        SELECT  TOP 3 *
        FROM    t2
        WHERE   t2.t1_id = t1.id
        ORDER BY
                t2.rank DESC
        ) t2o

Kolayca INNER JOIN bir durum ile formüle edilemez.

Muhtemelen CTE'ler ve pencere fonksiyonu . kullanmak gibi bir şey yapabilirsin

WITH    t2o AS
        (
        SELECT  t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
        FROM    t2
        )
SELECT  t1.*, t2o.*
FROM    t1
INNER JOIN
        t2o
ON      t2o.t1_id = t1.id
        AND t2o.rn <= 3

bu daha okunabilir ve daha az verimli muhtemelen ama.

Güncelleme:

Kontrol ettim sadece.

master id PRIMARY KEY 20,000,000 kayıtların bir tablo.

Bu sorgu:

WITH    q AS
        (
        SELECT  *, ROW_NUMBER() OVER (ORDER BY id) AS rn
        FROM    master
        ),
        t AS 
        (
        SELECT  1 AS id
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    t
JOIN    q
ON      q.rn <= t.id

bu sırada 30 neredeyse saniye için çalışır:

WITH    t AS 
        (
        SELECT  1 AS id
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    t
CROSS APPLY
        (
        SELECT  TOP (t.id) m.*
        FROM    master m
        ORDER BY
                id
        ) q

anlık.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008
  • thenewboston

    thenewboston

    4 ŞUBAT 2008