এই স্ট্রিমের সমষ্টি কেন প্রয়োজনীয়?


12

এই কোয়েরিটি দেখুন। এটি বেশ সহজ (টেবিল এবং সূচী সংজ্ঞাগুলির জন্য পোস্টের শেষে এবং একটি তদন্তের স্ক্রিপ্ট দেখুন):

SELECT MAX(Revision)
FROM dbo.TheOneders
WHERE Id = 1 AND 1 = (SELECT 1);

দ্রষ্টব্য: "এবং 1 = (নির্বাচন 1) এই ক্যোয়ারীটিকে স্বয়ংক্রিয়ভাবে প্যারামিটারাইজড করা থেকে বিরত রাখার জন্য, যা আমার মনে হয়েছিল যে বিষয়টি সমস্যাটিকে বিভ্রান্ত করছে - এটি আসলে সেই ধারাটির সাথে বা ছাড়া একই পরিকল্পনা পেয়েছে

এবং এখানে পরিকল্পনাটি রয়েছে ( পরিকল্পনার লিঙ্কটি পেস্ট করুন) :

একটি স্ট্রিম আগ্রাসনের সাথে পরিকল্পনা করুন

যেহেতু সেখানে একটি "শীর্ষ 1" রয়েছে তাই আমি স্ট্রিমের সামগ্রিক অপারেটরটি দেখে অবাক হয়েছি। এটি আমার পক্ষে প্রয়োজনীয় বলে মনে হচ্ছে না, যেহেতু কেবলমাত্র এক সারি হওয়ার নিশ্চয়তা রয়েছে।

এই তত্ত্বটি পরীক্ষা করার জন্য, আমি এই যৌক্তিক সমতুল্য ক্যোয়ারীটি চেষ্টা করেছিলাম:

SELECT MAX(Revision)
FROM dbo.TheOneders
WHERE Id = 1
GROUP BY Id;

এখানে তার জন্য পরিকল্পনাটি রয়েছে ( পরিকল্পনার লিঙ্কটি পেস্ট করুন ):

একটি স্ট্রিম আগ্রাসন ছাড়াই পরিকল্পনা করুন

নিশ্চিতভাবেই, পরিকল্পনা অনুসারে গোষ্ঠীটি স্ট্রিম সামগ্রিক অপারেটর ছাড়াই পেতে সক্ষম হয়।

লক্ষ্য করুন যে উভয় প্রশ্ন সূচকের শেষ থেকে "পিছনের দিকে" পড়ে এবং সর্বোচ্চ সংশোধন পেতে একটি "শীর্ষ 1" করুন do

আমি এখানে কি মিস করছি? স্ট্রিম সামগ্রিক আসলে প্রথম ক্যোয়ারীতে কাজ করছে, বা এটি নির্মূল করতে সক্ষম হওয়া উচিত (এবং এটি কেবলমাত্র অপটিমাইজারের সীমাবদ্ধতা নয়)?

যাইহোক, আমি বুঝতে পারি এটি একটি অবিশ্বাস্যভাবে ব্যবহারিক সমস্যা নয় (উভয় কোয়েরিজের রিপোর্ট 0 মাইলের সিপিইউ এবং অতিবাহিত সময়), আমি এখানে অভ্যন্তরীণ / আচরণের জন্য এখানে প্রদর্শিত হতে আগ্রহী।


উপরোক্ত দুটি ক্যুরিয় চালানোর আগে আমি যে সেটআপ কোডটি দৌড়েছি তা এখানে:

DROP TABLE IF EXISTS dbo.TheOneders;
GO

CREATE TABLE dbo.TheOneders
(
    Id INT NOT NULL,
    Revision SMALLINT NOT NULL,
    Something NVARCHAR(23),

    CONSTRAINT PK_TheOneders PRIMARY KEY NONCLUSTERED (Id, Revision)
);
GO

INSERT INTO dbo.TheOneders
    (Id, Revision, Something)
SELECT DISTINCT TOP 1000 
    1, m.message_id, 'Do...'
FROM sys.messages m
ORDER BY m.message_id
OPTION (MAXDOP 1);

INSERT INTO dbo.TheOneders
    (Id, Revision, Something)
SELECT DISTINCT TOP 100 
    2, m.message_id, 'Do that thing you do...'
FROM sys.messages m
ORDER BY m.message_id
OPTION (MAXDOP 1);
GO

উত্তর:


16

যদি কোনও সারি শৃঙ্খলার সাথে মেলে না আপনি এই সমষ্টিটির ভূমিকা দেখতে পারবেন WHERE

SELECT MAX(Revision)
FROM   dbo.TheOneders
WHERE  Id = 1
       AND 1 = 1 /*To avoid auto parameterisation*/
       AND Id%3 = 4  /*always false*/

সেক্ষেত্রে শূন্য সারিগুলি সামগ্রীতে যায় তবে এটি এখনও একটিকে নির্গত করে কারণ সঠিক শব্দার্থবিজ্ঞানগুলি NULLএই ক্ষেত্রে ফিরে আসবে ।

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

এটি কোনও ভেক্টরের বিপরীতে যেমন একটি স্কেলার সমষ্টি।

আপনার "যৌক্তিকভাবে সমতুল্য" ক্যোয়ারির সমতুল্য নয়। যোগ করা GROUP BY Idএটি একটি ভেক্টর সমষ্টিতে পরিণত করে এবং তারপরে সঠিক আচরণটি কোনও সারি না ফেরানো।

এ সম্পর্কে আরও তথ্যের জন্য স্কেলার এবং ভেক্টর সমষ্টিগুলির সাথে মজা দেখুন ।

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