একটি স্থায়ী গণিত কলামে সূচি সন্ধানযোগ্য নয়


15

আমার কাছে টেবিল রয়েছে, বলা আছে Address, এটিতে একটি অবিরাম গণিত কলাম রয়েছে Hashkey। কলামটি নির্বিচারবাদী তবে সঠিক নয়। এটির উপর এটির একটি অনন্য সূচক রয়েছে যা অন্বেষণযোগ্য নয়। আমি যদি এই কোয়েরিটি চালিত করি তবে প্রাথমিক কীটি ফিরে আসছি:

SELECT @ADDRESSID= ISNULL(AddressId,0)
FROM dbo.[Address]
WHERE HashKey = @HashKey

আমি এই পরিকল্পনাটি পেয়েছি:

BasicPlan

যদি আমি সূচককে বাধ্য করি তবে আমি আরও খারাপ পরিকল্পনাটি পেয়েছি:

ForceIndex

যদি আমি সূচী এবং সন্ধান উভয়ের জন্য চেষ্টা ও জোর করি তবে আমি একটি ত্রুটি পেয়েছি:

এই কোয়েরিতে সংজ্ঞায়িত ইঙ্গিতগুলির কারণে ক্যোয়ারী প্রসেসর কোনও ক্যোয়ারী প্ল্যান তৈরি করতে পারেনি। কোনও ইঙ্গিত নির্দিষ্ট না করে এবং ব্যবহার না করে কোয়েরিটি পুনরায় জমা দিনSET FORCEPLAN

এটি ঠিক কারণ এটি ঠিক না? আমি ভেবেছিলাম যে এটি স্থির থাকলে কিছু যায় আসে না?

এটি একটি অ-গণিত কলাম না করে এই সূচিটি সন্ধানযোগ্য করার কোনও উপায় আছে কি?

কারও কি এই সম্পর্কে তথ্যের কোনও লিঙ্ক আছে?

আমি প্রকৃত সারণী তৈরি পোস্ট করতে পারি না, তবে এখানে একটি পরীক্ষার টেবিল যা একই সমস্যা:

drop TABLE [dbo].[Test]

CREATE TABLE [dbo].[Test]
  (
     [test]        [VARCHAR](100) NULL,
     [TestGeocode] [geography] NULL,
     [Hashkey] AS CAST(
                        ( hashbytes
                            ('SHA', 
                                ( RIGHT(REPLICATE(' ', (100)) + isnull([test], ''), ( 100 )) ) 
                                + RIGHT(REPLICATE(' ', (100)) + isnull([TestGeocode].[ToString](), ''), ( 100 ))
                            ) 
                        ) AS BINARY(20)                                                                                                        
                      ) PERSISTED
    CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
  )    
GO    
DECLARE @Hashkey BINARY(20)

SELECT [Hashkey]
FROM   [dbo].[Test] WITH (FORCESEEK) /*Query processor could not produce a query plan*/
WHERE  [Hashkey] = @Hashkey 

উত্তর:


12

সমস্যাটি [TestGeocode].[ToString]()একটি maxডেটাটাইপ ( nvarchar(max)) ফেরত দেওয়ার সাথে সম্পর্কিত বলে মনে হচ্ছে ।

আমি এই সহজ সংস্করণের সাথে প্রসঙ্গের সম্মুখীন (সংজ্ঞা পরিবর্তন c1করতে varchar(8000)বা ব্যবহার COALESCEপরিবর্তে ISNULLসমাধান করা এটা)

DROP TABLE dbo.Test

CREATE TABLE dbo.Test
  (
     c1        VARCHAR(
                          MAX    --Fails
                        --  8000 --Works fine
                          ) NULL,
     comp1 AS CAST(ISNULL(c1, 'ABC') AS VARCHAR(100))
    CONSTRAINT UK_Test_comp1 UNIQUE NONCLUSTERED(comp1)
  )

GO

DECLARE @comp1 VARCHAR(100)

SELECT comp1
FROM   dbo.Test WITH (FORCESEEK)
WHERE  comp1 = @comp1 
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8606); 

গণিত কলামের রেফারেন্সগুলি অন্তর্নিহিত সংজ্ঞাতে প্রসারিত হয়ে পরে কলামে ফিরে মিলবে। এটি কোনও নাম দ্বারা রেফারেন্স না দিয়ে গণিত কলামগুলিকে মেলানোর অনুমতি দেয় এবং অন্তর্নিহিত সংজ্ঞাগুলিতে সরলকরণকে পরিচালনা করার অনুমতি দেয়।

ISNULLপ্রথম প্যারামিটারের ডেটাটাইপ প্রদান করে ( VARCHAR(MAX)আমার উদাহরণে)। রিটার্নের ধরণটি এখানেও COALESCEআসবে VARCHAR(MAX)তবে সমস্যাটি এড়ানো এমনভাবে আলাদাভাবে মূল্যায়ন করা হবে বলে মনে হয়।

যেসব ক্ষেত্রে ক্যোয়ারী সাফল্য পেয়েছে তার মধ্যে ট্রেস ফ্ল্যাগ আউটপুটটি অন্তর্ভুক্ত রয়েছে

ScaOp_Convert varchar(max) collate 49160,Null,Var,Trim,ML=65535

    ScaOp_Const TI(varchar collate 49160,Var,Trim,ML=3) 
                      XVAR(varchar,Owned,Value=Len,Data = (3,ABC))

যেখানে এটি ব্যর্থ হয় এটি দ্বারা প্রতিস্থাপিত হয়

ScaOp_Identifier COL: ConstExpr1003 

আমি অনুমান করি যে ক্ষেত্রে এটি ব্যর্থ হয় সে ক্ষেত্রে (অন্তর্নিহিত) CAST('ABC' AS VARCHAR(MAX))কেবল একবার করা হয় এবং এটি রানটাইম ধ্রুবক ( আরও তথ্য ) হিসাবে মূল্যায়ন করা হয় । তবে এই রানটাইম ধ্রুবক লেবেলটির উল্লেখ, প্রকৃত স্ট্রিং আক্ষরিক মানের পরিবর্তে, এটি গণনাকৃত কলাম সংজ্ঞা মেলাতে বাধা দেয়।

এই পুনর্লিখনটি আপনার ক্যোয়ারিতে সমস্যাটিকে এড়িয়ে চলে

CREATE TABLE [dbo].[Test]
  (
     [test]        [VARCHAR](100) NULL,
     [TestGeocode] [geography] NULL,
     [Hashkey] AS CAST(
                        ( hashbytes
                            ('SHA', 
                                ( RIGHT(SPACE(100) + isnull([test], ''), 100) ) 
                                + RIGHT(SPACE(100) + isnull(CAST(RIGHT([TestGeocode].[ToString](),100) AS VARCHAR(100)), ''),100)
                            ) 
                        ) AS BINARY(20)                                                                                                        
                      ) PERSISTED
    CONSTRAINT [UK_Test_HashKey] UNIQUE NONCLUSTERED([Hashkey])
  )

0

যদি @HashKeyইনডেক্সড কলামের সাথে ডেটা ধরণের ডেটা মেলে না তবে আপনি অ-সর্গেবল এক্সপ্রেশনের কারণে এই লক্ষণগুলি পাবেন । CASTপছন্দসই ডেটা ধরণের চাপ দেওয়ার জন্য আপনার গণিত কলামের এক্সপ্রেশনটিতে একটি স্পষ্ট প্রয়োজন হতে পারে ।

আপনার তিরস্কারের ভিত্তিতে, আমি সন্দেহ করি এটি একটি বাগ। আমি একটি সংযোগ বাগ দায়ের করেছি, গণনা করা কলাম সূচক ব্যবহার করা হয়নি , মার্টিনের কাজের সংস্করণেরও একটি সংস্করণ রয়েছে। নির্দ্বিধায় ভোট দিন।

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