এসকিউএল সার্ভার কেন কোয়েরিটি চালানোর সময় কিছু সারি ফেরত দেয় এবং কখনও কখনও তা করে না?


33

এমন কোয়েরি রয়েছে যেখানে আমরা যখন "এক্সিকিউট" হিট করি তখন এটি কিছু সারি দেখায় এবং এটি বাড়তে থাকে তবে কোয়েরিটি এখনও শেষ হয়নি। তবুও কখনও কখনও, এটি ক্যোয়ারির শেষ পর্যন্ত অপেক্ষা করে।

কেন এমন হয়? এটি নিয়ন্ত্রণ করার কোনও উপায় আছে?

উত্তর:


43

উত্তরটি যথারীতি (ঠিক আছে, বেশিরভাগ সময়) কার্যকর করার পরিকল্পনার মধ্যে রয়েছে।

কিছু নির্দিষ্ট অপারেটর রয়েছে যাদের those সারিগুলি প্রক্রিয়াজাতকরণ শুরু করতে এবং স্রোতটি প্রবাহিত করার আগে তাদের কাছে সমস্ত সারি পৌঁছানো দরকার, উদাহরণস্বরূপ:

  • হ্যাশ যোগ দিন (হ্যাশ টেবিল তৈরির উপর)
  • হ্যাশ ম্যাচ
  • বাছাই করুন (হ্যাশ ফ্লো আলাদা করে বাদে)

এগুলিকে হয় ব্লকিং বলা হয়, বা এ কারণে অপারেটরগুলি থামুন এবং যান এবং অপটিমাইজার যখন মনে করে এটি আপনার ডেটা সন্ধানের জন্য সম্পূর্ণ প্রচুর ডেটা প্রসেস করতে হবে তখন তাদের চয়ন করা হয়।

এমন আরও কিছু অপারেটর রয়েছে যা স্ট্রিমিং শুরু করতে বা তত্ক্ষণাত কোনও সন্ধান করা সারি পাশ করতে সক্ষম

  • নেস্টেড লুপস
  • সূচকটি মার্জ যোগ দেয়কে সমর্থন করে
  • সমষ্টি স্ট্রিম

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

এটি আপনার দ্বারা বা অপ্টিমাইজার দ্বারা প্রবর্তিত সারি লক্ষ্যগুলির কারণে ঘটতে পারে।

কোনও কারণে যদি কোনও খারাপ পরিকল্পনা বেছে নেওয়া হয় (এসএআরজিবিলিটির অভাব, প্যারামিটার স্নিফিং, অপর্যাপ্ত পরিসংখ্যান ইত্যাদি) তবে এটি ঘটতেও পারে, তবে এটি বের করতে আরও খনন লাগে takes

আরও তথ্যের জন্য রব ফারলির ব্লগটি এখানে দেখুন

এবং পল হোয়াইট সিরিজ এখানে সারি গোল , এখানে , এখানে , এবং এখানে

এটিও লক্ষ করা উচিত যে, আপনি যদি এসএসএমএসের কথা বলছেন তবে কেবলমাত্র উইলি-নিলি নয়, পুরো বাফারটি পূরণ করার পরে কেবল সারিগুলি উপস্থিত হয়।


14

তাহলে আমি বুঝতে পারছি তুমি কি দেখে করছি, কিভাবে এই ম্যানেজমেন্ট স্টুডিও হয় রেন্ডার সারি, এবং সামান্য কিভাবে SQL সার্ভার কি আছে আয় সারি। প্রকৃতপক্ষে যখন আপনি এসএসএমএস-এ বড় ফলাফলগুলি ফিরিয়ে দিচ্ছেন এবং গ্রিডে তাদের রেন্ডার করার চেষ্টা করছেন তখন এসএসএমএস রাখতে পারে না এবং এসকিউএল সার্ভার অ্যাপ্লিকেশনটিকে আরও সারি প্রক্রিয়াকরণের জন্য অপেক্ষা করতে শেষ করে। এই ক্ষেত্রে আপনি এসকিউএল সার্ভার ASYNC_NETWORK_IOঅপেক্ষা করতে অপেক্ষা করছেন।

গ্রিডের ফলাফলের পরিবর্তে ফলাফলের পাঠ্যগুলিতে ফলাফল ব্যবহার করে আপনি কিছুটা নিয়ন্ত্রণ করতে পারেন, যেহেতু এসএসএমএস গ্রিডগুলি আঁকতে পারে তার চেয়ে বেশি দ্রুত টেক্সট আঁকতে পারে তবে আপনি সম্ভবত এটি কলামের সংখ্যা এবং সম্পর্কিত ডেটাগুলির উপর নির্ভর করে পাঠযোগ্যতার উপর প্রভাব ফেলতে পারবেন। উভয়ই প্রভাবিত হয় যখন এসএসএমএস প্রকৃতপক্ষে সেই ফলকে ফলাফল লেখার সিদ্ধান্ত নেয়, যা আউটপুট বাফার কতটা পূর্ণ তার উপর নির্ভর করে।

যখন আপনার একাধিক বিবৃতি রয়েছে, এবং আপনি বার্তার বার্তাগুলি ফলকে আউটপুট ফলাফলগুলি সরবরাহ করতে বাফারকে বাধ্য করতে চান, আপনি বিবৃতিগুলির মধ্যে সামান্য মুদ্রণের কৌশল ব্যবহার করতে পারেন:

RAISERROR('', 0, 1) WITH NOWAIT;

আপনি যখন সমস্ত আউটপুট একক বিবৃতি থেকে আসে তখন আপনি যখন এসএসএমএসকে আরও দ্রুত সারিগুলি সরবরাহ করার চেষ্টা করছেন তখন এটি সাহায্য করবে না।

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

এর মতো কিছু হ্যাক রয়েছে OPTION (FAST 100), যা প্রথম 100 টি সারি (বা কোনও বাহ্যিক না থাকলে 100 টি সারি ORDER BY) পুনরুদ্ধার করতে অনুকূল করবে , তবে এটি সারিগুলির বাকী অংশগুলির জন্য আরও ধীর গতিতে পুনরুদ্ধার ব্যয় করতে পারে এবং আরও বেশি পরিকল্পনা রয়েছে সামগ্রিকভাবে অদক্ষ, তাই সত্যিই একটি যেতে যাওয়ার বিকল্প আইএমএইচও নয়।


1

আপনার প্রশ্নটি প্রতি এসকিউএল সার্ভার সম্পর্কে নয় তবে:

  • SQL সার্ভার
  • নেটওয়ার্কের
  • ক্লায়েন্ট অ্যাপ্লিকেশন হিসাবে এসএসএমএস

এটি নিয়ন্ত্রণ করার কোনও উপায় আছে?

সংক্ষিপ্ত উত্তর :

  1. এর sqlcmdপরিবর্তে ssmsবা sqlcmd-Mode এর চেষ্টা করুনssms
  2. আপনার সংযোগ এবং সেশন সেটিংস পরীক্ষা করুন

দীর্ঘ উত্তর :

অবশ্যই! তবে এক নয় - প্রোব

  1. আপনার জিজ্ঞাসাটি সাথে sqlcmdবা এর সাথে চালিত করুনsqlcmd এসএমএসে -মোডে চালিত করুন।
  2. আপনি যদি নেটওয়ার্কের ভূমিকা বাদ দিতে চান - ভাগ করে নেওয়া মেমরি সংযোগ দিয়ে সার্ভারে আপনার ক্যোয়ারী চালান।
  3. ভাগ করা মেমরি সংযোগের সাথেও যদি কোয়েরি পারফরম্যান্সটি অসন্তুষ্টিজনক হয় - আপনার কার্যকরকরণ পরিকল্পনাগুলি বিশ্লেষণ করুন। যদি কোয়েরিটি নেটওয়ার্কের মাধ্যমে খারাপ সম্পাদন করে - সাহায্যের জন্য আপনার নেটওয়ার্ক নেটওয়ার্ক প্রশাসককে কল করুন। যদি আপনার কোয়েরিটি কেবল এসএসএমএসে খারাপ সম্পাদন করে - আরও পড়ুন।
  4. এখন আমরা নিশ্চিত যে সমস্যাগুলি ক্লায়েন্টের পক্ষে রয়েছে (এই ক্ষেত্রে এসএমএস)। এসএসএমএসে সংযোগ এবং সেশন সেটিংস দেখুন। এসএমএস ইন্টারফেসকে বিশ্বাস করবেন না এবং এসকিউএল প্রোফাইলারের সাথে যাচাই করুন: এর মাধ্যমে আপনার সংযোগটি সন্ধান করুন spidএবং আপনি সেশন সেটিংসের পুরো তালিকা পাবেন। sqlcmdসেশনের সেটিংসের সাথে তুলনা করুন । যদি কিছুই না ক্লিক করে - আপনার কোয়েরি স্ক্রিপ্টে প্রোফাইলার থেকে সমস্ত সেশন সেটিংস অনুলিপি করুন, ইন- sqlcmdমোড কার্যকর করুন এবং ধীরে ধীরে সেটিংসে স্যুইচিং করে আপনি আপনার অপরাধীকে খুঁজে পাবেন।

শুভকামনা!


-2

Sp_BlitzErik এর উত্তরে যুক্ত করতে, NOT IN ()সাব-সিলেক্ট সহ একটি ব্যবহার করে উদাহরণটি ধরুন । কোনও আইটেম নেস্টেড ক্যোয়ারির ফলাফলের মধ্যে রয়েছে কিনা তা নির্ধারণের জন্য, পুরো ফলাফলটি পুনরুদ্ধার করা (সাধারণত) প্রয়োজন।

সুতরাং এই জাতীয় প্রশ্নের পারফরম্যান্সের উন্নতির জন্য একটি উপায় সহজ উপায় হ'ল পাশের LEFT OUTER JOINশর্তটি RIGHTশূন্য হওয়ার সাথে তাদের এমনভাবে পুনরায় রচনা করা (আপনি এটিকে ঘিরে ফেলতে পারেন, অবশ্যই তবে কে ব্যবহার করেন RIGHT OUTER JOINS?)। এটি ফলাফলগুলি এখনই ফিরে আসতে শুরু করে।


আমি তাই মনে করি না. যদি তুলনা করা কলামগুলি স্থায়ী নয়, তবে ফলাফলগুলি একই এবং পরিকল্পনাগুলি হওয়া উচিত - সাধারণত - অ্যান্টিজয়িনের 3 সংস্করণে (না IN, না উপস্থিত, বাম যোগদান / ইস নাল) for পুরো ফলাফলটি পুনরুদ্ধার করার প্রয়োজন নেই।
ypercubeᵀᴹ

সাবলেটটি যদি এমন জটিল জটিল হয় যা উত্পাদিত ক্যোয়ারির WHERE t.x IN (<complex SELECT subquery>)সমতুল্য বাম যোগে পরীক্ষা না করার আগে উত্পাদিত ক্যোয়ারীর পুরো সাবলেটকে মূল্যায়ন করতে হবে LEFT JOIN (<complex SELECT subquery>) AS r ON r.x = t.x .... WHERE r.x IS NULL, তবে সাবকিউরি উইল ল্যাভকেও মূল্যায়ন করতে হবে (নোটের সাথে একই জটিল পরিকল্পনা) সংস্করণ)।
ypercubeᵀᴹ

@ ইয়পারক्यूब ᵀᴹ এটি আমার জন্য অতীতে কাজ করেছিল। আমি দেখেছি কোয়েরিগুলি সাবসেকেন্ডে ফিরে আসতে কয়েক মিনিট সময় থেকে শুরু করে।
জিমি জেমস 18

@ ইয়পারক्यूब - আমি ওরাকল-এ একটি সাধারণ উদাহরণ একসাথে রেখেছি (দুঃখিত এই মুহুর্তে এসকিউএল সার্ভারে আমার অ্যাক্সেস নেই) এবং তাদের স্পষ্টতই আলাদা ব্যাখ্যা করার পরিকল্পনা ছিল। সম্ভবত তারা অর্থপূর্ণ পার্থক্য ছিল না তবে তারা দেখতে অন্যরকম দেখাচ্ছে।
জিমি জেমস

@ জিমি জেমস: আপনি যদি স্থিতিশীল পারফরম্যান্স চান এবং এটি এসকিউএল সার্ভার সংস্করণের জন্য "অপ্টিমাইজেশন" খুব সংবেদনশীল হয় তবে এটি কোনও সহজ উপায় নয়। এবং ওরাকল (কোন সংস্করণ?) এর কাছে আবেদন করে ভুল করবেন না। Icallyতিহাসিকভাবে এসকিউএল সার্ভার পছন্দের NOT EXISTSকিন্তু NOT INপ্রশ্নগুলিতে ওরাকল । তবে আজ অবশ্যই এটি অবশ্যই জেনারেটরের ত্রুটি হিসাবে বিবেচিত হবে
অ্যালেক্স ইউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.