আমি কীভাবে লিনকুইয়ের .স্কিপ (1000) লিখি? খাঁটি এসকিউএল (100) নিন?


93

.Skip()লিনকুতে পদ্ধতির এসকিউএল সমমান কত ?

উদাহরণস্বরূপ: আমি একটি নির্দিষ্ট ডাটাবেস টেবিল থেকে 1000-100 সারি নির্বাচন করতে চাই।

এটি কি কেবল এসকিউএল দিয়ে সম্ভব? বা আমার কি পুরো টেবিলটি নির্বাচন করার দরকার আছে, তারপরে মেমরিতে সারিগুলি খুঁজে পাওয়া উচিত? আমি আদর্শভাবে এটি এড়াতে চাই, যদি সম্ভব হয় তবে টেবিলটি বেশ বড় হতে পারে।

উত্তর:


78

এসকিউএল সার্ভার 2005 এবং তারপরে আপনি ROW_NUMBER ফাংশনটি ব্যবহার করতে পারেন । যেমন

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 51 AND 60; --BETWEEN is inclusive

কিছুটা বিস্তারিত জানতে আমার উত্তরের লিঙ্কটি দেখুন। stackoverflow.com/questions/1744802/…
মাইক অ্যাটলাস

৫১ এবং 60০ এর মধ্যে - এটি অন্তর্ভুক্ত।
ড্রয় মিলার

4
তবে এটি প্রথমে সমস্তটি নির্বাচন করবে এবং তারপরে সেই নির্বাচন থেকে কেবল 10 টি সঠিক হবে? অথবা প্রথম ক্যোয়ারী / ভিউটিতে ইতিমধ্যে কেবল 10 টি থাকবে?
তাদেজ

139

এসকিউএল সার্ভার ২০১২ এবং তারপরে এই বাক্য গঠনটি যুক্ত করেছে:

SELECT *
FROM Sales.SalesOrderHeader 
ORDER BY OrderDate
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY

11
নোট করুন যে আপনাকে OFFSET কমান্ডটি ব্যবহার করার জন্য ___ বাইরের অর্ডার ব্যবহার করা দরকার .... এটি নয় যে আপনি কোনও আদেশ ছাড়াই কখনও প্যাগনিটিংয়ের চেষ্টা করবেন না।
জেমস হাগ

এছাড়াও মনে রাখবেন যে 'নতুন' সিনট্যাক্সটিতে অদ্ভুতভাবে @ এস্কিপের সাথে পারফরম্যান্স পেনাল্টি লিনিয়ার রয়েছে! সারি_সংখ্যার পদ্ধতির এটি নেই (কেবলমাত্র সূচিকৃত ক্রমে পরীক্ষিত)। লো @Skip প্রায় কম 20 টির জন্য, নতুন সিনট্যাক্সটি যদিও রো-সংখ্যার পদ্ধতির চেয়ে দ্রুত is
এসকে রাহ্ন

22

লিনকিউ থেকে এসকিউএল একটি ROW_NUMBER উইন্ডোটিং ফাংশনটি ব্যবহার করে এটি করে:

  SELECT a,b,c FROM 
   (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number
    FROM Table) t0
   WHERE to.row_number BETWEEN 1000 and 1100;

এই কাজ, কিন্তু আদেশ দ্বারা থেকে ROW_NUMBER তৈয়ার করতে হবে পারে আপনার প্রশ্নের ফলে সার্ভার প্রান্তের এবং কারণ কর্মক্ষমতা সমস্যা সাজানো হচ্ছে। এমনকি যখন কোনও সূচক অর্ডার দ্বারা প্রয়োজনীয়তা পূরণ করতে পারে, ফলাফলটি ফেরত শুরু করার আগে ক্যোরিয়াকে এখনও 1000 সারি গণনা করতে হবে। সমস্ত প্রায়শই বিকাশকারীরা এটি ভুলে যায় এবং কেবল 5 মিলের সারি টেবিলের উপর একটি পৃষ্ঠাগুলি নিয়ন্ত্রণ ফেলে দেয় এবং অবাক করে দেয় যে প্রথম পৃষ্ঠাটি শেষের চেয়ে এত দ্রুত কেন ফিরে এসেছে ...

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


4
অতিরিক্ত পারফরম্যান্স তথ্যের জন্য ধন্যবাদ, সাবধানতা অবলম্বন করতে হবে এবং এটি পরীক্ষা করতে হবে।
রায়

পরীক্ষিত এবং আমার অর্ধ মিলিয়ন সারি টেবিলের জন্য, এটি শেষ পৃষ্ঠাটি প্রথম পৃষ্ঠার চেয়ে প্রায় 7 গুণ কম ধীর। আদর্শ নয়, তবে আমার কাছে গ্রহণযোগ্য।
রায়

6

আর একবার চেষ্টা কর:

select * from [Table-Name] order by [Column-Name] 
offset [Skip-Count] rows
FETCH NEXT [Take-Count] rows only

উদাহরণ:

select * from Personals order by Id
offset 10 rows            --------->Skip 10
FETCH NEXT 15 rows only   --------->Take 15

4

এটা কর:

এস.কিউএল ডেটা কনটেক্সটে একটি লিনকুইতে (100) নিন এবং এসকিউএল আউটপুটটি দেখুন .Skip (1000) চালান। এটি আপনার জন্য একটি এসকিউএল বিবৃতি উত্পন্ন করবে যা আপনি বর্ণনা করছেন তা করে।

এটি মার্জিত হবে না তবে এটি কাজটি সম্পন্ন করে।


4
যা চাওয়া হচ্ছে তা নয়।
রায়লাভলেস

2

না, তবে আপনি একই ফলাফল অর্জন করতে মাইএসকিউএল এর লিমিটেড ধারা (স্ট্যাক ওভারফ্লো লিঙ্ক) অনুকরণ করতে পারেন ।


4
স্বীকৃত উত্তর সেখানে একটি আকর্ষণীয় কোডপ্রজেক্ট লিঙ্ককে নির্দেশ করে, "এএসপি.নেট-এ বড় রেজাল্টসেটগুলির পৃষ্ঠপোষকতা" (নামটির চেয়ে বেশি এসকিউএলমুখী )।
রাফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.