मुझे इंट / स्मॉलिंट का वार्चर में एक अंतर्निहित रूपांतरण क्यों मिल रहा है, और क्या यह वास्तव में कार्डिनैलिटी एस्टीमेट को प्रभावित कर रहा है?


11

मैं वास्तविक निष्पादन योजना पर शो प्लान एनालिसिस (SSMS) का उपयोग करके धीमी प्रदर्शन करने वाली क्वेरी को शूट करने की कोशिश कर रहा हूं। विश्लेषण उपकरण बताता है कि पंक्तियों की संख्या का अनुमान योजना में कुछ स्थानों पर लौटाए गए परिणामों से है और आगे मुझे कुछ निहित रूपांतरण संकेत देता है।

मुझे लगता है कि वारचर को दिए गए अंतर के इन निहितार्थों को नहीं समझा जाता है- संदर्भित फ़ील्ड क्वेरी पर किसी भी पैरामीटर / फ़िल्टर का हिस्सा नहीं हैं और इसमें सभी तालिकाएँ शामिल हैं जिसमें स्तंभ डेटा प्रकार समान हैं:

मुझे कार्डिनलिटी के तहत चेतावनी मिलती है:

अभिव्यक्ति में रूपांतरण टाइप करें (CONVERT_IMPLICIT (varchar (12), [ccd] [प्रोफाइल], 0)) क्वेरी प्लान पसंद में "CardinalityEstimate" को प्रभावित कर सकता है - यह क्षेत्र मेरे DB में हर जगह एक पूर्णांक है।

अभिव्यक्ति में रूपांतरण टाइप करें (CONVERT_IMPLICIT (varchar (6), [ccd] [। नोड], 0)) क्वेरी प्लान की पसंद में "CardinalityEstimate" को प्रभावित कर सकता है - यह क्षेत्र मेरे DB में हर जगह एक छोटा सा है।

अभिव्यक्ति में रूपांतरण टाइप करें (CONVERT_IMPLICIT (varchar (6), [ccd]। [Sessionseqnum], 0)) क्वेरी प्लान पसंद में "कार्डिनैलिटीEstimate" को प्रभावित कर सकता है - यह क्षेत्र मेरे DB में हर जगह एक छोटा सा है।

अभिव्यक्ति में रूपांतरण टाइप करें (CONVERT_IMPLICIT (varchar (41), [ccd] [सत्रांक], 0)) क्वेरी प्लान की पसंद में "कार्डिनैलिटी इस्टीमेट" को प्रभावित कर सकता है - यह क्षेत्र मेरे DB में हर जगह एक दशमलव है।

[संपादित करें] यहाँ https://www.brentozar.com/pastetheplan/?id=SysYt0NzN संदर्भ के लिए क्वेरी और वास्तविक निष्पादन योजना है

और टेबल परिभाषाएँ ।।

/****** Object:  Table [dbo].[agentconnectiondetail]    Script Date: 1/10/2019 9:10:04 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[agentconnectiondetail](
    [sessionid] [decimal](18, 0) NOT NULL,
    [sessionseqnum] [smallint] NOT NULL,
    [nodeid] [smallint] NOT NULL,
    [profileid] [int] NOT NULL,
    [resourceid] [int] NOT NULL,
    [startdatetime] [datetime2](7) NOT NULL,
    [enddatetime] [datetime2](7) NOT NULL,
    [qindex] [smallint] NOT NULL,
    [gmtoffset] [smallint] NOT NULL,
    [ringtime] [smallint] NULL,
    [talktime] [smallint] NULL,
    [holdtime] [smallint] NULL,
    [worktime] [smallint] NULL,
    [callwrapupdata] [varchar](40) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [callresult] [smallint] NULL,
    [dialinglistid] [int] NULL,
    [convertedStartDatetimelocal] [datetime2](7) NULL,
    [convertedEndDatetimelocal] [datetime2](7) NULL,
 CONSTRAINT [PK_agentconnectiondetail] PRIMARY KEY CLUSTERED 
(
    [sessionid] ASC,
    [sessionseqnum] ASC,
    [nodeid] ASC,
    [profileid] ASC,
    [resourceid] ASC,
    [startdatetime] ASC,
    [qindex] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[contactcalldetail]    Script Date: 1/10/2019 9:10:04 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[contactcalldetail](
    [sessionid] [decimal](18, 0) NOT NULL,
    [sessionseqnum] [smallint] NOT NULL,
    [nodeid] [smallint] NOT NULL,
    [profileid] [int] NOT NULL,
    [contacttype] [smallint] NOT NULL,
    [contactTypeDescription] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
    [contactdisposition] [smallint] NOT NULL,
    [contactdispositionDescription] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
    [dispositionreason] [varchar](100) COLLATE Latin1_General_CI_AS NULL,
    [originatortype] [smallint] NOT NULL,
    [originatorTypeDescription] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
    [originatorid] [int] NULL,
    [originatordn] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
    [destinationtype] [smallint] NULL,
    [destinationTypeDescription] [varchar](20) COLLATE Latin1_General_CI_AS NULL,
    [destinationid] [int] NULL,
    [destinationdn] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
    [startdatetimeUTC] [datetime2](7) NOT NULL,
    [enddatetimeUTC] [datetime2](7) NOT NULL,
    [gmtoffset] [smallint] NOT NULL,
    [callednumber] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
    [origcallednumber] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
    [applicationtaskid] [decimal](18, 0) NULL,
    [applicationid] [int] NULL,
    [applicationname] [varchar](30) COLLATE Latin1_General_CI_AS NULL,
    [connecttime] [smallint] NULL,
    [customvariable1] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable2] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable3] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable4] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable5] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable6] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable7] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable8] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable9] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [customvariable10] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [accountnumber] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [callerentereddigits] [varchar](40) COLLATE Latin1_General_CI_AS NULL,
    [badcalltag] [char](1) COLLATE Latin1_General_CI_AS NULL,
    [transfer] [bit] NULL,
    [NextSeqNum] [smallint] NULL,
    [redirect] [bit] NULL,
    [conference] [bit] NULL,
    [flowout] [bit] NULL,
    [metservicelevel] [bit] NULL,
    [campaignid] [int] NULL,
    [origprotocolcallref] [varchar](32) COLLATE Latin1_General_CI_AS NULL,
    [destprotocolcallref] [varchar](32) COLLATE Latin1_General_CI_AS NULL,
    [convertedStartDatetimelocal] [datetime2](7) NULL,
    [convertedEndDatetimelocal] [datetime2](7) NULL,
    [AltKey]  AS (concat([sessionid],[sessionseqnum],[nodeid],[profileid]) collate database_default) PERSISTED NOT NULL,
    [PrvSeqNum] [smallint] NULL,
 CONSTRAINT [PK_contactcalldetail] PRIMARY KEY CLUSTERED 
(
    [sessionid] ASC,
    [sessionseqnum] ASC,
    [nodeid] ASC,
    [profileid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[contactqueuedetail]    Script Date: 1/10/2019 9:10:04 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[contactqueuedetail](
    [sessionid] [decimal](18, 0) NOT NULL,
    [sessionseqnum] [smallint] NOT NULL,
    [profileid] [int] NOT NULL,
    [nodeid] [smallint] NOT NULL,
    [targetid] [int] NOT NULL,
    [targettype] [smallint] NOT NULL,
    [targetTypeDescription] [varchar](10) COLLATE Latin1_General_CI_AS NULL,
    [qindex] [smallint] NOT NULL,
    [queueorder] [smallint] NOT NULL,
    [disposition] [smallint] NULL,
    [dispositionDescription] [varchar](50) COLLATE Latin1_General_CI_AS NULL,
    [metservicelevel] [bit] NULL,
    [queuetime] [smallint] NULL,
 CONSTRAINT [PK_contactqueuedetail] PRIMARY KEY CLUSTERED 
(
    [sessionid] ASC,
    [sessionseqnum] ASC,
    [profileid] ASC,
    [nodeid] ASC,
    [targetid] ASC,
    [targettype] ASC,
    [qindex] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Index [<Name of Missing Index, sysname,>]    Script Date: 1/10/2019 9:10:04 AM ******/
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] ON [dbo].[contactcalldetail]
(
    [convertedStartDatetimelocal] ASC
)
INCLUDE (   [sessionid],
    [sessionseqnum],
    [nodeid],
    [profileid]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
/****** Object:  Index [idx_CCD_ContactType_DestType_StDtLocal]    Script Date: 1/10/2019 9:10:04 AM ******/
CREATE NONCLUSTERED INDEX [idx_CCD_ContactType_DestType_StDtLocal] ON [dbo].[contactcalldetail]
(
    [destinationtype] ASC,
    [contacttype] ASC,
    [convertedStartDatetimelocal] ASC
)
INCLUDE (   [sessionid],
    [sessionseqnum],
    [nodeid],
    [profileid],
    [convertedEndDatetimelocal]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [idx_CQD_Profile_Traget_TargetType]    Script Date: 1/10/2019 9:10:04 AM ******/
CREATE NONCLUSTERED INDEX [idx_CQD_Profile_Traget_TargetType] ON [dbo].[contactqueuedetail]
(
    [profileid] ASC,
    [targetid] ASC,
    [targettype] ASC
)
INCLUDE (   [targetTypeDescription],
    [queueorder],
    [disposition],
    [dispositionDescription],
    [queuetime]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

जवाबों:


11

निहित रूपांतरण गणना कॉलम के कारण होता है AltKey:

CREATE TABLE dbo.Test
(
    [sessionid] [decimal](18, 0) NOT NULL,
    [sessionseqnum] [smallint] NOT NULL,
    [nodeid] [smallint] NOT NULL,
    [profileid] [int] NOT NULL,
    [AltKey] AS 
        CONCAT
        (
            [sessionid],
            [sessionseqnum],
            [nodeid],
            [profileid]
        ) PERSISTED NOT NULL,
);

उपरोक्त सरलीकृत तालिका को देखते हुए, नीचे दिया गया सरल कथन प्रश्न में दिए गए समान रूपांतर रूपांतरण चेतावनी देता है:

SELECT T.*
FROM dbo.Test AS T;

चेतावनियों के साथ योजना

से प्रलेखन (जोर जोड़ा):

CONCAT निहितार्थ से पहले सभी तर्कों को स्ट्रिंग प्रकारों में परिवर्तित किया जाता है।

चेतावनी तब जोड़ी जाती है जब SQL सर्वर एक योजना विकल्प पर विचार करता है जो निरंतर मूल्य का उपयोग नहीं करता है, लेकिन मूल्य को स्पष्ट रूप से गणना करता है। चेतावनी को हटा नहीं दिया जाता है यदि अंतिम योजना बनी हुई मूल्य का उपयोग करती है।

इस मामले में चेतावनियों को सुरक्षित रूप से अनदेखा किया जा सकता है। यह आपकी निष्पादन योजना पर भी लागू होता है, जहां तक ​​मैं बता सकता हूं - इसमें शामिल निहित रूपांतरण CONCATयोजना की पसंद को प्रतिकूल रूप से प्रभावित नहीं कर रहे हैं।

अनिर्धारित और असमर्थित ट्रेस ध्वज का उपयोग करना 176 परिकलित संगणक स्तंभ के विस्तार को रोकता है और चेतावनी को हटा देता है:

SELECT * 
FROM dbo.Test AS T
OPTION (QUERYTRACEON 176);

tf 176 के साथ

अधिक विवरण के लिए मेरा लेख उचित रूप से संगणित कॉलम में देखें।


5

ये वे क्षेत्र हैं जिनके बारे में आपको अंतर्निहित रूपांतरण चेतावनी मिल रही है:

  • [ccd].[profileid] (int से varchar (12))
  • [ccd].[nodeid] (लघुचर से वारचर (6))
  • [ccd].[sessionseqnum] (लघुचर से वारचर (6))
  • [ccd].[sessionid] (दशमलव से दशमलव तक (41))

संदर्भित फ़ील्ड क्वेरी पर किसी भी पैरामीटर / फ़िल्टर का हिस्सा नहीं हैं

सुनिश्चित करें कि वे आपकी सम्मिलित स्थितियों में हैं। यहां वह जगह है जहां ccd.profileid को एक फिल्टर के रूप में इस्तेमाल किया जा रहा है (साथ ही एक एजेंट में शामिल होने के लिए)

FROM contactcalldetail ccd 
    INNER JOIN contactqueuedetail csqd 
        ON ccd.sessionID=csqd.sessionid 
            AND ccd.sessionSeqNum=csqd.sessionSeqNum 
            AND ccd.nodeID=csqd.nodeID 
            AND ccd.profileid=csqd.profileid -- Right here

और सभी तालिका में कॉलम डेटा प्रकार समान हैं

आप तालिका की परिभाषाओं को दोबारा जांचना चाहते हैं

  • contactcalldetail.profileid
  • contactqueuedetail.profileid
  • agentconnectiondetail .profileid

ऐसा लगता है कि वे उन डेटा प्रकारों का उपयोग नहीं कर रहे हैं जिन्हें आप सोचते हैं कि वे उपयोग कर रहे हैं।

और क्या यह वास्तव में कार्डिनैलिटी एस्टीमेट को प्रभावित कर रहा है?

आपके द्वारा प्रदान की गई जानकारी के आधार पर मेरे उत्तर में कुछ अनुमान चल रहा है। मैं आपको वास्तविक निष्पादन योजना और तालिका परिभाषाओं को अपने प्रश्न में जोड़ने के लिए प्रोत्साहित करता हूं ताकि हमारे पास सभी विवरण शामिल हों जो इन अंतर्निहित रूपांतरण मुद्दों में खेल रहे हों।

सामान्य तौर पर, शामिल होने की शर्तों पर निहित रूपांतरण अनुमानों के साथ गंभीर मुद्दों का कारण बन सकता है । यह कहना मुश्किल है कि वास्तविक निष्पादन योजना को देखे बिना आपके मामले में ऐसा हो रहा है या नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.