যদি কোনও সিটিই কোয়েরিতে সংজ্ঞায়িত হয় এবং কখনই ব্যবহৃত হয় না, এটি কি শব্দ করে?


32

প্রশ্নগুলিতে অব্যবহৃত সিটিইগুলি কি কর্মক্ষমতা প্রভাবিত করে এবং / অথবা উত্পন্ন উত্পন্ন ক্যোয়ারী পরিকল্পনার পরিবর্তন করে?

উত্তর:


21

এটি তারা প্রদর্শিত হয় না বলে মনে হয় না, তবে এটি কেবলমাত্র নেস্টেড সিটিইগুলিতে প্রযোজ্য।

দুটি টেম্প টেবিল তৈরি করুন:

CREATE TABLE #t1 (id INT);
INSERT #t1 ( id )
VALUES ( 1 );

CREATE TABLE #t2 (id INT);
INSERT #t2 ( id )
VALUES ( 1 );

প্রশ্ন 1:

WITH your_mom AS (
    SELECT TOP 1 *
    FROM #t1 AS t 
),
also_your_mom AS (
    SELECT TOP 1 *
    FROM #t2 AS t
)
SELECT *
FROM your_mom;

প্রশ্ন 2:

WITH your_mom AS (
    SELECT TOP 1 *
    FROM #t1 AS t 
),
also_your_mom AS (
    SELECT TOP 1 *
    FROM #t2 AS t
)
SELECT *
FROM also_your_mom;

অনুসন্ধানের পরিকল্পনা:

পাগল

একটি ওভারহেড রয়েছে, তবে ক্যোয়ারির অপ্রয়োজনীয় অংশটি খুব তাড়াতাড়ি মুছে ফেলা হয়েছে (এই ক্ষেত্রে বিশ্লেষণের সময়; আরও জটিল ক্ষেত্রে সরলকরণের পর্যায়ে), সুতরাং অতিরিক্ত কাজ সত্যই ন্যূনতম, এবং ব্যয়বহুল ব্যয়-ভিত্তিক ব্যয় করতে অবদান রাখে না অপ্টিমাইজেশান।


28

এরিকের কাছে +1, তবে দুটি জিনিস যুক্ত করতে চেয়েছিলেন (যা কোনও মন্তব্যে ভালভাবে কাজ করে না):

  1. এমনকি ব্যবহারের সময় এগুলি অবহেলা করা হয় তা দেখতে আপনার মৃত্যুদণ্ডের পরিকল্পনাগুলিও দেখার প্রয়োজন হয় না। নিম্নলিখিতগুলিতে "0 দ্বারা বিভাজন" ত্রুটি তৈরি করা উচিত তবে cte2একেবারে নির্বাচিত না হওয়ার কারণে নয়:

    ;WITH cte1 AS
    (
      SELECT 1 AS [Bob]
    ),
    cte2 AS (
      SELECT 1 / 0 AS [Err]
      FROM cte1
    )
    SELECT *
    FROM   cte1;
    
  2. কোটে এর উপেক্ষা করা যাবে, এমনকি যদি তারা শুধুমাত্র কোটে, এবং তারা, থেকে নির্বাচন করা হয় এমনকি যদি যদি কথাটি সব সারি যাহাই হউক না কেন বাদ দেওয়া হবে। নিম্নলিখিতটি এমন একটি ক্ষেত্রে রয়েছে যেখানে ক্যোয়ারী অপ্টিমাইজারটি আগেই জানে যে সিটিই থেকে কোনও সারি ফেরত দেওয়া যায় না, তাই এটি সম্পাদন করতেও বিরক্ত করে না:

    ;WITH cte AS
    (
      SELECT 1 / 0 AS [Bob]
    )
    SELECT TOP (1) [object_id]
    FROM   sys.objects
    UNION ALL
    SELECT cte.[Bob]
    FROM   cte
    WHERE  1 = 0;
    

পারফরম্যান্স সম্পর্কে, অব্যবহৃত সিটিই পার্স এবং সংকলন করা হয়েছে (বা কমপক্ষে নীচের ক্ষেত্রে সংকলিত), সুতরাং এটি 100% উপেক্ষা করা হবে না, তবে ব্যয়টি তুচ্ছ হবে এবং উদ্বিগ্ন হওয়ার মতো নয়।

শুধুমাত্র পার্সিং করার সময় কোনও ত্রুটি নেই:

SET PARSEONLY ON;

;WITH cte1 AS
(
  SELECT obj.[NotHere]
  FROM   sys.objects obj
)
SELECT TOP (1) so.[name]
FROM   sys.objects so

GO
SET PARSEONLY OFF;
GO

মৃত্যুদন্ড কার্যকর করার অল্প সময়ে যখন সমস্ত কিছু করা হয় তখন একটি সমস্যা হয়:

GO
SET NOEXEC ON;
GO

;WITH cte1 AS
(
  SELECT obj.[NotHere]
  FROM   sys.objects obj
)
SELECT TOP (1) so.[name]
FROM   sys.objects so

GO
SET NOEXEC OFF;
GO
/*
Msg 207, Level 16, State 1, Line XXXXX
Invalid column name 'NotHere'.
*/

আশা করি আমি একাধিক উত্তর সঠিক হিসাবে চিহ্নিত করতে পারতাম, তবে এরিক আপনাকে পিস্তল ড্রতে মারবে। :) তবে আপনার উত্তরটি খুব তথ্যমূলক এবং দুর্দান্ত, ধন্যবাদ!
জেডি

যদি সিটিই'র কোনও ভিউ হয় এবং এই ভিউটি 3 বারের বেশি বাসা বেঁধে থাকে তবে কী হবে? এমন কোনও বিন্দু নেই যেখানে অপ্টিমাইজার সব ছেড়ে দেয়?
জিকাটো

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

@ সলোমনরুতজকি ন্যায্য হতে, আমি এটি পরীক্ষা করেছিলাম, তবে এটি চূড়ান্ত হয়নি। আমি আপনার সিটি উদাহরণ থেকে একটি ভিউ তৈরি করেছি এবং এটি 5 বার নেস্ট করেছি, তবে যেহেতু এটি সমস্ত ধ্রুব স্ক্যান এবং সত্যই জটিল নয়, তাই অপটিমাইজার এটি ভালভাবে পরিচালনা করেছে। আমি ভবিষ্যতে এটি আরও পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে এবং আরও জটিল যুক্তির আড়ালে আড়াল করতে চাই। আমি তোমাকে জানাবো.
জিকাটো

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