لماذا بعض الاستعلام SQL أبطأ بكثير عند استخدامها مع SqlCommand؟

StackOverflow https://stackoverflow.com/questions/801909

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي الإجراء المخزن الذي ينفذ أسرع بكثير من SQL Server إدارة Studio (2 ثانية) من عند تشغيله مع System.Data.SqlClient.SqlCommand (مرات من بعد 2 دقيقة).

وماذا يمكن أن يكون السبب في ذلك؟


والصفات: في SQL Server إدارة Studio هذا يعمل في 2 ثانية (على قاعدة بيانات الإنتاج):

EXEC sp_Stat
    @DepartmentID = NULL

في. NET / C # الأوقات التالية من بعد 2 دقيقة (على قاعدة بيانات الإنتاج):

string selectCommand = @"
EXEC sp_Stat
    @DepartmentID = NULL";
string connectionString = "server=***;database=***;user id=***;pwd=***";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    using (SqlCommand command = new SqlCommand(selectCommand, connection))
    {
        connection.Open();
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
            }
        }
    }
}

وحاولت أيضا مع selectCommand = "sp_Stat"، CommandType = StoredProcedure، وSqlParameter، لكنه على نفس النتيجة.

ودون EXEC انها نفس النتيجة أيضا.

في قاعدة بيانات تطوير ما يقرب من بيانات فارغة كلتا الحالتين تنتهي في أقل من 1 ثانية. حتى انها تتعلق بأن هناك الكثير من البيانات في قاعدة البيانات، ولكن يبدو أن يحدث فقط من صافي ...


وماذا كتب مارك Gravell عن القيم SET مختلفة يجعل الفرق في الحالة المعروضة.

أظهر

وSQL Server منشئ ملفات التعريف أن SQL Server إدارة Studio يدير التالية SET أن مزود. NET SQL بيانات العميل لا:


SET ROWCOUNT 0 
SET TEXTSIZE 2147483647 
SET NOCOUNT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ARITHABORT ON 
SET LOCK_TIMEOUT -1 
SET QUERY_GOVERNOR_COST_LIMIT 0 
SET DEADLOCK_PRIORITY NORMAL 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
SET ANSI_NULLS ON 
SET ANSI_NULL_DFLT_ON ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
SET CURSOR_CLOSE_ON_COMMIT OFF 
SET IMPLICIT_TRANSACTIONS OFF 
SET QUOTED_IDENTIFIER ON
SET NOEXEC, PARSEONLY, FMTONLY OFF

عند I تضمين هذه، أخذ نفس الاستعلام على نفس القدر من الوقت في SSMS و.NET. وSET المسؤول هو ...

SET ARITHABORT ON

ما قد علمت؟ ربما لاستخدام التعريف بدلا من التخمين ...

و(الحل في البداية بدا أن لهما صلة المعلمة استنشاق، ولكن كنت قد خلط بعض الامور ...)

هل كانت مفيدة؟

المحلول

وشيء آخر يمكن أن يكون مهما هو href="http://msdn.microsoft.com/en-us/library/ms190356.aspx" الخيارات SET التي هي تمكين. بعض من هذه الخيارات تغيير خطة الاستعلام بما فيه الكفاية لتغيير الوضع. بعض يمكن أن يكون لها تأثير كبير إذا كنت تبحث في (على سبيل المثال) و+ تحسب استمر (وربما مفهرسة) العمود: إذا الخيارات SET غير متوافقة، فإنه يمكن أن تضطر إلى إعادة حساب القيم، بدلا من استخدام قيمة المفهرسة - التي يمكن أن تغير مؤشر تسعى إلى مسح الطاولة + حساب

وحاول استخدام التعريف لمعرفة ما SET الخيارات مطروحة "في مسرحية"، ومعرفة ما إذا كان استخدام هذه الخيارات يتغير شيء.

وتأثير آخر هو سلسلة الاتصال. على سبيل المثال، إذا قمت بتمكين MARS التي يمكن أن تغير السلوك بطرق خفية.

وأخيرا، والمعاملات (الضمني (TransactionScope) أو صريحة) يمكن أن يكون لها <م> ضخمة تأثير، وهذا يتوقف على مستوى العزل.

نصائح أخرى

وهذا يكاد يكون من المؤكد بسبب خطة "غير صحيحة" مؤقتا الاستعلام. جاء هذا الأمر على SO تماما عدة مرات.

هل لديك إحصاءات يصل إلى التاريخ؟ A العادية المقررة خطة الصيانة الفهرس؟

ويمكنك اختبار إذا هو بالتأكيد نتيجة لخطة الاستعلام مؤقتا بإضافة هذا الى حسابك تعريف الإجراء المخزن:

CREATE PROCEDURE usp_MyProcedure WITH RECOMPILE...

وهذا من شأنه إعادة فهرسة قاعدة بيانات كاملة (الحذر إذا قاعدة بيانات كبيرة جدا!):

exec sp_msforeachtable "dbcc dbreindex('?')"

وSO المشاركات:

الفارق الكبير في وقت تنفيذ بروك المخزنة بين الأدارة ستوديو وTableAdapter.

معلمة الشم (أو انتحال) في SQL Server

تحسين للالمجهول ل SQL Server 2005؟

تنفيذ خطة مختلفة لنفس الإجراءات المخزنة

وكان مشكلة مشابهة واتضح وجود MultipleActiveResultSets = صحيح في سلسلة الاتصال (الذي من المفترض أن يكون لها تأثير ضئيل) تبذل سحب السجلات 1.5mil على اتصال بعيد تأخذ 25 دقائق بدلا من حوالي 2 دقيقة.

وكان لدينا قضية مماثلة، حيث استعلام سيكمل في 2 ثانية في SSMS ويستغرق أكثر من 90 ثانية عند استدعائه من عميل .NET (كتبنا عدة VB / C # تطبيقات / مواقع لاختباره.)

ونحن يشتبه في أن خطة الاستعلام سيكون مختلفا، وأعاد كتابة الاستعلام مع صريحة حلقات ( "حلقة داخلية الانضمام" و "مع مؤشر") تلميحات. هذا حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top