পেজিং কীভাবে এসকিউএল সার্ভারে ROW_NUMBER এর সাথে কাজ করে?


13

আমার একটি Employeeটেবিল রয়েছে যার দশ মিলিয়ন রেকর্ড রয়েছে। ওয়েব অ্যাপ্লিকেশনটিতে ডেটা পেজ করার জন্য আমার এসকিউএল অনুসরণ করা আছে। এটা ঠিক কাজ করছে। তবে আমি সমস্যা হিসাবে যা দেখছি তা হ'ল - উত্পন্ন সারণী সারণীতে tblEmployeeসমস্ত রেকর্ড নির্বাচন করে Employee( MyRowNumberমানগুলি তৈরি করতে )।

আমি মনে করি, এটি Employeeটেবিলের সমস্ত রেকর্ডের নির্বাচনের কারণ ঘটায় ।

এটা কি সত্যিই কাজ করে? অথবা এসকিউএল সার্ভারটিও মূল Employeeটেবিল থেকে কেবল 5 টি রেকর্ড নির্বাচন করতে অনুকূলিত হয়েছে ?

DECLARE @Index INT;
DECLARE @PageSize INT;

SET @Index = 3;
SET @PageSize = 5;

SELECT *  FROM
  (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
  FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize 

উত্তর:


17

পরীক্ষার বিকল্প হতে পারে:

;WITH x AS (SELECT EmpID, k = ROW_NUMBER() OVER (ORDER BY EmpID) FROM dbo.Emp)
SELECT e.columns
FROM x INNER JOIN dbo.Emp AS e
ON x.EmpID = e.EmpID
WHERE x.k BETWEEN (((@Index - 1) * @PageSize) + 1) AND @Index * @PageSize
ORDER BY ...;

হ্যাঁ, আপনি টেবিলটি দু'বার আঘাত করেছেন, তবে যে সিটিইতে আপনি পুরো টেবিলটি স্ক্যান করেন সেখানে কেবলমাত্র সমস্ত কী কী ধরেন, সমস্ত ডেটা নয়। তবে আপনার এই নিবন্ধটি সত্যই দেখতে হবে:

http://www.sqlservercentral.com/articles/T-SQL/66030/

এবং ফলো-আপ আলোচনা:

http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx

এসকিউএল সার্ভারে 2012 আপনি অবশ্যই নতুন OFFSET/ FETCH NEXTসিনট্যাক্সটি ব্যবহার করতে পারেন :

;WITH x AS 
(
  SELECT EmpID FROM dbo.Emp
    ORDER BY EmpID
    OFFSET  @PageSize * (@Index - 1) ROWS
    FETCH NEXT @PageSize ROWS ONLY
)
SELECT e.columns
FROM x INNER JOIN dbo.Emp AS e
ON x.EmpID = e.EmpID
ORDER BY ...; 

উল্লেখ্য যে অফিশ / ফিচ নেক্সট সিটিই পদ্ধতিতে কোনও কার্যকারিতা সুবিধা দেয় না
আকাশ

2
@ আকাশ আপনি কি এটি ভালভাবে পরীক্ষা করেছেন? আমি কিছু পরিকল্পনার পার্থক্য লক্ষ্য করেছি তবে কার্যকারিতা সম্পর্কে বিশেষভাবে কিছু উল্লেখ করি নি কারণ আমি কোনও বিস্তৃত পরীক্ষা-নিরীক্ষা করিনি। পারফরম্যান্স একই হলেও সিনট্যাক্সটি কিছুটা কম জটিল। আমি এটি সম্পর্কে এখানে ব্লগ করেছি: sqlblog.com/blogs/aaron_bertrand/archive/2010/11/10/…
অ্যারন বার্ট্র্যান্ড

1
আহ, আপনি ঠিক বলেছেন, পারফরম্যান্সের পার্থক্য রয়েছে। আমি এটি পড়েছি: ব্লগস.টেকনেট / বি / ডাডাপ্ল্যাটফর্মিনসাইডার / অর্চিভ / ২০১৮/১০/১০/২ যেখানে তিনি কোনও পার্থক্যের কথা উল্লেখ করেননি, তবে কেবলমাত্র চ্যানেল 9.msdn.com/posts/SQL11UPD03-REC-02 দেখেছেন যেখানে তিনি সেখানে দেখান অনেক পার্থক্য .. (যদিও অডিওতে পারফরম্যান্সের পার্থক্যটি কম দেখানো হয়েছে)
আকাশ

2

যদিও আপনি এর পেছনের প্রক্রিয়াটি জানেন না, আপনি নিজের প্রশ্নের সাথে এইটির তুলনা করে নিজেকে পরীক্ষা করতে পারেন: কর্মচারী থেকে * নির্বাচন করুন।

এসকিউএল সার্ভারের আরও সাম্প্রতিক সংস্করণগুলি অনুকূলকরণের জন্য বেশ ভাল কাজ করে তবে এটি বেশ কয়েকটি কারণের উপর নির্ভর করে।

আপনার ROW_NUMBER ক্রিয়াকলাপটি কীভাবে সম্পাদন করে তা ক্রমানুসারে অর্ডার দ্বারা চালিত হতে চলেছে। আপনার উদাহরণে, বেশিরভাগই অনুমান করবে এমপিডই প্রাথমিক কী key

কিছু কিছু রয়েছে যেখানে এমন জটিল যেগুলি এত জটিল এবং / বা খারাপভাবে কোডড বা সূচকযুক্ত, আপনি পুরো ডেটাসেটটি ফিরিয়ে দেওয়ার চেয়ে ভাল হতে পারেন (এটি বিরল এবং এটি স্থির করা যেতে পারে)। BETWEEN ব্যবহার করার ক্ষেত্রে সমস্যা রয়েছে।

আপনি ধরে নেওয়ার আগে আপনার অ্যাপ্লিকেশনটিতে সমস্ত সারি ফিরিয়ে দেওয়া ভাল হবে এবং এটি বের করার আগে আপনার কোয়েরিটি অনুকূল করে তোলার কাজ করা উচিত। অনুমান পরীক্ষা করুন। প্রশ্ন বিশ্লেষক জিজ্ঞাসা করুন। কিছু বিকল্প পরীক্ষা করুন।


2

আমি জানি প্রশ্নটি সারি_নম্বার () সম্পর্কিত, তবে আমি স্ক্যুয়াল সার্ভার ২০১২-এর একটি নতুন বৈশিষ্ট্য যুক্ত করতে চাই s আমি এটি ব্যবহার করেছি এবং এটি আমাকে ভাল ফলাফল দেয় আশা করি আপনি ছেলেরাও একই অভিজ্ঞতা পূরণ করবেন।

Http://blogfornet.com/2013/06/sql-server-2012-offset-use/ এ আমি একটি উদাহরণ পেয়েছি

যা দরকারী। আশা করি এটি আপনাকে নতুন বৈশিষ্ট্য বাস্তবায়নে সহায়তা করবে ....


-2

আমি মনে করি না এটি মূল সারণীতে সমস্ত সারি ফিরিয়ে দেওয়ার জন্য মূল্যায়ন করে। এসকিউএল সার্ভার অপ্টিমাইজ করে। অন্যথায় দশ মিলিয়ন এন্ট্রি নির্বাচন করতে এটি বিশাল পরিমাণ সময় নেবে। আমি বর্তমানে এটি ব্যবহার করছি এবং এটি সমস্ত সারি নির্বাচন করার চেয়ে অনেক দ্রুত। সুতরাং, নিশ্চিতভাবে সমস্ত সারি পাওয়া যায় না। এটি প্রথমে পাঁচটি সারি আনার চেয়ে ধীরে ধীরে সম্ভবত অর্ডারে সময় নেওয়ার কারণে রয়েছে


-2
DECLARE @PageIndex int;
DECLARE @PageSize int;
SET @PageIndex = 4;
SET @PageSize = 5;
;With ranked AS   --- Or you can make it a view
(
   SELECT ROW_NUMBER() OVER(ORDER BY IdentityId) AS RowNum,  *
   FROM logeventnew
)
SELECT *   --Your fields here
FROM Ranked
WHERE RowNum BETWEEN ((@PageIndex - 1) * @PageSize + 1)
    AND (@PageIndex * @PageSize)
ORDER BY IdentityId

4
আপনি আপনার উত্তর প্রসারিত করতে পারেন? পেজিং কীভাবে এসকিউএল সার্ভারের অভ্যন্তরীণভাবে কাজ করে সে সম্পর্কিত ছিল - যেমন অনুরোধটি পূরণ করতে ডাটাবেস ইঞ্জিন কী করে। দুর্ভাগ্যক্রমে, এখন অবধি, আপনার উত্তর প্রকৃত উদ্বেগের সমাধান করে না।
মিঃ ব্রাউনস্টোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.