एक साधारण आत्म में शामिल होने के लिए बहुत एक पंक्ति की तुलना में बेहतर संदर्भित सबक्वेरी
उत्पन्न परीक्षण डेटा 10k पंक्तियों प्रदर्शन करने के लिए प्रतीत होता है:
drop table test10k
create table test10k (Id int, Number int, constraint test10k_cpk primary key clustered (id))
;WITH digits AS (
SELECT 0 as Number
UNION SELECT 1
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
)
,numbers as (
SELECT
(thousands.Number * 1000)
+ (hundreds.Number * 100)
+ (tens.Number * 10)
+ ones.Number AS Number
FROM digits AS ones
CROSS JOIN digits AS tens
CROSS JOIN digits AS hundreds
CROSS JOIN digits AS thousands
)
insert test10k (Id, Number)
select Number, Number
from numbers
मैं से बाहर पहले 3 पंक्तियों के विशेष मामले खींच होगा मुख्य प्रश्न, यदि आप वाकई इसे पंक्ति सेट में चाहते हैं तो आप उन सभी को वापस कर सकते हैं। स्व में शामिल होने क्वेरी:
;WITH NumberedRows
AS
(
SELECT rta.*, row_number() OVER (ORDER BY rta.ID ASC) AS RowNumber
FROM test10k rta
)
SELECT nr.ID, nr.Number,
avg(trailing.Number) as MovingAverage
FROM NumberedRows nr
join NumberedRows as trailing on trailing.RowNumber between nr.RowNumber-3 and nr.RowNumber-1
where nr.Number > 3
group by nr.id, nr.Number
मेरी मशीन पर इस बारे में 10 सेकंड लेता है, सबक्वेरी दृष्टिकोण है कि हारून एल्टन का प्रदर्शन लगभग 45 सेकंड लेता है (के बाद मैं अपने परीक्षण स्रोत तालिका प्रतिबिंबित करने के लिए इसे बदल):
;WITH NumberedRows
AS
(
SELECT rta.*, row_number() OVER (ORDER BY rta.ID ASC) AS RowNumber
FROM test10k rta
)
SELECT nr.ID, nr.Number,
CASE
WHEN nr.RowNumber <=3 THEN NULL
ELSE ( SELECT avg(Number)
FROM NumberedRows
WHERE RowNumber < nr.RowNumber
AND RowNumber >= nr.RowNumber - 3
)
END AS MovingAverage
FROM NumberedRows nr
यदि आप एक सेट सांख्यिकी प्रोफ़ाइल करते हैं, तो आप देख सकते हैं कि स्वयं के शामिल होने से टेबल स्पूल पर 10k निष्पादन होते हैं। सबक्वायरी में फिल्टर, कुल, और अन्य चरणों पर 10k निष्पादन होते हैं।
आप किस प्रकार का SQL डेटाबेस उपयोग कर रहे हैं? –
मैं SQL Server 2008 का उपयोग कर रहा हूं। – HYP
मुझे लगता है कि यह उन दुर्लभ मामलों में से एक है जहां कर्सर सबसे तेज़ होने जा रहे हैं ... केवल पिछले 3 पंक्तियों को वर्र्स में रखें ... –