যখন আমি একটি স্থির গণিত কলামটি নির্বাচন করি তখন কেন এসকিউএল সার্ভার "কম্পিউট স্কেলার" হয়?


21

SELECTএই কোডে তিনটি বিবৃতি

USE [tempdb];
GO

SET NOCOUNT ON;

CREATE TABLE dbo.persist_test (
      id            INT NOT NULL
    , id5           AS (id * 5)
    , id5p          AS (id * 5) PERSISTED
);

INSERT INTO dbo.persist_test (id)
VALUES (1), (2), (3);

SELECT id
FROM dbo.persist_test;

SELECT id5
FROM dbo.persist_test;

SELECT id5p
FROM dbo.persist_test;

DROP TABLE dbo.persist_test;

এই পরিকল্পনা তৈরি করুন:

হত্যা পরিকল্পনা

চূড়ান্ত SELECT, যা একটি স্থির মান নির্বাচন করা হয়, একটি গণনা স্কেলার অপারেটর উত্পাদন করে?


3
এখানে @ এসকিএলকিউইয়ের উত্তর দেখুন: কেন এক্সিকিউশন প্ল্যানে একটি গণিত কলামের জন্য একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশন কল অন্তর্ভুক্ত করে যা স্থির থাকে? । আপনার ক্যোয়ারিতে সারণী থেকে আউটপুট কলামের তালিকাটি কেবলমাত্র [tempdb].[dbo].[persist_test].idএবং এটি স্থির থাকা সত্ত্বেও মান গণনা করে।
মার্টিন স্মিথ

উত্তর:


14

কেবলমাত্র মন্তব্যে পরীক্ষামূলক অনুসন্ধানগুলির সংক্ষিপ্তসার হিসাবে এটি মনে হয় এমন প্রান্তের ঘটনা যা ঘটে যখন আপনার একই টেবিলে দুটি গণিত কলাম থাকে, এক persistedএবং একটি স্থির থাকে না এবং তাদের উভয়েরই একই সংজ্ঞা থাকে।

ক্যোয়ারির পরিকল্পনায়

SELECT id5p
FROM dbo.persist_test;

টেবিল স্ক্যানটি persist_testকেবলমাত্র idকলামকে সরিয়ে দেয়। পরবর্তী সংখ্যার স্কেলারটি গুণ করে যেটি 5 করে এবং id5এই কলামটি ক্যোয়ারীতেও রেফারেন্স না থাকা সত্ত্বেও ডাকা একটি কলাম আউটপুট করে। চূড়ান্ত গণনা স্কেলার বরাবর id5একটি কলাম হিসাবে ডাকা মান এবং আউটপুট গ্রহণ করে id5p

কোয়েরি অপ্টিমাইজার ডিপ ডাইভ - পার্ট 2 (অস্বীকৃতি: এই ট্রেস ফ্ল্যাগগুলি অননুমোদিত / অসমর্থিত) এ ব্যাখ্যা করা ট্রেস ফ্ল্যাগগুলি ব্যবহার করে এবং ক্যোয়ারীটি দেখছেন

SELECT id5,
       id5p,
       ( id * 5 )
FROM   dbo.persist_test 
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606);

আউটপুট দেয়

প্রকল্পের সাধারণকরণের আগে গাছ

LogOp_Project

    LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002 

    AncOp_PrjList 

        AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5

            ScaOp_Arithmetic x_aopMult

                ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id

                ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)

        AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p

            ScaOp_Arithmetic x_aopMult

                ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id

                ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)

        AncOp_PrjEl COL: Expr1004 

            ScaOp_Arithmetic x_aopMult

                ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id

                ScaOp_Const TI(int,ML=4) XVAR(int,Not Owned,Value=5)

প্রকল্প নরমালাইজেশন পরে গাছ

LogOp_Project

    LogOp_Get TBL: dbo.persist_test dbo.persist_test TableID=1717581157 TableReferenceID=0 IsRow: COL: IsBaseRow1002 

    AncOp_PrjList 

        AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5

            ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5

        AncOp_PrjEl QCOL: [tempdb].[dbo].[persist_test].id5p

            ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5

        AncOp_PrjEl COL: Expr1004 

            ScaOp_Identifier QCOL: [tempdb].[dbo].[persist_test].id5

সুতরাং দেখা যাচ্ছে যে সমস্ত গণিত কলামের সংজ্ঞাগুলি প্রসারিত হয়ে প্রজেক্ট নরমালাইজেশন পর্যায়ে সমস্ত অভিন্ন এক্সপ্রেশনগুলি গণিত কলামগুলির সাথে ফিরে মিলছে id5এবং এই ক্ষেত্রে এটি কেবল মিলবে । অর্থাৎ এটি persistedকলামকে কোনও পছন্দ দেয় না ।

নিম্নলিখিত সংজ্ঞা দিয়ে যদি সারণিটি পুনরায় তৈরি করা হয়

CREATE TABLE dbo.persist_test (
      id            INT NOT NULL
    , id5p          AS (5 * id) PERSISTED
    , id5           AS (5 * id)
);

তারপরে id5অথবা অনুরোধটি id5pরানটাইমের সময় গণনা না করে তথ্যের অবিচ্ছিন্ন সংস্করণটি পড়ে সন্তুষ্ট হবে যাতে কলাম ক্রমে ম্যাচটি দেখা যায় (কমপক্ষে এই ক্ষেত্রে) প্রদর্শিত হবে।

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