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
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.
Nasıl dosyaları zaman uyumsuz olarak y...
(Ya da ihmal) kullanmak için zaman var...
Nasıl Python ile bir zaman gecikmesi y...
Ne zaman require_once kullanımı vs dah...
Nasıl bir WordPress kullanmak ile aynı...