তবুও ভুল ব্যবহারকারীর নাম ব্যবহার করে সঞ্চিত প্রক্রিয়াটি sp_ দিয়ে শুরু করবেন?


33

আমার এক সহকর্মী আমাদের এসকিউএল সার্ভার ২০০৮ আর 2 ডাটাবেসে একটি সঞ্চিত প্রক্রিয়াটির নাম দিয়েছেন sp_something। আমি যখন এটি দেখলাম তখনই আমি ততক্ষণে ভেবেছিলাম: "এটাই ভুল!" এবং এই অনলাইন নিবন্ধটির জন্য আমার বুকমার্কগুলি অনুসন্ধান করা শুরু করেছে যা এটি ভুল কেন তা ব্যাখ্যা করে, তাই আমি আমার সহকর্মীকে একটি ব্যাখ্যা সরবরাহ করতে পারি।

নিবন্ধে ( ব্রায়ান মোরান দ্বারা ) এটি ব্যাখ্যা করা হয়েছে যে সঞ্চিত পদ্ধতিটি একটি sp_ উপসর্গ প্রদানের ফলে এসকিউএল সার্ভার একটি সংকলিত পরিকল্পনার জন্য মাস্টার ডাটাবেসের দিকে নজর দেয়। যেহেতু sp_sprocসেখানে বসবাস করে না, এসকিউএল সার্ভার প্রক্রিয়াটি পুনরায় সংকলন করবে (এবং এটির জন্য একচেটিয়া সংকলন লক প্রয়োজন, কর্মক্ষমতা সমস্যা তৈরি করে)।

নিম্নলিখিত পদ্ধতির দুটি পদ্ধতির মধ্যে পার্থক্য দেখানোর জন্য নিবন্ধে দেওয়া হয়েছে:

USE tempdb;
GO

CREATE PROCEDURE dbo.Select1 AS SELECT 1;
GO

CREATE PROCEDURE dbo.sp_Select1 AS SELECT 1;
GO

EXEC dbo.sp_Select1;
GO

EXEC dbo.Select1;
GO

আপনি এটি চালান, তারপরে প্রোফাইলারটি খুলুন (সঞ্চিত পদ্ধতি -> SP:CacheMissইভেন্ট যুক্ত করুন) এবং সঞ্চিত পদ্ধতিগুলি আবার চালান। আপনি দুটি সঞ্চিত পদ্ধতির মধ্যে পার্থক্যটি দেখেছেন বলে মনে করা হচ্ছে: sp_Select1সঞ্চিত পদ্ধতিটি সঞ্চিত পদ্ধতিটির SP:CacheMissচেয়ে আরও একটি ইভেন্ট তৈরি করবে Select1(নিবন্ধটি এসকিউএল সার্ভার 7.0 এবং এসকিউএল সার্ভার 2000 উল্লেখ করেছে ।)

আমি যখন আমার এসকিউএল সার্ভার ২০০৮ আর 2 এনভায়রনমেন্টে উদাহরণটি চালাই তখন আমি SP:CacheMissউভয় পদ্ধতির জন্য একই পরিমাণের ইভেন্ট পাই (টেম্পডিবি এবং অন্য পরীক্ষার ডাটাবেসে উভয়ই)।

তাই আমি ভাবছি:

  • উদাহরণটি কার্যকর করার জন্য আমি কি কিছু ভুল করতে পারি?
  • sproc sp_somethingএসকিউএল সার্ভারের নতুন সংস্করণগুলিতে এখনও কি ' ব্যবহারকারীর নাম রাখবেন না ' অ্যাডাগিয়ামটি বৈধ?
  • যদি তা হয় তবে এসকিউএল সার্ভার ২০০৮ আর 2 এর কোনও কার্যকর উদাহরণ রয়েছে যা?

এই সম্পর্কে আপনার চিন্তার জন্য অনেক ধন্যবাদ!

সম্পাদনা

আমি এসকিউএল সার্ভার ২০০৮ আর 2 এর জন্য এমএসডিএন-তে সঞ্চিত প্রক্রিয়াগুলি (ডাটাবেস ইঞ্জিন) পেয়েছি, যা আমার দ্বিতীয় প্রশ্নের উত্তর দেয়:

আমরা আপনাকে সুপারস হিসাবে sp_ ব্যবহার করে কোনও সঞ্চিত পদ্ধতি তৈরি না করার পরামর্শ দিচ্ছি। এসকিউএল সার্ভার সিস্টেম সঞ্চিত পদ্ধতি নির্ধারণ করতে sp_ উপসর্গ ব্যবহার করে। আপনার চয়ন করা নামটি ভবিষ্যতের কিছু সিস্টেম পদ্ধতির সাথে বিরোধী হতে পারে। [...]

উপসর্গটি ব্যবহার করে যে কারণে পারফরম্যান্স সমস্যা রয়েছে সে সম্পর্কে কিছুই উল্লেখ করা হয়নি sp_। আমি এখনও জানতে চাই যদি তা এখনও কেস হয় বা তারা এসকিউএল সার্ভার 2000 এর পরে এটি ঠিক করে দেয়।


3
আমি এটি আগে দেখেছি এবং একটি নগণ্য পারফরম্যান্স পার্থক্য পেয়েছি যা আমি sp_সংস্করণগুলি সমাধান করার জন্য কিছুটা বড় ওভারহেডে রেখেছিলাম (মাস্টার এবং ব্যবহারকারীর উভয় ডাটাবেসের মধ্যে এটি পরীক্ষা করা প্রয়োজন কারণ এটি masterব্যবহারকারী ডিবিতে -> প্রক্সগুলিতে সিস্টেম প্রোকে প্রাধান্য দেয়) - নন সিস্টেম প্রোকস ইন master)
মার্টিন স্মিথ

4
সঞ্চিত পদ্ধতির উপসর্গের জন্য আপনি কী সুবিধা দেখছেন sp_? এটি একটি সারণীর উপসর্গ হিসাবে প্রায় দরকারী tbl। আপনাকে কেন এই অর্থহীন নামকরণ কনভেনশনটি ব্যবহারের অনুমতি দেওয়ার জন্য প্রথমে সিস্টেম সন্ধান মাস্টারকে (যদিও তা তুচ্ছ বা না পারফরম্যান্সের কোনও পার্থক্য নয়)?
অ্যারন বারট্র্যান্ড

1
@AaronBertrand: সৎ হতে, আমি কোন সুবিধা দেখতে এ সব sp_, শুধুমাত্র অসুবিধেও সঙ্গে sprocs prefixing, এবং আমি তাদের এই ভাবে নিজেকে পূর্বে ভী না। তবে আমি আমার সহকর্মীদের বোঝাতে যে সমস্ত যুক্তি পেতে পারি তা না করার জন্য চাই।

1
হ্যাঁ, টিবিএল অকেজো, তবে আমি এখনও এটি ব্যবহার করতে পছন্দ করি। অবশ্যই আমার ওসিডি লাথি মারতে হবে Now এখন আমার লনটি খুলে ফেল।
এসকিউএলরকস্টার

1
@ জোসিয়েন এছাড়াও, আপনার সহকর্মীদের নামকরণের প্রকল্পটি আরও জটিল করার পক্ষে যুক্তি দিয়ে আসা উচিত । কেন তাদের dbo.sp_Author_Renameচেয়ে ভাল তা বোঝাতে তাদের পান dbo.Author_Rename। আমি বুঝতে পারি না এমন একটি জিনিস যা বোধগম্য হয়।
অ্যারন বারট্র্যান্ড

উত্তর:


31

এটি নিজেকে পরীক্ষা করা মোটামুটি সহজ। আসুন দুটি খুব সহজ পদ্ধতি তৈরি করুন:

CREATE PROCEDURE dbo.sp_mystuff
AS
  SELECT 'x';
GO
CREATE PROCEDURE dbo.mystuff
AS
  SELECT 'x';
GO

এখন আসুন এমন একটি মোড়ক তৈরি করুন যা তাদের স্কিমা উপসর্গ সহ এবং ব্যতীত কয়েকবার কার্যকর করে:

CREATE PROCEDURE dbo.wrapper_sp1
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @i INT = 1;
    WHILE @i <= 1000
    BEGIN
      EXEC sp_mystuff;
      SET @i += 1;
    END
END
GO
CREATE PROCEDURE dbo.wrapper_1
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @i INT = 1;
    WHILE @i <= 1000
    BEGIN
      EXEC mystuff;
      SET @i += 1;
    END
END
GO
CREATE PROCEDURE dbo.wrapper_sp2
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @i INT = 1;
    WHILE @i <= 1000
    BEGIN
      EXEC dbo.sp_mystuff;
      SET @i += 1;
    END
END
GO
CREATE PROCEDURE dbo.wrapper_2
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @i INT = 1;
    WHILE @i <= 1000
    BEGIN
      EXEC dbo.mystuff;
      SET @i += 1;
    END
END
GO

ফলাফল:

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

উপসংহার:

  • sp_ উপসর্গ ব্যবহার ধীর
  • স্কিমা উপসর্গটি ছেড়ে দেওয়া ধীর

আরও গুরুত্বপূর্ণ প্রশ্ন: আপনি কেন sp_ উপসর্গটি ব্যবহার করতে চান ? আপনার সহকর্মীরা এটি করে কী লাভ করার প্রত্যাশা করে ? এটি আপনার চেয়ে খারাপ এটি প্রমাণ করার বিষয়ে এটি হওয়া উচিত নয়, এটি সিস্টেমের প্রতিটি সঞ্চিত পদ্ধতিতে একই তিন-বর্ণের উপসর্গ যুক্ত করার ন্যায্যতা সম্পর্কে তাদের হওয়া উচিত। আমি সুবিধা দেখতে ব্যর্থ।

এছাড়াও আমি নীচের ব্লগ পোস্টে এই ধরণের কিছু চমত্কার প্রশস্ত পরীক্ষা করেছি:

http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix


দ্রষ্টব্য, এই ফলাফলগুলি এসকিউএল সার্ভার ২০১২-এ রয়েছে But তবে আপনি আপনার পরিবেশে একই পরীক্ষা করতে পারেন।
অ্যারন বার্ট্র্যান্ড

1
"আপনার সহ-কাজগুলি এটি করে কী লাভ করার প্রত্যাশা করে" এছাড়াও হাঙ্গেরীয় নোটেশনও দেখুন । মূলত, এটি বেশিরভাগ অংশের জন্য 90 এর দশকের জিনিস। এছাড়াও, আমার অতীতের কাজটিতে স্ট্যান্ডার্ডটি ছিল প্রতিটি সঞ্চিত প্রক্রিয়াটির সাথে উপস্থাপন করা sp_যাতে তারা অন্যান্য জিনিস থেকে আলাদা হতে পারে এবং নামটির কোনও বিরোধ নেই ... আমার এই ধারণাগুলির সমস্যাটি উপস্থিত থাকার কোনও ধারণা ছিল না।
আর্লজ

দুর্দান্ত উদাহরণ, ধন্যবাদ হারুন। আমি এখনও ২০০৮ আর ২-তে এটি পরীক্ষা করে দেখছি (এবং সম্ভবত এটি ভুল উপায়ে পরীক্ষা করছি, কারণ 'dbo.wrapper_sp1' এবং 'dbo.wrapper_sp2' এখন অন্য দুটি তুলনায় দ্রুত গতিতে দেখা যাচ্ছে)।

12

আমরা আপনাকে সুপারস হিসাবে sp_ ব্যবহার করে কোনও সঞ্চিত পদ্ধতি তৈরি না করার পরামর্শ দিচ্ছি। এসকিউএল সার্ভার সিস্টেম সঞ্চিত পদ্ধতি নির্ধারণ করতে sp_ উপসর্গ ব্যবহার করে। আপনার চয়ন করা নামটি ভবিষ্যতের কিছু সিস্টেম পদ্ধতির সাথে বিরোধী হতে পারে। [...]

যদিও sp_ উপসর্গটি ব্যবহার করে পারফরম্যান্স সমস্যা সম্পর্কে কিছুই উল্লেখ করা হয়নি। আমি এখনও জানতে চাই যে এটি এখনও যদি কেস হয় বা তারা এসকিউএল সার্ভার 2000 এর পরে এটি স্থির করে।

মার্টিন স্মিথের সাধারণ মন্তব্যটি যেমন দেখায় - হ্যাঁ, আপনার যদি sp_উপসর্গের সাথে একটি সঞ্চিত প্রক্রিয়া থাকে - এসকিউএল সার্ভার কোয়েরি এক্সিকিউটিউটর সর্বদাmaster প্রথমে ডাটাবেসে চেক করে দেখবেন যে এই নামের দ্বারা কোনও সঞ্চিত পদ্ধতি (কোনও সিস্টেম সঞ্চিত পদ্ধতি হিসাবে চিহ্নিত) রয়েছে কিনা তা দেখতে।

এবং যদি এটি বিদ্যমান থাকে, masterডাটাবেস থেকে সেই সিস্টেমের সঞ্চিত পদ্ধতি সর্বদা বিরাজ করে এবং আপনার নিজের পরিবর্তে কার্যকর করা হবে।

তাই হ্যাঁ - এটি এখনও ঘোরা: ব্যবহার করবেন নাsp_ প্রিফিক্স।


5
সহজ পরীক্ষা। CREATE PROC dbo.sp_helptext AS SELECT 1তারপরে চেষ্টা করুনEXEC dbo.sp_helptext
মার্টিন স্মিথ

আপনার উত্তরের জন্য ধন্যবাদ, masterএসপি এর বিস্তারে খুব দরকারী সংযোজন ।

2

একটি ভাল পরীক্ষা হ'ল একটি ক্যোয়ারী লেখার জন্য যাতে সম্পূর্ণ অপ্টিমাইজেশান প্রয়োজন যা সম্ভবত আপনি যে প্র্যাকটি লিখছেন তা আরও ভাল প্রতিফলন। আমি নীচের প্রশ্নটি একটি এসপিতে গুটিয়ে রেখেছি এবং আপনার পরীক্ষার পুনরাবৃত্তি করেছি এবং একই ফলাফল পেয়েছি।

select * from Person.BusinessEntity b
inner join Person.BusinessEntityAddress ba on b.BusinessEntityID = ba.BusinessEntityID
inner join Person.Address a on ba.AddressID = a.AddressID

আমি উভয় ক্ষেত্রে একই সংখ্যক ক্যাশে মিস এবং হিট ইভেন্ট পেয়েছি এবং উভয় ক্ষেত্রেই পরিকল্পনাটি ক্যাশে যুক্ত হয়েছে। আমি উভয় প্রসকেও বেশ কয়েকবার চালিয়েছি এবং সিপিইউ সময় বা dm_exec_query_stats এর দ্বারা বর্ধিত সময়ের মধ্যে কোনও সামঞ্জস্যপূর্ণ পার্থক্য ছিল না।

অন্য উদ্বেগটি হ'ল যেহেতু "sp_" প্রোকগুলি মাস্টারের কাছ থেকে কার্যকর করা যেতে পারে যে আপনি যে ডিবিতে কাজ করছেন তার পরিবর্তে মাস্টারে চালিত প্রোকটির একটি অনুলিপি পেতে পারেন তবে একটি দ্রুত পরীক্ষা দেখায় যে এটি ঘটেনি। যাইহোক, যদি আপনি যে ডিবিতে কাজ করছেন তার থেকে যদি প্রোকটি বাদ পড়ে এবং একটি অনুলিপি মাস্টারে উপস্থিত থাকে তবে এটি কার্যকর করা হবে যা এটি কোনও পুরানো সংস্করণ হলে সমস্যা হতে পারে। এটি যদি উদ্বেগের বিষয় হয় তবে আমি প্রোকে নামকরণ করতে "sp_" ব্যবহার করব না।


আকর্ষণীয় সন্ধান, ধন্যবাদ! আমি আপনার উদাহরণটি হারুনের উদাহরণের সাথে আরও কিছু পরীক্ষা চালানোর জন্য ব্যবহার করব ।

1

আমি বিশ্বাস করি যখন আপনি সম্পূর্ণরূপে যোগ্য অবজেক্টের নাম নির্দিষ্ট না করেন তবে বিষয়টি করতে হবে। সুতরাং, "এক্সইসিএসপি_সোমিংথিং" প্রথমে মাস্টার চেক করবে, তবে "এক্সইসিবি dbname.dbo.sp_something" কখনই মাস্টার যেতে পারবে না।

পাঠটি, যদি আমি মনে করি, হ'ল সর্বদা পুরোপুরি যোগ্যতাসম্পন্ন নামটি ব্যবহার করা।


5
মনে হয় না যে এটি কোনও পার্থক্য করে। ব্যবহারকারীর ডাটাবেসে একটি থাকলেও EXEC MyDB.dbo.sp_helptext 'sp_helptext'এখনও masterএটি ব্যবহার করে। এটি উভয় অবস্থান যাচাই করে এবং masterএটি উপস্থিত থাকলে এবং সিস্টেম আইটেম হিসাবে চিহ্নিত হলে এটি ব্যবহার করবে AF
মার্টিন স্মিথ

1
@ মার্টিনস্মিথ ২০১২-তে আমি মাস্টার সংস্করণটি কার্যকর করতে বাধ্য করতে পারি না (যদিও সেখানে আমার পরীক্ষাগুলি দেখিয়েছিল যে কিছু চলছে কিনা ), যদি না আমি স্থানীয় অনুলিপি (যে ক্ষেত্রে MyDB.dbo.sp_fooএখনও মাস্টার সংস্করণ কার্যকর করা হয়) বাদ না দেয় । এই আচরণটি কোথায় পরিবর্তিত হয়েছে তা নিশ্চিত করার জন্য আমার কাছে এখনই 2008/2008 আর 2 নেই।
অ্যারন বারট্র্যান্ড

@ অ্যারনবার্ট্রান্ড - আহ, আকর্ষণীয় আমি ২০০৮ আর ২-এ আমার পরীক্ষা দিয়েছিলাম।
মার্টিন স্মিথ

এছাড়াও মনে রাখবেন যদি একটি স্থানীয় পদ্ধতি খুঁজে পাওয়া যায় নি এবং এক কর্তা পাওয়া যায়, আধুনিক মৃত্যুদন্ড কার্যকর করা হবে, এবং না না হিসাবে এই জন্য একটি সিস্টেম বস্তুর ঘটতে হিসাবে চিহ্নিত করা প্রয়োজন। এবং কমপক্ষে ২০১২ সালে, মাস্টার কপিটি সিস্টেম অবজেক্ট হিসাবে চিহ্নিত হয়েছে বা না, আচরণ পরিবর্তন করে না - স্থানীয় ডিবি / স্কিমা উপসর্গ সহ বা না করে, স্থানীয় অনুলিপিটি উপস্থিত না থাকলে সর্বদা কার্যকর করা হয়।
অ্যারন বারট্র্যান্ড

1
ওফস, আমার স্পষ্ট করা উচিত ছিল যে আমার মন্তব্যটি প্রস্তাবিত উত্তরের দিকে লক্ষ্য রেখেছিল। এসকিউএলরকস্টারের মন্তব্য "EXEC dbname.dbo.sp_somecing কখনই প্রথমে মাস্টার যাবে না।" ভুল.
গ্রীনস্টোন ওয়াকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.