PDA

View Full Version : سوال: سرعت sql زیاد می شه



khadem1386
یک شنبه 26 آبان 1387, 01:02 صبح
سلام دوستان

من قبلا با acces کار می کردم ولی حالا دارم با MS SQl کار می کنم
خوب البته دلایل بسیار زیاردی وجود داره که از سیستم های قوی تری مثل MS sql استفاده بشه.

ولی من جواب برعکس گرفتم نمی دونم چرا انقدر سرعت MS SQL در سرور من پایین است.
(منظورم سرور اصلی که در هاستی که خریدم )

مثلا می خوام چهل پنجاه هزار تا رکورد را پاک کنم یا بخوانم یا پر کنم کلی وقت می گیره آخرشم نصفه کاره انجام می ده و error مربوط به script time out می ده یعنی خیلی طور می کشه

من نمونه کُدم را اینجا می گذارم می خوام اگر ممکنه یک راهنمایی بکنید که احتمالا کجای کار خراب است.

وقتی با access این برنامه را می نویسم خوب کار می کنه و سریع عمل می کنه و همه رکورد ها را سریع ردیف می کنه تا پایین. ولی وقتی با sql می شه سرعتش خیلی کم است. و تازه بعد از کلی گذشت زمان عکس العمل نشان می دهد.

به عنوان مثال این برنامه مثلا می خواد تمام رکورد ها را پاک کنه :

table شامل دوتا فیلد (nchar(2), smallINT )و چهل دوهزار رکورد است.



<%
Server.ScriptTimeout=200
%>
<%
strSQLServerName = "xxxxx.xxxxxxx.com"
strSQLDBUserName = "xxxxxxx_xxxxx"
strSQLDBPassword = "xxxxxxxxx"
strSQLDBName = "xxxxxxx_xxxxx"

'MS SQL Server OLE Driver
strCon = "Provider=SQLOLEDB;Server=" & strSQLServerName & ";User ID=" &
strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" &
strSQLDBName & ";"


Set sqlCon = Server.CreateObject("ADODB.Connection")
sqlCon.connectionstring = strCon
sqlCon.Open
set REstateZipcode = Server.CreateObject("ADODB.Recordset")
REstateZipcode.Open "Select * from zipcode order by state" , sqlCon ,3,3
REstateZipcode.MoveFirst

while Not REstateZipcode.EOF

%>

<% = REstateZipcode("State") %>____
<% = REstateZipcode("Zipcode") %> <BR>

<%
REstateZipcode.delete
REstateZipcode.MoveNext
wend

REstateZipcode.close
sqlCon.close

%>

برای توضیح بگم که این table را بوسیله SQL Server Management Studio Express و بصورت remote ساختم
همه تنظیمات هم بصورت پیش فرض بود.

با تشکر از همه دوستان

AminSobati
یک شنبه 26 آبان 1387, 01:43 صبح
دوست عزیزم شما دارین با SQL Server کار میکنین! پس دیگه روشهای اینچنینی رو کنار بزارین! یک دستور Delete با شرط مناسب بنویسید که عمل حذف رو انجام بده

khadem1386
یک شنبه 26 آبان 1387, 08:23 صبح
سلام و تشکر از پاسخ شما
آیا شما میگید که این دستورREstateZipcode.delete باعث هنگ کردن یا کند تر شدن شده.
یا اینکه اصولا این روش را نمی پسندید. ولی به سرعت کاری نداره


مظور شما اینکه این دستور سرعتش بیشتره؟



Delete from tab1
یعنی این سیستمش با او دستوری که در بالا نوشتم فرق می کنه؟ و سریعتره؟

به من گفتند فقط کانکشن آن فرق می کنه که باید نام سرور و پسورد بدهی بجای آدرس فایل access , و بقیه اش همانطور است.
من اعتقاد دارم اگر یک جایی SQL سرعتش از access کمتر شد یعنی یک اشتباهی وجود داره وگرنه SQL همیشه باید سریع عمل کنه.

باز هم از پاسخی که دادید ممنونم

khadem1386
یک شنبه 26 آبان 1387, 08:34 صبح
ولی ورود اطلاعات که دیگه فرقی نمی کنه اول باید از rs.AddNew استفاده کنیم. در پایان نیز باید rs.update کنیم
خوب این هم سرعتش خیلی کمتر بود
شاید توی تنظیمات sql باید دست ببرم؟
شاید هم نمی دانم. . . .
چگونه می توان سرعت یا کیفیت سرور دیتا بیس را بررسی کرد که مثلا این سروری که ما از آن هاست خریدم کردیم چقدر توان داره؟

با تشکر

linux
یک شنبه 26 آبان 1387, 08:34 صبح
سلام دوستان

من قبلا با acces کار می کردم ولی حالا دارم به MS SQl کار می کنم
.....

شما همین روشی که استفاده می کنید هم در access هم اشتباه هست.
کلا دستورات sql به چند دسته تقسیم میشه
دستوراتی مانند insert و update و Delete و Select برای گرفتن اطلاعات یا دستکاری آنها این دستورات با اکسس هم قابل اجرا هست.
شما با این کارتان اول کل رکورد ها را می خوانید در یک رکوردست ، بعد یکی یکی آنها را حذف می کنید در صورتی که با دستور Delete from yourtable همین کار را در کمتر از چند ثانیه می توانید انجام دهید

khadem1386
یک شنبه 26 آبان 1387, 20:32 عصر
با سلام این یک code برای خواندن table هست. شما چطور اصلاحش می کنید
قبلی برای پاک کردن بود که روش درستش همانطور که دوست عزیزم گفت استفاده از
Delete from yourtable است ولی این کد برای خواندن اطلاعات است.



<!--- #include file="path.asp" -->
<%
Server.ScriptTimeout=200
%>
<%
strSQLServerName = "xxxx.xxxxx.com"
strSQLDBUserName = "xxxxx_xxxxx"
strSQLDBPassword = "xxxxxxx" ' xxxx
strSQLDBName = "xxxxxxx_xxxxx" '"BANK_NAME"

'MS SQL Server OLE Driver
strCon = "Provider=SQLOLEDB;Server=" & strSQLServerName & ";User ID=" & strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" & strSQLDBName & ";"
Set sqlCon = Server.CreateObject("ADODB.Connection")
sqlCon.connectionstring = strCon
sqlCon.Open
set REstateZipcode = Server.CreateObject("ADODB.Recordset")
REstateZipcode.Open "Select * from zipcode order by state" , sqlCon ,3,3
REstateZipcode.MoveFirst

while Not REstateZipcode.EOF

%>

<% = REstateZipcode("State") %>____
<% = REstateZipcode("ZipcodeID") %> <BR>

<%

REstateZipcode.MoveNext
wend

REstateZipcode.close
sqlCon.close
%>
خیلی خیلی ممنون می شم اگر با یک کد مثال بزنید.
مشکل اینجاست که سرعت آن خیلی کمه
و احتمالا یک جا اشتباهی وجود داره
اینجا من از دستور select استفاده کردم که در sql معتبر است

آیا شما طریقه دیگری می شناسید؟
این حدود چهل هزار رکورد است
مشکل اینجاست که قبل از اینکه شروع کنه به client اطلاعات بفرسته، کلی مکث می کنه
در صورتی که اگر همین کد را برای access بنویسم بلافاصله شروع می کنه به ارسال اطلاعات
و بلافاصله عکس العمل نشون می ده.

linux
دوشنبه 27 آبان 1387, 00:12 صبح
<html>

<head>
<title>Delete Record</title>
</head>

<body BGCOLOR="#ffffff">
<!--#include file="adovbs.inc"-->
<%

TEMP = Request.form("Name")

Set DataConn = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
DataConn.Open "DBQ=" & Server.Mappath("cdemo.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};"

Set rsDsp = DataConn.Execute("DELETE FROM tblContact WHERE Name = " & TEMP)
Response.Write("<center>Record Deleted.</center>

%>

</body>
</html>

khadem1386
دوشنبه 27 آبان 1387, 09:30 صبح
با تشکر از شما

ببینید من با همان راهنمایی شما در قبل، پاک کردن را در sql یاد گرفتم یعنی همین طور که در کد جدید هم نوشته اید.

ولی مشکل من اکنون در هنگام خواندن است این کد آخری هم که نوشتم نیز مربوط به خواندن اطلاعات از دیتا بیس است.
ولی سرعتش پایینه حتی کمتر از access که خوب مسلما یک جایی باید ایراد داشته باشه

باز هم از وقت شما ممنونم

AminSobati
دوشنبه 27 آبان 1387, 23:05 عصر
روی فیلدی که دارین جستجو انجام میدین باید ایندکس بسازین. در مثال شما، فیلد Name

khadem1386
سه شنبه 28 آبان 1387, 00:22 صبح
ببخشید ظاهرا شما اشتباهی کد آقای linux را به جای کد من بررسی کردید.

اصل کوئری من این است


REstateZipcode.Open "Select * from zipcode order by state" , sqlCon ,3,3

لطفا رجوع کنید به پاسخ شماره 6 در همین تاپیک

این هم لینک برای تست همین کد :
http://www.returneasy.com/Zipecode_to%20sql_read_temp.asp

اگر این صفحه را ریفریش کنید می بیند که اول وقفه داره بعد شروع می کنه به کار

با تشکر

khadem1386
چهارشنبه 29 آبان 1387, 14:12 عصر
این یک code برای خواندن table هست.
آیا دلیلی برای سرعت کم آن مشاهده می کنید؟



<!--- #include file="path.asp" -->
<%
Server.ScriptTimeout=200
%>
<%
strSQLServerName = "xxxx.xxxxx.com"
strSQLDBUserName = "xxxxx_xxxxx"
strSQLDBPassword = "xxxxxxx" ' xxxx
strSQLDBName = "xxxxxxx_xxxxx" '"BANK_NAME"

'MS SQL Server OLE Driver
strCon = "Provider=SQLOLEDB;Server=" & strSQLServerName & ";User ID=" & strSQLDBUserName & ";Password=" & strSQLDBPassword & ";Database=" & strSQLDBName & ";"
Set sqlCon = Server.CreateObject("ADODB.Connection")
sqlCon.connectionstring = strCon
sqlCon.Open
set REstateZipcode = Server.CreateObject("ADODB.Recordset")
REstateZipcode.Open "Select * from zipcode order by state" , sqlCon ,3,3
REstateZipcode.MoveFirst

while Not REstateZipcode.EOF

%>

<% = REstateZipcode("State") %>____
<% = REstateZipcode("ZipcodeID") %> <BR>

<%

REstateZipcode.MoveNext
wend

REstateZipcode.close
sqlCon.close
%>
خیلی خیلی ممنون می شم اگر با یک کد مثال بزنید.
مشکل اینجاست که سرعت آن خیلی کمه
و احتمالا یک جا اشتباهی وجود داره

اینجا من از دستور select استفاده کردم که در sql معتبر است
آیا شما طریقه دیگری می شناسید که درست تر باشه؟
REstateZipcode.Open "Select * from zipcode order by state" , sqlCon ,3,3

این حدود چهل هزار رکورد است

مشکل اینجاست که قبل از اینکه شروع کنه به client اطلاعات بفرسته، کلی مکث می کنه
این هم لینک تست اون.
http://www.returneasy.com/Zipecode_t..._read_temp.asp

من حتی order by را هم برداشتم ولی باز همان مشکل را دارد.

در صورتی که اگر همین کد را برای access بنویسم بلافاصله شروع می کنه به ارسال اطلاعات
و بلافاصله عکس العمل نشون می ده.

table شامل تنها دوتا فیلد (nchar(2), smallINT )و چهل دوهزار رکورد است.
آیا باید در SQL Server Management Studio Express تنظیماتی را انجام بدم تا DB بهتر کار کنه؟

khadem1386
پنج شنبه 30 آبان 1387, 20:16 عصر
دوست عزیزم شما دارین با SQL Server کار میکنین! پس دیگه روشهای اینچنینی رو کنار بزارین!

دوست عزیز آقای sobati:
روش های من قدیمی بود ولی در کدهای جدید سعی کردم درستش کنم لطف کنید که کدی که در بالا نوشتم را ببیند و باز نظر علمی تون را بگید تا اگر لازم باشه باز بهترش بکنم.

هدفم اینکه که اگه بشه پله پله بهتر بشم.

هر وقت سکوت می کنید احساس می کنم خیلی از مرحله پرتم خوب احساس خوبی نیست.
شایدم چون ایرادی در کد نمی بینید سکوت کردید.

مهاجرت به sqlserver سخته و من کلی دارم این در و اون در می زنم و خلاصه دارم تلاش خودم را می کنم.

مشکل اینکه این کد سرعتش از access کمتره و خوب این خیلی بده.:افسرده:


باز هم از وقت شما ممنون

khadem1386
شنبه 02 آذر 1387, 19:59 عصر
دوستان هیچ کمکی نمی توند بکنند؟