অসম্পূর্ণ 'আসল' সারিটি সমান্তরাল পরিকল্পনায় গণনা করে


17

এটি একটি নিখুঁত একাডেমিক প্রশ্ন, এতটা যে এটি কোনও সমস্যা সৃষ্টি করে না এবং আমি আচরণের জন্য কোনও ব্যাখ্যা শুনতে আগ্রহী।

একটি মানক ইটজিক বেন-গান সিটিই টেলি টেবিলটি ক্রস-জয়েন করুন:

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[TallyTable] 
(   
    @N INT
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN 
(
    WITH 
    E1(N) AS 
    (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )                                       -- 1*10^1 or 10 rows
    , E2(N) AS (SELECT 1 FROM E1 a, E1 b)   -- 1*10^2 or 100 rows
    , E4(N) AS (SELECT 1 FROM E2 a, E2 b)   -- 1*10^4 or 10,000 rows
    , E8(N) AS (SELECT 1 FROM E4 a, E4 b)   -- 1*10^8 or 100,000,000 rows

    SELECT TOP (@N) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM E8 
)
GO

একটি কোয়েরি ইস্যু করুন যা একটি 1 মিলিয়ন সারি নম্বর সারণী তৈরি করবে:

SELECT
    COUNT(N)
FROM
    dbo.TallyTable(1000000) tt

এই প্রশ্নের জন্য সমান্তরাল সম্পাদন পরিকল্পনাটি একবার দেখুন:

সমান্তরাল বাস্তবায়ন পরিকল্পনা

জড়িত স্ট্রিম অপারেটরের পূর্বে 'আসল' সারি গণনাটি 1,004,588 Note সংগ্রহের স্ট্রিম অপারেটরের পরে সারি গণনাটি প্রত্যাশিত 1,000,000। অপরিচিত এখনও, মানটি সামঞ্জস্যপূর্ণ নয় এবং রান থেকে রান পর্যন্ত পরিবর্তিত হবে। COUNT এর ফলাফল সর্বদা সঠিক।

অ-সমান্তরাল পরিকল্পনা জোর করে আবার জিজ্ঞাসা জারি করুন:

SELECT
    COUNT(N)
FROM
    dbo.TallyTable(1000000) tt
OPTION (MAXDOP 1)

এবার সমস্ত অপারেটর সঠিক 'আসল' সারি গণনা দেখায়।

সমান্তরাল বাস্তবায়ন পরিকল্পনা plan

আমি এ পর্যন্ত 2005SP3 এবং 2008R2 এ চেষ্টা করেছি, উভয়ের ক্ষেত্রে একই ফলাফল। এই কারণ হতে পারে সম্পর্কে কোন চিন্তা?

উত্তর:


12

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

ফলস্বরূপ, আপনি প্রায়শই এই ধরণের সারি গণনা পার্থক্য দেখতে পাবেন যেখানে একটি উপ-গাছের সম্পূর্ণ সম্ভাব্য রোউসেটের চেয়ে কম প্রয়োজন। এই ক্ষেত্রে, শীর্ষস্থানীয় কার্যকরকরণটিকে 'প্রারম্ভিক শেষে' এনে দেয়।

অধিক তথ্য:


10

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

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

বিওএল থেকে নেওয়া :

শারীরিক অপারেটররা সূচনা, তথ্য সংগ্রহ এবং বন্ধ করে দেয়। বিশেষত, শারীরিক অপারেটর নিম্নলিখিত তিনটি পদ্ধতি কলের উত্তর দিতে পারে:

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

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

সম্পূর্ণতার জন্য, সমান্তরাল অপারেটরগুলির উপর একটি সামান্য ব্যাকগ্রাউন্ড দরকারী useful পুনঃস্থাপন স্ট্রিম বা স্ট্রিম অপারেটরগুলি বিতরণ করে সমান্তরাল পরিকল্পনায় কাজ একাধিক স্ট্রমে বিতরণ করা হয়। এই চারটি পদ্ধতির মধ্যে একটি ব্যবহার করে থ্রেডগুলির মধ্যে সারি বা পৃষ্ঠাগুলি বিতরণ করে:

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

প্রথম বিতরণ স্ট্রিম অপারেটর (পরিকল্পনার বেশিরভাগ অংশে) ধ্রুবক স্ক্যান থেকে উত্পন্ন সারিগুলিতে চাহিদা বিভাজন ব্যবহার করে। তিনটি থ্রেড রয়েছে যা মোট 10 'আসল সারি' এর জন্য getNext () 6, 4 এবং 0 বার কল করে:

<RunTimeInformation>
       <RunTimeCountersPerThread Thread="2" ActualRows="6" ActualEndOfScans="1" ActualExecutions="1" />
       <RunTimeCountersPerThread Thread="1" ActualRows="4" ActualEndOfScans="1" ActualExecutions="1" />
       <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
 </RunTimeInformation>

পরের ডিস্ট্রিবিউশন অপারেটরে আমাদের আবার তিনটি থ্রেড রয়েছে, এবার মোট 100 এর জন্য 50, 50 এবং 0 কল সহ গেটনেক্সট () এ কল করুন:

<RunTimeInformation>
    <RunTimeCountersPerThread Thread="2" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
    <RunTimeCountersPerThread Thread="1" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
    <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>

এটি পরবর্তী সমান্তরাল অপারেটর যা কারণ এবং ব্যাখ্যা সম্ভবত প্রদর্শিত হবে।

<RunTimeInformation>
    <RunTimeCountersPerThread Thread="2" ActualRows="1" ActualEndOfScans="0" ActualExecutions="1" />
    <RunTimeCountersPerThread Thread="1" ActualRows="10" ActualEndOfScans="0" ActualExecutions="1" />
    <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>

সুতরাং আমাদের এখন getNext () এ 11 টি কল রয়েছে, যেখানে আমরা 10 টি দেখার আশা করছিলাম।

সম্পাদনা করুন: 2011-11-13

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


7

1,004,588 এটি এমন একটি চিত্র যা আমার পরীক্ষায়ও অনেক ফসল কাটাচ্ছে।

আমি নীচে কিছুটা সহজ পরিকল্পনার জন্যও এটি দেখতে পাচ্ছি।

WITH 
E1(N) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)                                       -- 1*10^1 or 10 rows
, E2(N) AS (SELECT 1 FROM E1 a, E1 b)   -- 1*10^2 or 100 rows
, E4(N) AS (SELECT 1 FROM E2 a, E2 b)   -- 1*10^4 or 10,000 rows
SELECT * INTO #E4 FROM E4;

WITH E8(N) AS (SELECT 1 FROM #E4 a, #E4 b),
Nums(N) AS (SELECT  TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT 0)) FROM E8 )
SELECT COUNT(N) FROM Nums

DROP TABLE #E4

পরিকল্পনা

মৃত্যুদণ্ড কার্যকর করার পরিকল্পনায় আগ্রহের অন্যান্য পরিসংখ্যান হ'ল

+----------------------------------+--------------+--------------+-----------------+
|                                  | Table Scan A | Table Scan B | Row Count Spool |
+----------------------------------+--------------+--------------+-----------------+
| Number Of Executions             | 2            |            2 |             101 |
| Actual Number Of Rows - Total    | 101          |        20000 |         1004588 |
| Actual Number Of Rows - Thread 0 | -            |              |                 |
| Actual Number Of Rows - Thread 1 | 95           |        10000 |          945253 |
| Actual Number Of Rows - Thread 2 | 6            |        10000 |           59335 |
| Actual Rebinds                   | 0            |            0 |               2 |
| Actual Rewinds                   | 0            |            0 |              99 |
+----------------------------------+--------------+--------------+-----------------+

আমার অনুমানটি কেবল তাই যে কাজগুলি সমান্তরালভাবে প্রক্রিয়াজাত করা হচ্ছে একটি কাজ মাঝের ফ্লাইট প্রসেসিং সারিগুলিতে যখন অন্য এক মিলিয়নতম সারিটি জমায়েত প্রবাহ অপারেটরে সরবরাহ করে তাই অতিরিক্ত সারিগুলি পরিচালনা করা হচ্ছে। অতিরিক্তভাবে এই নিবন্ধটি থেকে সারিগুলি বার্ফ করা হয় এবং এই পুনরুক্তিকারীকে ব্যাচগুলিতে সরবরাহ করা হয় সুতরাং এটি সম্ভবত সম্ভবত মনে হয় যে TOPকোনও ইভেন্টের স্পেসিফিকেশনটিকে আঘাত করার পরিবর্তে প্রক্রিয়াধীন সারিগুলির সংখ্যা অতিক্রম করবে ।

সম্পাদন করা

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

count       Table Scan A: Total Actual Row Spool - Total Actual Rows
----------- ------------------------------ ------------------------------
352         101                            1004588
323         102                            1004588
72          101                            1003565
37          101                            1002542
35          102                            1003565
29          101                            1001519
18          101                            1000496
13          102                            1002542
5           9964                           99634323
5           102                            1001519
4           9963                           99628185
3           10000                          100000000
3           9965                           99642507
2           9964                           99633300
2           9966                           99658875
2           9965                           99641484
1           9984                           99837989
1           102                            1000496
1           9964                           99637392
1           9968                           99671151
1           9966                           99656829
1           9972                           99714117
1           9963                           99629208
1           9985                           99847196
1           9967                           99665013
1           9965                           99644553
1           9963                           99623626
1           9965                           99647622
1           9966                           99654783
1           9963                           99625116

এটি দেখা যায় যে 1,004,588 এখনও পর্যন্ত সর্বাধিক সাধারণ ফলাফল ছিল তবে 3 টি পরিস্থিতিতে সবচেয়ে খারাপ সম্ভাব্য ঘটনাটি ঘটে এবং 100,000,000 সারি প্রক্রিয়াজাত করা হয়। সবচেয়ে ভাল কেসটি লক্ষ্য করা গেছে 1000,496 সারি গণনা, যা 19 বার ঘটেছে।

পুনরুত্পাদন করার জন্য পূর্ণ স্ক্রিপ্ট এই উত্তরের 2 টি সংশোধনের নীচে রয়েছে (2 টিরও বেশি প্রসেসর সহ কোনও সিস্টেমে চালনা করা হলে এটি টুইট করতে হবে)।


1

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

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