কেন এই উত্সযুক্ত টেবিল কর্মক্ষমতা উন্নত করে?


18

আমার কাছে একটি ক্যোয়ারী রয়েছে যা প্যারামিটার হিসাবে একটি জসন স্ট্রিং নেয়। জসন হ'ল অক্ষাংশ, দ্রাঘিমাংশের জোড়গুলির একটি অ্যারে। একটি উদাহরণ ইনপুট নিম্নলিখিত হতে পারে।

declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867]
,[41.8662374,-87.6908788],[37.784873,-122.4056546]]';

এটি এমন একটি টিভিএফ কল করে যা ভৌগলিক পয়েন্টের কাছাকাছি 1,3,5,10 মাইল দূরত্বে পিওআই এর সংখ্যা গণনা করে।

create or alter function [dbo].[fn_poi_in_dist](@geo geography)
returns table
with schemabinding as
return 
select count_1  = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e))
      ,count_3  = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e))
      ,count_5  = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e))
      ,count_10 = count(*)
from dbo.point_of_interest
where LatLong.STDistance(@geo) <= 1609.344e * 10

জসন ক্যোয়ারির উদ্দেশ্যটি হ'ল এই ফাংশনটিকে বাল্ক কল করা call যদি আমি এটির মতো বলি তবে পারফরম্যান্সটি খুব দুর্বল মাত্র 4 পয়েন্টের জন্য 10 সেকেন্ড সময় নিয়েছে:

select row=[key]
      ,count_1
      ,count_3
      ,count_5
      ,count_10
from openjson(@json)
cross apply dbo.fn_poi_in_dist(
            geography::Point(
                convert(float,json_value(value,'$[0]'))
               ,convert(float,json_value(value,'$[1]'))
               ,4326))

পরিকল্পনা = https://www.brentozar.com/pastetheplan/?id=HJDCYd_o4

যাইহোক, একটি উত্পন্ন টেবিলের মধ্যে ভূগোলের নির্মাণকে সরিয়ে দেওয়ার কারণে প্রায় 1 সেকেন্ডে কোয়েরিটি সম্পূর্ণ করে নাটকীয়ভাবে উন্নতি হয় causes

select row=[key]
      ,count_1
      ,count_3
      ,count_5
      ,count_10
from (
select [key]
      ,geo = geography::Point(
                convert(float,json_value(value,'$[0]'))
               ,convert(float,json_value(value,'$[1]'))
               ,4326)
from openjson(@json)
) a
cross apply dbo.fn_poi_in_dist(geo)

পরিকল্পনা = https://www.brentozar.com/pastetheplan/?id=HkSS5_OoE

পরিকল্পনাগুলি কার্যত অভিন্ন দেখায়। উভয়ই সমান্তরালতা ব্যবহার করে না এবং উভয়ই স্থানিক সূচক ব্যবহার করে। ধীর পরিকল্পনায় অতিরিক্ত অলস স্পুল রয়েছে যা আমি ইঙ্গিতটি দিয়ে শেষ করতে পারি option(no_performance_spool)। কিন্তু ক্যোয়ারির পারফরম্যান্স পরিবর্তন হয় না। এটি এখনও অনেক ধীর থাকে remains

একটি ব্যাচে যুক্ত ইঙ্গিত সহ উভয়কে চালানো উভয় প্রশ্নের সমান পরিমাণে ওজন করবে।

SQL সার্ভার সংস্করণ = মাইক্রোসফ্ট এসকিউএল সার্ভার 2016 (এসপি 1-সিইউ 7-জিডিআর) (KB4057119) - 13.0.4466.4 (এক্স 64)

তাহলে আমার প্রশ্ন হল কেন এই ব্যাপারটি? আমি কীভাবে জানতে পারি যখন আমার কোনও উত্পন্ন টেবিলের অভ্যন্তরে মানগুলি গণনা করা উচিত বা না?


1
"ওজন" দ্বারা আপনি কি অনুমান ব্যয়% বলতে চান? এই সংখ্যাটি কার্যত অর্থহীন, বিশেষত আপনি যখন ভূগোল ইত্যাদির মাধ্যমে ইউডিএফ, জেএসএন, সিএলআর ইত্যাদি আনছেন
অ্যারন বার্ট্র্যান্ড

আমি সচেতন, কিন্তু আইও পরিসংখ্যানের দিকে তাকালে সেগুলিও অভিন্ন। উভয়ই point_of_interestটেবিলে 358306 লজিক্যাল রিড করেন , উভয়ই 4602 বার সূচকটি স্ক্যান করে এবং উভয়ই একটি ওয়ার্কটেবল এবং ওয়ার্কফাইল উত্পন্ন করে। অনুমানকারী বিশ্বাস করেন যে এই পরিকল্পনাগুলি অভিন্ন তবে কর্মক্ষমতা অন্যথায় বলে says
মাইকেল বি

দেখে মনে হচ্ছে আসল সিপিইউই এখানে সমস্যা, সম্ভবত মার্টিন যে বিষয়টি I / O দ্বারা নির্দেশিত করেছিল তার কারণে সম্ভবত। দুর্ভাগ্যক্রমে আনুমানিক ব্যয়গুলি সিপিইউ এবং আই / হে সংযুক্তের উপর ভিত্তি করে থাকে এবং বাস্তবে যা ঘটে তা সর্বদা প্রতিফলিত করে না। যদি আপনি সেন্ট্রিওন প্ল্যান এক্সপ্লোরার ব্যবহার করে প্রকৃত পরিকল্পনা তৈরি করেন ( আমি সেখানে কাজ করি তবে সরঞ্জামটি কোনও স্ট্রিং ছাড়াই বিনামূল্যে ), তবে কেবলমাত্র সিপিইউতে প্রকৃত ব্যয় পরিবর্তন করুন, আপনি সিপিইউতে যে সমস্ত সময় ব্যয় করেছিলেন তার আরও ভাল সূচক পেতে পারেন।
অ্যারন বারট্রান্ড

1
@ মার্টিনস্মিথ এখনও অপারেটর হিসাবে নয়, না। আমরা তাদের বিবৃতি স্তরের পৃষ্ঠতল। নিম্ন স্তরে অতিরিক্ত অতিরিক্ত মেট্রিক যুক্ত হওয়ার আগে আমরা এখনও ডিএমভি থেকে প্রাথমিক বাস্তবায়নের উপর নির্ভর করি। এবং শীঘ্রই আপনি দেখতে পাবেন এমন অন্য কিছুতে আমরা কিছুটা ব্যস্ত হয়ে পড়েছি। :-)
অ্যারন বার্ট্রান্ড

1
পিএস আপনি সরলরেখার দূরত্ব গণনা করার আগে একটি সাধারণ পাটিগণিত বাক্স করে আরও কার্যকারিতা উন্নতি পেতে পারেন। এটি হ'ল, |LatLong.Lat - @geo.Lat| + |LatLong.Long - @geo.Long| < nআরও বেশি জটিল করার আগে মানটি তাদের জন্য প্রথমে ফিল্টার করুন sqrt((LatLong.Lat - @geo.Lat)^2 + (LatLong.Long - @geo.Long)^2)। এবং আরও ভাল, প্রথমে উপরের এবং নিম্ন সীমা গণনা করুন, তারপরে LatLong.Lat > @geoLatLowerBound && LatLong.Lat < @geoLatUpperBound && LatLong.Long > @geoLongLowerBound && LatLong.Long < @geoLongUpperBound। (এটি সিউডোকোড, যথাযথভাবে মানিয়ে নিন))
এরিক

উত্তর:


15

আমি আপনাকে একটি আংশিক উত্তর দিতে পারি যা ব্যাখ্যা করে যে আপনি কেন পারফরম্যান্সের পার্থক্য দেখছেন - যদিও এটি এখনও কিছু খোলা প্রশ্ন ফেলেছে (যেমন এসকিউএল সার্ভার একটি অন্তর্বর্তী টেবিল এক্সপ্রেশনটি পরিচয় করিয়ে না দিয়ে আরও অনুকূল পরিকল্পনা তৈরি করতে পারে যা অভিব্যক্তিটিকে কলাম হিসাবে প্রকাশ করে?)


পার্থক্যটি হ'ল দ্রুত পরিকল্পনায় জেএসওএন অ্যারে উপাদানগুলি বিশ্লেষণ এবং ভূগোল তৈরির জন্য প্রয়োজনীয় কাজটি 4 বার করা হয় (একবারে প্রতিটি ক্রমের জন্য নির্ধারিত প্রতিটি সারির জন্য openjson) - যেখানে এটি ধীর পরিকল্পনার তুলনায় আরও 100,000 বার করা হয়।

দ্রুত পরিকল্পনায় ...

geography::Point(
                convert(float,json_value(value,'$[0]'))
               ,convert(float,json_value(value,'$[1]'))
               ,4326)

ফাংশনের Expr1000বামে গণনা স্কেলারে নির্ধারিত হয় openjson। এটি geoআপনার উত্পন্ন টেবিল সংজ্ঞা সাথে মিলে যায়।

এখানে চিত্র বর্ণনা লিখুন

দ্রুত পরিকল্পনায় ফিল্টার এবং স্ট্রিম সামগ্রিক রেফারেন্স Expr1000। ধীর পরিকল্পনায় তারা সম্পূর্ণ অন্তর্নিহিত ভাবটি উল্লেখ করে।

স্ট্রিম সামগ্রিক বৈশিষ্ট্য

এখানে চিত্র বর্ণনা লিখুন

ফিল্টারটি 116,995 বার কার্যকর করা হয় প্রতিটি পরীক্ষার সাথে একটি এক্সপ্রেশন মূল্যায়ন প্রয়োজন। স্ট্রিমের সমষ্টিতে 110,520 টি সারি রয়েছে এটি একীকরণের জন্য প্রবাহিত এবং এই অভিব্যক্তিটি ব্যবহার করে তিনটি পৃথক সমষ্টি তৈরি করে। 110,520 * 3 + 116,995 = 448,555। এমনকি যদি প্রতিটি স্বতন্ত্র মূল্যায়নে 18 মাইক্রোসেকেন্ড লাগে তবে এটি সামগ্রিকভাবে ক্যোয়ারির জন্য 8 সেকেন্ড অতিরিক্ত সময় যোগ করে।

আপনি এক্সএমএল পরিকল্পনায় আসল সময়ের পরিসংখ্যানগুলিতে এর প্রভাব দেখতে পারেন (দ্রুত পরিকল্পনার জন্য নীচে লাল বর্ণিত এবং দ্রুত পরিকল্পনার জন্য নীল - বার এমএসে রয়েছে)

এখানে চিত্র বর্ণনা লিখুন

স্ট্রিম সামগ্রীর নিকটবর্তী সন্তানের চেয়ে 6.209 সেকেন্ড বেশি সময় অতিবাহিত হয়েছে। এবং সন্তানের সময়ের বেশিরভাগ অংশ ফিল্টার দ্বারা নেওয়া হয়েছিল। এটি অতিরিক্ত প্রকাশের মূল্যায়নের সাথে মিলে যায়।


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


অন্যদিকে, যদি আমি ভূগোল তৈরি করতে ক্রস প্রয়োগের জন্য ক্যোয়ারী স্যুইচ করি তবে আমি দ্রুত পরিকল্পনাও পাই। cross apply(select geo=geography::Point( convert(float,json_value(value,'$[0]')) ,convert(float,json_value(value,'$[1]')) ,4326))f
মাইকেল বি

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

অপেশাদার প্রশ্নের জন্য দুঃখিত, তবে আপনার ছবিতে কোন সরঞ্জামটি দেখানো হয়েছে?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

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