2013-08-12 12 views
9

में पूर्ण टेक्स्ट के साथ OFFSET/FETCH का उपयोग करते समय धीमी कार्यक्षमता मैं क्वेरी परिणामों के डेटाबेस-आकार पेजिनेशन लिखने की कोशिश कर रहा हूं। चूंकि SQL Server 2012 OFFSET/FETCH प्रदान करता है, मैं इसका उपयोग कर रहा हूं। लेकिन जब मैं अपनी क्वेरी में बयान जोड़ता हूं, तो इसमें 10 गुना अधिक समय लगता है।SQL सर्वर 2012

प्रश्नों:

SELECT 
    p.ShopId, 
    count(1) as ProductsQuantity, 
    MIN(LastPrice) as MinPrice, 
    MAX(LastPrice) as MaxPrice 
FROM Product2 p WITH (NOLOCK) 
INNER JOIN 
    CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL 
ON KEY_TBL.[key]=p.Id 
WHERE 
    (p.LastStatus > 0 OR p.LastStatus = -1) 
GROUP BY p.ShopId 
ORDER BY p.ShopId asc 



SELECT 
    p.ShopId, 
    count(1) as ProductsQuantity, 
    MIN(LastPrice) as MinPrice, 
    MAX(LastPrice) as MaxPrice 
FROM Product2 p WITH (NOLOCK) 
INNER JOIN 
    CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL 
ON KEY_TBL.[key]=p.Id 
WHERE 
    (p.LastStatus > 0 OR p.LastStatus = -1) 
GROUP BY p.ShopId 
ORDER BY p.ShopId asc 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 

3 सेकंड में सबसे पहले क्वेरी परिणाम, 47 सेकंड में एक दूसरे के। कार्य योजना लागू करके अलग हैं, और दूसरी की लागत केवल 7%, क्या पूरी तरह से मेरे लिए कोई मतलब नहीं है के रूप में मूल्यांकन किया जाता है:

Execution plan

मैं पृष्ठांकन के प्रदर्शन में सुधार करने के लिए कैसे मदद की जरूरत है।

+1

+1, बस factyou से बाहर जोड़ा एक योजना की व्याख्या और यह है: दूसरा, जो अस्थायी तालिका में पहले पूछताछ के परिणामों रखा और फिर रहा है के लिए order by ... offset fetch next के लिए इसका इस्तेमाल करते हैं वास्तव में टी-एसक्यूएल मुठभेड़ों में एक मुद्दा अंकन अक्सर – Najzero

उत्तर

2

यह हाथों में अपने स्कीमा और डेटा बिना सलाह देने के लिए मुश्किल है। कम से कम एक चीज है जिसे आप उन 3 सेकंड के साथ करने में सक्षम होना चाहिए। पहली क्वेरी और 47 सेकंड के लिए। इसके लिए aksing किसी को भी बिना इस सवाल का

create table #tmp (Id int not NULL, Quantity int, MinPrice decimal(10,4), MaxPrice decimal(10,4), primary key clustered (Id)) 

insert into #tmp 
SELECT 
    p.ShopId, 
    count(1) as ProductsQuantity, 
    MIN(LastPrice) as MinPrice, 
    MAX(LastPrice) as MaxPrice 
FROM Product2 p WITH (NOLOCK) 
INNER JOIN 
    CONTAINSTABLE(Product2, ProductName, 'czarny') AS KEY_TBL 
ON KEY_TBL.[key]=p.Id 
WHERE 
    (p.LastStatus > 0 OR p.LastStatus = -1) 
GROUP BY p.ShopId 

select ShopId, ProductsQuantity, MinPrice, MaxPrice 
from #tmp 
ORDER BY ShopId asc 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY 
+0

आपका समाधान अच्छी तरह से काम करता है, बिना गति के परिणाम लौटने के समान गति। बस दूसरों के लिए – adek

+0

: मैं यहां बताए अनुसार, एसक्यूएल सर्वर के लिए बड़े पृष्ठांकन तरीकों मिल गया है: http://www.mssqltips.com/sqlservertip/2696/comparing-performance-for-different-sql-server-paging-methods/ मैं उन्हें परीक्षण किया है, और परिणाम हैं: 1. एसक्यूएल 2000 विधि (पहचान के साथ अस्थायी तालिका): 32 सेकंड 2. एसक्यूएल 2005 विधि (ROW_NUMBER साथ CTE()): 47 सेकंड तो लाएं का उपयोग अगले अस्थायी तालिका के बिना सभी का सबसे धीमा समाधान है। – adek

+0

मैं इसे एक उचित समाधान नहीं मानता क्योंकि आप अभी भी कंटेनस्टेबल के सभी परिणामों में शामिल हो रहे हैं और फिर पंक्तियों को ले और छोड़ रहे हैं। लेकिन फुलटेक्स्ट खोज का परिणाम अभी भी सभी परिणाम प्राप्त करने जा रहा है, और फिर आप इन परिणामों को काट रहे हैं। मुझे पता है कि कंटेनस्टेबल के पास केवल 'czarny' जोड़कर शीर्ष पर जाने का एक तरीका है, 10), लेकिन मुझे यह नहीं पता है कि इसे कैसे छोड़ा जाए – WtFudgE

संबंधित मुद्दे