কেন নির্বাচন করুন () ক্যোয়ারী এক্সিকিউশন পরিকল্পনায় বাম যোগদানের টেবিল অন্তর্ভুক্ত?


9

এসকিউএল সার্ভার ২০১২-এ আমার অন্য টেবিলের সাথে যুক্ত হওয়ার সাথে টেবিলের মূল্যবান ফাংশন রয়েছে যা আমাকে এই 'টেবিলের মূল্যবান ফাংশন'-এর জন্য সারি সংখ্যা গণনা করতে হবে। আমি যখন কার্য সম্পাদন পরিকল্পনাটি পরিদর্শন করি তখন আমি বামে যোগ সারণীটি দেখতে পাচ্ছি। কেন? কীভাবে বামে যোগদানের সারণির প্রভাব সারণীর সংখ্যায় ফিরে আসতে পারে? আমি প্রত্যাশা করব যে ডিবি ইঞ্জিনকে SELECT গণনা (..) কোয়েরিতে বাম যৌথ টেবিলটি মূল্যায়ন করার দরকার নেই।

Select count(realtyId) FROM [dbo].[GetFilteredRealtyFulltext]('"praha"')

কার্যকর করার পরিকল্পনা:

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

টেবিলটি মূল্যবান ফাংশন:

CREATE FUNCTION [dbo].[GetFilteredRealtyFulltext]
(@criteria nvarchar(4000))
RETURNS TABLE
AS
RETURN (SELECT 
realty.Id AS realtyId,
realty.OwnerId,
realty.Caption AS realtyCaption,
realty.BusinessCategory,
realty.Created,
realty.LastChanged,
realty.LastChangedType,
realty.Price,
realty.Pricing,
realty.PriceCurrency,
realty.PriceNote,
realty.PricePlus,
realty.OfferState,
realty.OrderCode,
realty.PublishAddress,
realty.PublishMap,
realty.AreaLand,
realty.AreaCover,
realty.AreaFloor,
realty.Views,
realty.TopPoints,
realty.Radius,
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.krajId,
realty.okresId,
realty.obecId,
realty.cobceId,
IsNull(CONVERT(int,realty.Ranking),0) as Ranking,

realty.energy_efficiency_rating,
realty.energy_performance_attachment,
realty.energy_performance_certificate,
realty.energy_performance_summary,

Category.Id AS CategoryId,
Category.ParentCategoryId,
Category.WholeName,
okres.nazev AS okres,
ruian_obec.nazev AS obec,
ruian_cobce.nazev AS cobce,
ExternFile.ServerPath,
Person.ParentPersonId,
( COALESCE(ftR.Rank,0) + COALESCE(ftObec.Rank,0) + COALESCE(ftOkres.Rank,0) + COALESCE(ftpobvod.Rank,0)) AS FtRank

FROM realty
JOIN Category ON realty.CategoryId = Category.Id
LEFT JOIN ruian_cobce ON realty.cobceId = ruian_cobce.cobce_kod
LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod
LEFT JOIN okres ON realty.okresId = okres.okres_kod
LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND ExternFile.IsMain = 1 AND ExternFile.ForeignTable = 5
INNER JOIN Person ON realty.OwnerId = Person.Id
Left JOIN CONTAINSTABLE(Realty, *, @criteria) ftR ON realty.Id = ftR.[Key] 
Left JOIN CONTAINSTABLE(ruian_obec, *, @criteria) ftObec ON realty.obecId = ftObec.[Key] 
Left JOIN CONTAINSTABLE(Okres, *, @criteria) ftOkres ON realty.okresId = ftOkres.[Key]
Left JOIN CONTAINSTABLE(pobvod, *, @criteria) ftpobvod ON realty.pobvodId = ftpobvod.[Key]
WHERE Person.ConfirmStatus = 1
AND ( COALESCE(ftR.Rank,0) + COALESCE(ftObec.Rank,0) + COALESCE(ftOkres.Rank,0) + COALESCE(ftpobvod.Rank,0))  > 0
)

হালনাগাদ:

আমি রব ফারলির ধারণা অনুসরণ করতে অনন্য সূচক যুক্ত করেছি:

 Create unique nonclustered index ExternFileIsMainUnique ON ExternFile(ForeignId) WHERE IsMain = 1 AND ForeignTable = 5

এবং ডিবি ইঞ্জিন দ্বারা প্রস্তাবিত সূচী:

CREATE NONCLUSTERED INDEX [RealtyOwnerLocation] ON [dbo].[Realty]

([OwnerId] ASC) অন্তর্ভুক্ত ([আইডি], [OkresId], [obecId], [pobvodId]) যান

সরলতার জন্য আমি শর্তটি অপসারণ করি

WHERE Person.ConfirmStatus = 1

উপরে টেবিলযুক্ত মূল্যবান ফাংশন থেকে।

এখন কার্যকর করার পরিকল্পনাটি আরও সহজ তবে এটি এক্সটার্নফাইলে টেবিলটিকে স্পর্শ করে:

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

হতে পারে SQL সার্ভার যথেষ্ট চালাক না?

উত্তর:


12

যদি ForeignId, ForeignTable, IsMain* অদ্বিতীয় হিসাবে পরিচিত না হয় ExternFile, তবে কিউওতে গণনাটি কার্যকর করার জন্য সেই টেবিলটি অন্তর্ভুক্ত করতে হবে। যে কোনও সময় একাধিক সারি মেলে, গণনাটি প্রভাবিত হবে।

সরলকরণের
জন্য এসকিউএল সার্ভার ডিজাইনিংয়ে সরলীকরণে যোগদান করুন (এসকিউএলবিটস রেকর্ডিং)


* অপ্টিমাইজার বর্তমানে ফিল্টার করা অনন্য সূচিগুলি অনন্য হিসাবে স্বীকৃতি দেয় না

আপডেট (ওপি দ্বারা) : সমাধানটি বাম জোয়ারের (যা একাধিক সারি তৈরি করতে পারে) থেকে ক্যোয়ারিতে লাইন পরিবর্তন করা:

LEFT JOIN ExternFile ON realty.Id = ExternFile.ForeignId AND ExternFile.IsMain = 1 AND ExternFile.ForeignTable = 5

শীর্ষের সাথে আউটর আবেদন করতে (যা একটি সারি উত্পাদন করে এবং COUNT- কে প্রভাবিত করে না)

OUTER APPLY (SELECT TOP (1) ServerPath FROM ExternFile WHERE ForeignId = realty.Id AND IsMain = 1 AND ForeignTable = 5) AS ExternFile

ক্যোয়ারী এখন আরও কার্যকর। একটি অনন্য সূচক যুক্ত করা যায়নি, কারণ মানগুলি অনন্য ছিল না, তারা শুধুমাত্র শর্তে সংমিশ্রণের জন্য অনন্য ছিল এবং এটি উপরে বর্ণিত হিসাবে অনন্য হিসাবে বিবেচিত হয় না

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