এসকিউএল সার্ভার লিঙ্কযুক্ত সার্ভারের কার্য সম্পাদন: দূরবর্তী অনুসন্ধানগুলি কেন এত ব্যয়বহুল?


14

আমার দুটি ডাটাবেস সার্ভার রয়েছে, লিংকড সার্ভারের মাধ্যমে সংযুক্ত। উভয়ই এসকিউএল সার্ভার ২০০৮ আর ২ ডাটাবেস, এবং লিঙ্কযুক্ত সার্ভার সংযোগটি বর্তমান লগইনের সুরক্ষা প্রসঙ্গটি ব্যবহার করে একটি নিয়মিত "এসকিউএল সার্ভার" লিঙ্কের মাধ্যমে তৈরি করা হয়। লিঙ্কযুক্ত সার্ভারগুলি উভয়ই একই ডেটাসেন্ট্রে রয়েছে তাই সংযোগটি কোনও সমস্যা হওয়া উচিত নয়।

কলামের কোন মানগুলি identifierদূরবর্তীস্থানে উপলব্ধ তা যাচাই করতে আমি নিম্নলিখিত কোয়েরিটি ব্যবহার করি তবে স্থানীয়ভাবে তা নয়।

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT DISTINCT
    identifier 
FROM LocalDb.schema.[TableName] 

উভয় টেবিলের কলামে নন-ক্লাস্টারযুক্ত সূচি রয়েছে identifier। স্থানীয়ভাবে প্রায় ২.M এম সারির কাছাকাছি, দূরবর্তীভাবে কেবল ৫ 54 টি। তবুও, ক্যোয়ারী প্ল্যানটি দেখার সময়, কার্যকর করার সময়টির 70% সময় "দূরবর্তী জিজ্ঞাসা চালানো" এর জন্য ব্যয় করা হয়। এছাড়াও, সম্পূর্ণ ক্যোয়ারী প্ল্যান অধ্যয়ন করার সময়, আনুমানিক স্থানীয় সারিগুলির 1পরিবর্তে 2695380(যা কেবলমাত্র কোয়েরি পরে আসে তা নির্বাচন করার সময় আনুমানিক সারিগুলির সংখ্যা EXCEPT)। হত্যা পরিকল্পনা এই কোয়েরিটি সম্পাদন করার সময়, সত্যই এটি দীর্ঘ সময় নেয়।

এটি আমাকে অবাক করে তোলে: এটি কেন? অনুমানটি "স্রেফ" উপায় বন্ধ, বা লিঙ্কযুক্ত সার্ভারগুলিতে দূরবর্তী অনুসন্ধানগুলি কি আসলেই ব্যয়বহুল?


2
বিটিডাব্লু: এটি সূচীর সন্ধানের জন্য আপনার খোঁজ করা উচিত "নির্ধারিত মৃত্যুর আনুমানিক সংখ্যা"। সারণীর আনুমানিক সংখ্যাটি কার্যকরভাবে প্রতি সারি আউটপুট হয় যা পরিকল্পনার সম্পূর্ণ স্ক্যান না করে সারণীতেই সারিগুলির সংখ্যার সাথে সম্পর্কিত হবে না।
মার্টিন স্মিথ

উত্তর:


9

এই মুহূর্তে আপনার কাছে থাকা পরিকল্পনাটি আমার কাছে সবচেয়ে অনুকূল পরিকল্পনার মতো দেখাচ্ছে।

আমি অন্যান্য উত্তরের দৃ the়তার সাথে একমত নই যে এটি রিমোট সার্ভারে ২.6 এম সারি প্রেরণ করছে।

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

একটি হ্যাশ জয়েন বা মার্জ জোনের সাথে প্রতিস্থাপন টেবিলের আকার বিবেচনা করে প্রতিক্রিয়াশীল হবে এবং একটি মধ্যবর্তী #tempটেবিল যুক্ত করা কেবল একটি অতিরিক্ত পদক্ষেপ যুক্ত করবে যা আপনাকে কোনও সুবিধা দেয় বলে মনে হচ্ছে না।


6

দূরবর্তী উত্সের সাথে সংযোগ ব্যয়বহুল। সময়কাল।

যে কোনও প্রোগ্রামিং পরিবেশে সবচেয়ে ব্যয়বহুল ক্রিয়াকলাপগুলির মধ্যে একটি হ'ল নেটওয়ার্ক আইও (যদিও ডিস্ক আইও এটি বামনযুক্ত করে)।

এটি দূরবর্তী লিঙ্কযুক্ত সার্ভারগুলিতে প্রসারিত। রিমোট লিঙ্কযুক্ত সার্ভারকে কল করা সার্ভারকে প্রথমে একটি সংযোগ স্থাপন করা দরকার, তারপরে রিমোট সার্ভারে একটি অনুসন্ধান চালানো দরকার, ফলাফলগুলি ফিরে এসে সংযোগটি বন্ধ হয়ে গেল। এই সমস্ত নেটওয়ার্ক সময় লাগে।


আপনার কোয়েরিটিও এমনভাবে গঠন করা উচিত যাতে আপনি সর্বনিম্ন ডেটা তারের উপরে স্থানান্তর করতে পারেন। আপনার জন্য ডিবি আশা করি না।

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

আপনি যে ক্যোয়ারীটি চালাচ্ছেন সেটিকে ক্লজটি প্রক্রিয়া করার জন্য সহজেই রিমোট সার্ভারে 2.6M সারি প্রেরণ করা যেতে পারে EXCEPT


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

@vstrien - এটা হতে পারে। নেটওয়ার্ক সংযোগ, বিলম্বিতা, স্যাচুরেশন এবং অন্যান্য কারণগুলির উপর নির্ভর করে। পয়েন্ট হচ্ছে - এটি নির্বিচারবাদী নয়।

@vstrien - আমার উত্তরে আরও তথ্য যুক্ত করা হয়েছে। আমি বিশ্বাস করি লিখিত হিসাবে ক্যোয়ারী স্থানীয় সারিগুলি প্রক্রিয়াকরণের জন্য দূরবর্তী সার্ভারে প্রেরণ করবে।

2
এটি যেখান থেকে দূরবর্তী সার্ভারে 2.6M সারি প্রেরণ করছে তা আপনি কোথায় ছাঁটাবেন? দূরবর্তী ক্যোয়ারী অপারেটরগুলির সাথে আমার পরিকল্পনাগুলির সাথে আমার খুব বেশি অভিজ্ঞতা নেই তবে দেখে মনে হচ্ছে যে 54 সারি দূরবর্তী ক্যোয়ারী অপারেটর থেকে বেরিয়ে আসছে তবে এটি স্থানীয় টেবিলের বিপরীতে অ্যান্টি-সেমি জোনে করছে।
মার্টিন স্মিথ

2
@ লাইভেন - যৌক্তিক হতে পারে তবে দেখানো পরিকল্পনা থেকে এটি সঠিক বলে মনে করবেন না।
মার্টিন স্মিথ

1

আমি কোনও বিশেষজ্ঞ নই তবে আপনি যদি ইউনিয়ন, ব্যতীত বা ইন্টারসেকট ব্যবহার করেন তবে আপনাকে "ডিস্টিনেক্ট" ব্যবহার করতে হবে না। লোকালডিবি.সেমিমা থেকে মানগুলির উপর নির্ভর করে [[টেবিলনাম], ক্যোয়ারির কর্মক্ষমতা উন্নত করা যেতে পারে।

SELECT 
    identifier 
FROM LinkedServer.RemoteDb.schema.[TableName]

EXCEPT

SELECT 
    identifier 
FROM LocalDb.schema.[TableName]

0

ওহেড ঠিক আছে, আপনার দূরবর্তী সার্ভারে 2.6M সারি প্রেরণ করে পারফরম্যান্স সমস্যা দেখা দেয়।

এই সমস্যাটি সমাধানের জন্য আপনি কোনও টেম্পোর বা মেমরি টেবিল ব্যবহার করে দূরবর্তী ডেটা (54 টি সারি) আপনাকে প্রেরণে বাধ্য করতে পারেন।

অস্থায়ী টেবিল ব্যবহার করা

SELECT  identifier 
INTO    #TableName
FROM    LinkedServer.RemoteDb.schema.[TableName]

SELECT  identifier
FROM    #TableName
EXCEPT
SELECT  DISTINCT identifier 
FROM    LocalDb.schema.[TableName] 

DROP    #TableName

কোনও অস্থায়ী টেবিল ব্যবহার করা যেকোন ইভেন্টে কার্ডিনালিটির অনুমানের সাথে সহায়তা করতে পারে যদিও নেস্টেড লুপগুলি কেবল 54 সারিগুলির জন্য যুক্তিসঙ্গত বলে মনে হয়।
মার্টিন স্মিথ

একটি অস্থায়ী টেবিল ব্যবহার করে 54 সারি সহ ডান কাজ করে; তবে উভয় পক্ষের বৃহত টেবিলগুলির ক্ষেত্রে এটি আর সম্ভব হয় না। সমান আকারের দুটি "বিশাল" টেবিলের জন্য আপনার সমাধানটি কী হবে? অন্য ডাটাবেসে একটি ইউজারবেল তৈরি করছেন?
vstrien

1
@vstrien - দুটি সমতুল্য আকারের বিশাল টেবিলের জন্য সত্যিই ভাল সমাধান নেই। সম্ভবত একটি বিতরণকারী পার্টিশনযুক্ত ভিউ তৈরি করা আপনার পক্ষে আগ্রহী তবে এটির সাথে আমার কোনও অভিজ্ঞতা নেই।
লিভেন কের্মসেকার্স 18'12

0

আমি মনে করি আপনি যে সার্ভার থেকে জিজ্ঞাসা করছেন তার রিমোট টেবিলটি অনুলিপি করা এবং তারপরে স্থানীয়ভাবে আপনার সমস্ত এসকিউএল চালানো ভাল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.