একটি কোয়েরি দ্রুত চলে:
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
এবং আবার ফিরে, সত্যিই এটি পুনরায় সংশোধন করার কৌশল।
আমি নতুন পরিকল্পনা উত্পন্ন করার জন্য সঞ্চিত পদ্ধতিটিকে বাদ দিয়ে পুনরায় তৈরি করেছি।
আমি একটি ডিকয় ভেরিয়েবল ব্যবহার করে পুনরায় কম্পাইল করার জন্য জোর করে চেষ্টা করেছি এবং পরামিতিগুলি স্নিফিং প্রতিরোধ করেছি :
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
এটি ঠিক করে নি।
এটা কেমন আছে
- কোয়েরিটি দ্রুত is
- ক্যোয়ারিকে একটি দৃশ্যে সরিয়ে নিয়ে যাওয়া এবং ভিউ থেকে নির্বাচন করা দ্রুত
- সঞ্চিত পদ্ধতি থেকে ভিউ থেকে নির্বাচন করা 40x ধীর?
আমি দৃশ্যের সংজ্ঞাটি সরাসরি সঞ্চিত পদ্ধতিতে সরানোর চেষ্টা করেছি (3 টি ব্যবসায়িক বিধি লঙ্ঘন, এবং একটি গুরুত্বপূর্ণ এনক্যাপসুলেশন ভেঙে), এবং এটি কেবল প্রায় 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)
তবে কী কী জন্য এসকিউএল সার্ভার এসকিউএল সেভারের তত দ্রুত সঞ্চালন করতে অক্ষম হওয়ায় কী কী প্যারামিতি স্নিফিং হয় না।
আমার পরবর্তী প্রচেষ্টা অবশিষ্ট থাকবে হবে StoredProcedureA
কল StoredProcedureB
কল StoredProcedureC
কল StoredProcedureD
দৃশ্য ক্যোয়ারীতে।
এবং এটি ব্যর্থ হ'ল, সঞ্চিত পদ্ধতিতে কোনও সঞ্চিত পদ্ধতি কল করুন, একটি ইউডিএফ কল করুন, একটি ইউডিএফ কল করুন, একটি সঞ্চিত প্রক্রিয়া কল করুন, ভিউটিকে জিজ্ঞাসা করার জন্য কোনও ইউডিএফ কল করুন।
সংক্ষিপ্তসার হিসাবে, নিম্নলিখিত 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 মিলিয়ন সারিগুলিকে স্পুলিং করছে; অন্যটি না।
দ্রষ্টব্য: এটি কোনও ক্যোয়ারী টিউন করার বিষয়ে প্রশ্ন নয়। আমার কাছে একটি ক্যোয়ারী রয়েছে যা বজ্রপাত দ্রুত চালায়। আমি কেবল এসকিউএল সার্ভারটি একটি সঞ্চিত পদ্ধতি থেকে দ্রুত চালিত করতে চাই।