sql server - এসকিউএল সার্ভার: দ্রুত প্রশ্ন, কিন্তু প্রক্রিয়া থেকে ধীর
sql-server performance (8)
একটি প্রশ্ন দ্রুত সঞ্চালিত হয়:
DECLARE @SessionGUID uniqueidentifier
SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908'
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
সাবট্রি খরচ: 0.502
কিন্তু একটি সঞ্চিত পদ্ধতিতে একই এসকিউএল নির্বাণ ধীরে ধীরে, এবং একটি সম্পূর্ণ ভিন্ন মৃত্যুদন্ড পরিকল্পনা সঙ্গে
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
EXECUTE ViewOpener @SessionGUID
সাবট্রি খরচ: 19.2
আমি রান করেছি
sp_recompile ViewOpener
এবং এটি এখনও একই (খারাপভাবে) চালায়, এবং আমি সংরক্ষণ প্রক্রিয়াটিও পরিবর্তন করেছি
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *, 'recompile please'
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
এবং আবার ফিরে, সত্যিই recompiling মধ্যে এটি চালানোর চেষ্টা।
আমি একটি নতুন পরিকল্পনা জেনারেট করার জন্য সংরক্ষিত স্ট্রাইকটি মুছে ফেলেছি এবং পুনরায় তৈরি করেছি।
আমি একটি decoy পরিবর্তনশীল ব্যবহার করে recompiles জোর চেষ্টা, এবং পরামিতি স্নিফিং প্রতিরোধ :
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
DECLARE @SessionGUIDbitch uniqueidentifier
SET @SessionGUIDbitch = @SessionGUID
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUIDbitch
ORDER BY CurrencyTypeOrder, Rank
আমি সংরক্ষণের WITH RECOMPILE
সংরক্ষিত পদ্ধতি সংজ্ঞায়িত করার চেষ্টা করেছি:
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier
WITH RECOMPILE
AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
যাতে এটি পরিকল্পনাটি ক্যাশে না হয়, এবং আমি সঞ্চালনে একটি পুনঃ কম্পাইল করার চেষ্টা করেছি:
EXECUTE ViewOpener @SessionGUID WITH RECOMPILE
যা সাহায্য করে না।
আমি গতিশীল এসকিউএল পদ্ধতি রূপান্তর চেষ্টা করেছি:
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier
WITH RECOMPILE AS
DECLARE @SQLString NVARCHAR(500)
SET @SQLString = N'SELECT *
FROM Report_OpenerTest
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank'
EXECUTE sp_executesql @SQLString,
N'@SessionGUID uniqueidentifier',
@SessionGUID
যা সাহায্য করে না।
সত্তা " Report_Opener
" একটি দৃশ্য, যা সূচী হয় না। দৃশ্য শুধুমাত্র অন্তর্নিহিত টেবিল রেফারেন্স। কোন টেবিল গণিত কলাম, সূচী বা অন্যথায় রয়েছে।
এটা জাহান্নাম জন্য আমি সঙ্গে ভিউ তৈরি করার চেষ্টা
SET ANSI_NULLS ON
SET QUOTED_IDENTIFER ON
যে এটা ঠিক না।
এটা যে কিভাবে
- প্রশ্ন দ্রুত
- প্রশ্নের একটি ক্যোয়ারী সরানো, এবং ভিউ থেকে নির্বাচন দ্রুত
- একটি সংরক্ষিত পদ্ধতি থেকে দৃশ্য থেকে নির্বাচন 40x ধীর হয়?
আমি দৃঢ়ভাবে সংরক্ষিত পদ্ধতিতে (3 ব্যবসায়িক নিয়ম লঙ্ঘন এবং একটি গুরুত্বপূর্ণ encapsulation ভাঙ্গা) দৃশ্যটির সংজ্ঞা সরানো চেষ্টা করে, এবং এটি শুধুমাত্র 6x ধীর গতির করে তোলে।
কেন সংরক্ষিত সংস্করণ সংস্করণ এত ধীর? এসকিউএল সার্ভারের জন্য একাউন্টে কি এসকিউএক্স এসকিউএল চলমান একটি ভিন্ন ধরনের বিজ্ঞাপন হ্যাক এসকিউএল এর চেয়ে দ্রুততর?
আমি সত্যিই বরং না
- কোড এসকিউএল এম্বেড করুন
সব কোড পরিবর্তন
Microsoft SQL Server 2000 - 8.00.2050 (Intel X86) Mar 7 2008 21:29:56 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
কিন্তু এসকিউএল সার্ভারের জন্য SQL সার্ভার হিসাবে যত দ্রুত চালাতে পারছেন না কেন অ্যাকাউন্টটি একটি প্রশ্ন চলছে, যদি প্যারামিটার স্নিফিং না হয়।
আমার পরবর্তী প্রচেষ্টাটি StoredProcedureA
কল StoredProcedureB
StoredProcedureC
কল StoredProcedureD
StoredProcedureC
কল কল StoredProcedureD
StoredProcedureC
ডাকা দেখতে হবে।
এবং এটি ব্যর্থ হচ্ছে, সংরক্ষিত পদ্ধতিটি একটি সংরক্ষিত পদ্ধতিতে কল করুন, ইউডিএফকে কল করুন, একটি ইউডিএফ কল করুন, একটি সংরক্ষিত পদ্ধতিতে কল করুন, ভিউ অনুসন্ধানের জন্য একটি UDF কল করুন।
যোগ করার জন্য, নিম্নলিখিত QA থেকে দ্রুত চালানো, কিন্তু একটি সংরক্ষিত পদ্ধতিতে রাখা যখন ধীর:
মূল:
--Runs fine outside of a stored procedure
SELECT *
FROM Report_OpenerTest
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
sp_executesql
:
--Runs fine outside of a stored procedure
DECLARE @SQLString NVARCHAR(500)
SET @SQLString = N'SELECT *
FROM Report_OpenerTest
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank'
EXECUTE sp_executesql @SQLString,
N'@SessionGUID uniqueidentifier',
@SessionGUID
EXEC(@sql)
:
--Runs fine outside of a stored procedure
DECLARE @sql NVARCHAR(500)
SET @sql = N'SELECT *
FROM Report_OpenerTest
WHERE SessionGUID = '''+CAST(@SessionGUID AS varchar(50))+'''
ORDER BY CurrencyTypeOrder, Rank'
EXEC(@sql)
এক্সিকিউশন পরিকল্পনা
ভাল পরিকল্পনা:
|--Sort(ORDER BY:([Expr1020] ASC, [Currencies].[Rank] ASC))
|--Compute Scalar(DEFINE:([Expr1020]=If ([Currencies].[CurrencyType]='ctCanadianCash') then 1 else If ([Currencies].[CurrencyType]='ctMiscellaneous') then 2 else If ([Currencies].[CurrencyType]='ctTokens') then 3 else If ([Currencies].[CurrencyType]
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Openers].[OpenerGUID]))
|--Filter(WHERE:((([Currencies].[IsActive]<>0 AND [Currencies].[OnOpener]<>0) AND ((((((([Currencies].[CurrencyType]='ctUSCoin' OR [Currencies].[CurrencyType]='ctMiscellaneousUS') OR [Currencies].[CurrencyType]='ctUSCash') OR [Currencies].
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Currencies].[CurrencyGUID], [Openers].[OpenerGUID]) WITH PREFETCH)
| |--Nested Loops(Left Outer Join)
| | |--Bookmark Lookup(BOOKMARK:([Bmk1016]), OBJECT:([GrobManagementSystemLive].[dbo].[Windows]))
| | | |--Nested Loops(Inner Join, OUTER REFERENCES:([Openers].[WindowGUID]))
| | | |--Bookmark Lookup(BOOKMARK:([Bmk1014]), OBJECT:([GrobManagementSystemLive].[dbo].[Openers]))
| | | | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_SessionGUID]), SEEK:([Openers].[SessionGUID]=[@SessionGUID]) ORDERED FORWARD)
| | | |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Windows].[IX_Windows]), SEEK:([Windows].[WindowGUID]=[Openers].[WindowGUID]) ORDERED FORWARD)
| | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType]))
| |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID] AND [OpenerDetails].[CurrencyGUID]=[Currenc
|--Hash Match(Cache, HASH:([Openers].[OpenerGUID]), RESIDUAL:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]))
|--Stream Aggregate(DEFINE:([Expr1006]=SUM(If (((([Currencies].[CurrencyType]='ctMiscellaneous' OR [Currencies].[CurrencyType]='ctTokens') OR [Currencies].[CurrencyType]='ctChips') OR [Currencies].[CurrencyType]='ctCanadianCoin') OR [
|--Nested Loops(Inner Join, OUTER REFERENCES:([OpenerDetails].[CurrencyGUID]) WITH PREFETCH)
|--Nested Loops(Inner Join)
| |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_OneOpenerPerSession]), SEEK:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD)
| |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD)
|--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[PK_Currencies_CurrencyGUID]), SEEK:([Currencies].[CurrencyGUID]=[OpenerDetails].[CurrencyGUID]) ORDERED FORWARD)
খারাপ পরিকল্পনা
|--Sort(ORDER BY:([Expr1020] ASC, [Currencies].[Rank] ASC))
|--Compute Scalar(DEFINE:([Expr1020]=If ([Currencies].[CurrencyType]='ctCanadianCash') then 1 else If ([Currencies].[CurrencyType]='ctMiscellaneous') then 2 else If ([Currencies].[CurrencyType]='ctTokens') then 3 else If ([Currencies].[Currency
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([Openers].[OpenerGUID]))
|--Filter(WHERE:((([Currencies].[IsActive]<>0 AND [Currencies].[OnOpener]<>0) AND ((((((([Currencies].[CurrencyType]='ctUSCoin' OR [Currencies].[CurrencyType]='ctMiscellaneousUS') OR [Currencies].[CurrencyType]='ctUSCash') OR [Currenc
| |--Nested Loops(Left Outer Join, OUTER REFERENCES:([Currencies].[CurrencyGUID], [Openers].[OpenerGUID]) WITH PREFETCH)
| |--Filter(WHERE:([Openers].[SessionGUID]=[@SessionGUID]))
| | |--Concatenation
| | |--Nested Loops(Left Outer Join)
| | | |--Table Spool
| | | | |--Hash Match(Inner Join, HASH:([Windows].[WindowGUID])=([Openers].[WindowGUID]), RESIDUAL:([Windows].[WindowGUID]=[Openers].[WindowGUID]))
| | | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Windows].[IX_Windows_CageGUID]))
| | | | |--Table Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Openers]))
| | | |--Table Spool
| | | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType]))
| | |--Compute Scalar(DEFINE:([Openers].[OpenerGUID]=NULL, [Openers].[SessionGUID]=NULL, [Windows].[UseChipDenominations]=NULL))
| | |--Nested Loops(Left Anti Semi Join)
| | |--Clustered Index Scan(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[IX_Currencies_CurrencyType]))
| | |--Row Count Spool
| | |--Table Spool
| |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID] AND [OpenerDetails].[CurrencyGUID]=[Cu
|--Hash Match(Cache, HASH:([Openers].[OpenerGUID]), RESIDUAL:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]))
|--Stream Aggregate(DEFINE:([Expr1006]=SUM([partialagg1034]), [Expr1007]=SUM([partialagg1035]), [Expr1008]=SUM([partialagg1036]), [Expr1009]=SUM([partialagg1037]), [Expr1010]=SUM([partialagg1038]), [Expr1011]=SUM([partialagg1039]
|--Nested Loops(Inner Join)
|--Stream Aggregate(DEFINE:([partialagg1034]=SUM(If (((([Currencies].[CurrencyType]='ctMiscellaneous' OR [Currencies].[CurrencyType]='ctTokens') OR [Currencies].[CurrencyType]='ctChips') OR [Currencies].[CurrencyType]='
| |--Nested Loops(Inner Join, OUTER REFERENCES:([OpenerDetails].[CurrencyGUID]) WITH PREFETCH)
| |--Clustered Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[OpenerDetails].[IX_OpenerDetails_OpenerGUIDCurrencyGUID]), SEEK:([OpenerDetails].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD)
| |--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Currencies].[PK_Currencies_CurrencyGUID]), SEEK:([Currencies].[CurrencyGUID]=[OpenerDetails].[CurrencyGUID]) ORDERED FORWARD)
|--Index Seek(OBJECT:([GrobManagementSystemLive].[dbo].[Openers].[IX_Openers_OneOpenerPerSession]), SEEK:([Openers].[OpenerGUID]=[Openers].[OpenerGUID]) ORDERED FORWARD)
খারাপ লোকটি 6 মিলিয়ন সারি কামড়ায়! অন্য এক নয়।
দ্রষ্টব্য: এটি একটি প্রশ্নের টিউন করার বিষয়ে একটি প্রশ্ন নয়। আমি একটি ক্যোয়ারী যে দ্রুত বাজ চালায়। আমি শুধু একটি সংরক্ষিত পদ্ধতি থেকে দ্রুত চালানোর জন্য SQL সার্ভার চান।
আপনার ডাটাবেসের জন্য এই কাজ। আমারও একই সমস্যা আছে - এটি একটি ডাটাবেসে ভাল কাজ করে কিন্তু যখন আমি এসএসআইএস আমদানি (স্বাভাবিক পুনঃস্থাপন না) ব্যবহার করে এই ডাটাবেসটি অনুলিপি করি, তখন এই সমস্যাটি আমার বেশিরভাগ সংরক্ষিত পদ্ধতিগুলির সাথে ঘটে। তাই কিছুটা গুগলিং করার পর, আমি পাইনাল ডেভের ব্লগটি খুঁজে পেয়েছিলাম (যা BTW, আমি তার বেশিরভাগ পোস্টের মুখোমুখি হয়েছি এবং আমাকে অনেক সাহায্য করেছে তাই ধন্যবাদ পিনাল ডেভ) ।
আমি আমার ডাটাবেসের উপর নিচের প্রশ্নটি চালাচ্ছি এবং এটি আমার সমস্যা সংশোধন করেছে:
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
GO
EXEC sp_updatestats
GO
আশাকরি এটা সাহায্য করবে. শুধু আমাকে সাহায্য যারা অন্যদের কাছ থেকে সাহায্য পাস।
আপনি Report_Opener টেবিলে পরিসংখ্যান এবং / অথবা সূচী পুনর্নির্মাণের চেষ্টা করেছেন। ডেটাবেস প্রথম ইনগুগারেটেড হওয়ার পরে থেকে স্ট্যাটাসগুলি এখনও ডেটা দেখায় তবে এসপিটির সমস্ত পুনরাবৃত্তি কোনও মূল্যের হবে না।
প্রাথমিক প্রশ্ন স্বয়ংক্রিয়ভাবে কাজ করে কারণ অপটিমাইজার দেখতে পারে যে প্যারামিটারটি কখনই নাল হবে না। এসপি ক্ষেত্রে অপ্টিমাইজার নিশ্চিত হতে পারে না যে প্যারামিটার কখনই নাল হবে।
আমি অন্য ধারণা পেয়েছেন। আপনি যদি এই টেবিল-ভিত্তিক ফাংশনটি তৈরি করেন তবে কী হবে?
CREATE FUNCTION tbfSelectFromView
(
-- Add the parameters for the function here
@SessionGUID UNIQUEIDENTIFIER
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
)
GO
এবং তারপরে নিম্নলিখিত বিবৃতিটি ব্যবহার করে এটিকে নির্বাচন করুন (এমনকি আপনার এসপিতেও এটি রাখুন):
SELECT *
FROM tbfSelectFromView(@SessionGUID)
এটি কী ঘটছে তা মনে হচ্ছে (যা প্রত্যেকের ইতিমধ্যে মন্তব্য করেছে) যে SQL সার্ভার কেবল কোনও ধারণা অনুমান করে যে এটি ভুল, এবং সম্ভবত এটি অনুমানটিকে সংশোধন করতে বাধ্য করবে। আমি অতিরিক্ত ধাপ যোগ করতে ঘৃণা করি, তবে আমি নিশ্চিত নই যে এটি আর কী হতে পারে।
আমি এই সমস্যা সম্মুখীন ছিল। আমার প্রশ্নের মত কিছু লাগছিল:
select a, b, c from sometable where date > '20140101'
আমার সংরক্ষিত পদ্ধতি যেমন সংজ্ঞা করা হয়েছে:
create procedure my_procedure (@dtFrom date)
as
select a, b, c from sometable where date > @dtFrom
আমি ডেটাটাইপ পরিবর্তন করে ডেটটাইম এবং ভয়েলা! 30 মিনিট থেকে 1 মিনিটে চলে গেল!
create procedure my_procedure (@dtFrom datetime)
as
select a, b, c from sometable where date > @dtFrom
আমি সমস্যাটি খুঁজে পেয়েছি, এখানে সংরক্ষিত পদ্ধতির ধীর এবং দ্রুত সংস্করণগুলির স্ক্রিপ্ট রয়েছে:
dbo.ViewOpener__RenamedForCruachan__Slow.PRC
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE dbo.ViewOpener_RenamedForCruachan_Slow
@SessionGUID uniqueidentifier
AS
SELECT *
FROM Report_Opener_RenamedForCruachan
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
dbo.ViewOpener__RenamedForCruachan__Fast.PRC
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE dbo.ViewOpener_RenamedForCruachan_Fast
@SessionGUID uniqueidentifier
AS
SELECT *
FROM Report_Opener_RenamedForCruachan
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
আপনি পার্থক্য স্পট না, আমি আপনাকে দোষারোপ না। পার্থক্য সব সময়ে সংরক্ষিত পদ্ধতিতে হয় না। যে পার্থক্যটি দ্রুততরভাবে 0.5 মিলিয়ন ক্যোয়ারী করে তা 6 মিলিয়ন সারির একটি উত্সাহী স্পুল করে:
ধীর: SET ANSI_NULLS OFF
দ্রুত: SET ANSI_NULLS ON
এই উত্তরটি বোঝার জন্যও তৈরি করা যেতে পারে, যেহেতু দর্শনে একটি যোগদানের ধারা রয়েছে যা বলে:
(table.column IS NOT NULL)
তাই কিছু NULL
জড়িত আছে।
ব্যাখ্যা আরও বিশ্লেষক ফিরে, এবং চলমান দ্বারা প্রমাণিত হয়
SET ANSI_NULLS OFF
।
DECLARE @SessionGUID uniqueidentifier
SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908'
।
SELECT *
FROM Report_Opener_RenamedForCruachan
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
এবং প্রশ্ন ধীর।
সুতরাং সমস্যাটি এমন নয় কারণ প্রশ্নটি একটি সংরক্ষিত পদ্ধতি থেকে চালানো হচ্ছে। সমস্যা হল এন্টারপ্রাইজ ম্যানেজারের সংযোগ ডিফল্ট বিকল্পটি ANSI_NULLS off
, ANSI_NULLS on
পরিবর্তে, যা QA এর ডিফল্ট।
মাইক্রোসফ্ট KB296769 এই সত্যটি স্বীকার করে (BUG: সংযুক্ত সার্ভার অবজেক্ট ধারণকারী সঞ্চিত পদ্ধতিগুলি তৈরি করতে এসকিউএল এন্টারপ্রাইজ ম্যানেজার ব্যবহার করতে পারবেন না)। ANSI_NULLS
সঞ্চিত পদ্ধতি ডায়ালগে ANSI_NULLS
বিকল্পটি অন্তর্ভুক্ত করে:
Set ANSI_NULLS ON
Go
Create Proc spXXXX as
....
এই সময় আপনি আপনার সমস্যা খুঁজে পেয়েছেন। পরবর্তী সময় যদি আপনি কম ভাগ্যবান হন এবং এটি খুঁজে বের করতে না পারেন তবে আপনি প্ল্যান জমা দেওয়ার জন্য এবং ভুল কার্যকর পরিকল্পনা সম্পর্কে উদ্বেগ বন্ধ করতে পারেন।
এটি silly শব্দ হতে পারে এবং SessionGUID নাম থেকে স্পষ্ট মনে হয়, কিন্তু কলাম Report_Opener একটি অনন্য সনাক্তকারী? যদি না হয়, তবে আপনি সঠিক টাইপে এটি কাস্ট করার চেষ্টা করতে পারেন এবং এটি একটি শট দিতে বা সঠিক রূপে আপনার পরিবর্তনশীল ঘোষণা করতে পারেন।
স্প্রোক অংশ হিসাবে তৈরি পরিকল্পনা unintuitively কাজ এবং একটি বড় টেবিলে একটি অভ্যন্তরীণ ঢাল করতে পারে।
এটি সম্ভবত অসম্ভাব্য, তবে আপনার পর্যবেক্ষিত আচরণ অস্বাভাবিক এটি চেক করা প্রয়োজন এবং দেওয়া হয়েছে অন্য কেউ এটি উল্লেখ করেনি।
আপনি কি নিশ্চিত যে সমস্ত বস্তুর মালিকানাধীন DBO মালিকানাধীন এবং আপনার নিজের মালিকানাধীন একটি দুর্বৃত্ত কপি বা পাশাপাশি উপস্থিত একটি ভিন্ন ব্যবহারকারী নেই?
শুধু মাঝে মাঝে আমি অদ্ভুত আচরণ দেখেছি কারণ এটি আসলে একটি বস্তুর দুটি কপি ছিল এবং আপনি যা পেয়েছেন সেটি নির্ভর করে যা নির্দিষ্ট করা হয়েছে এবং আপনি এটিকে লগ ইন করেছেন। উদাহরণস্বরূপ, একই নামের সাথে একটি দৃশ্য বা পদ্ধতির দুটি কপি থাকা সম্পূর্ণরূপে সম্ভব, তবে বিভিন্ন মালিকানাধীন মালিকানাধীন - এমন একটি পরিস্থিতি যা আপনি ডাব হিসাবে ডাটাবেসে লগ ইন না হয়ে উঠতে পারেন এবং বস্তুর মালিক হিসাবে ডাবিকে নির্দিষ্ট করতে ভুলবেন না আপনি বস্তু তৈরি করুন।
উল্লেখ্য যে টেক্সটটিতে আপনি মালিককে নির্দিষ্ট না করে কিছু জিনিস চলছেন, উদাহরণস্বরূপ
sp_recompile ViewOpener
উদাহরণস্বরূপ যদি সেখানে ভিউ-ওপেনার দুটি কপি ডিবি এবং [অন্য কোন ব্যবহারকারী] দ্বারা মালিকানাধীন থাকে তখন আপনি কোনটি উল্লেখ না করলে আপনি আসলে কোনও কম্প্যাক্ট করেন তা পরিস্থিতির উপর নির্ভরশীল। Report_Opener ভিউ দিয়ে ডেট করুন - যদি দুটি কপি থাকে (এবং তারা স্পেসিফিকেশন বা এক্সিকিউশন প্ল্যানের মধ্যে পার্থক্য করতে পারে) তবে কী ব্যবহার করা হয় সেগুলির উপর নির্ভর করে - এবং আপনি মালিককে নির্দিষ্ট না করলে এটি সম্পূর্ণরূপে সম্ভব যে আপনার অ্যাডহক প্রশ্নটি এক এবং সংকলিত পদ্ধতি অন্য ব্যবহার করতে পারে।
আমি বলি, এটি সম্ভবত অসম্ভাব্য কিন্তু এটি সম্ভব এবং এটি চেক করা উচিত কারণ আপনার সমস্যাগুলি হতে পারে যে আপনি কেবল ভুল জায়গায় বাগ খুঁজছেন।