webForumDet fria alternativet

Timeout, battre kod?

12 svar · 271 visningar · startad av Gimbo

GimboMedlem sedan dec. 20001 626 inlägg
#1

hejsan,
har denna kod som gor mig galen, den e saa himla trog och den ger mig timeout nar jag oppnar flera browsers o gor en sokning, hur kan jag optimera denna kod:

Set DataConn = Server.CreateObject("ADODB.Connection")
DataConn.CommandTimeout = 0

set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3
DataConn.Open "Provider=MSDASQL;Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx;"

Set cmdData = Server.CreateObject("ADODB.Command")
'RS.Open QryString, DataConn
cmdData.CommandType = 4
Set cmdData.ActiveConnection = DataConn
cmdData.CommandText = "sp_ProductSearch3"
cmdData.Parameters.Refresh
cmdData.Parameters("@searchstring1") = SearchString1
cmdData.Parameters("@searchstring2") = SearchString2
cmdData.Parameters("@searchstring3") = SearchString3
cmdData.Parameters("@searchstring4") = SearchString4

RS.open cmdData
'RS.Open cmdData, DataConn,  3,  3

nar jag kor med: RS.Open cmdData, DataConn, 3, 3 far jag felmeddelandet:

Cannot change the ActiveConnection property of a Recordset object which has a Command object as its source.

jag blir tokig!!!!!! kan man optimera koden mer an sa?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det är förmodligen inte ASP-koden som är problemet utan din procedur. En (liten) detalj är att man skall undvika att döpa procedurer till sp_xxxx

GimboMedlem sedan dec. 20001 626 inlägg
#3

sa kan det vara problemet namnet pa proceduren?? vad ar namn alternativet?vad brukar ga snett i en procedur da det ar fragan om timeout?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Att du använder sp_ i namnet kan inte orsaka en timeout.

Typiska orsaker till timeout är att man har sökningar som gör sekventiella läsningar i stora tabeller.

GimboMedlem sedan dec. 20001 626 inlägg
#5

det ar nog vad jag gor, hur slulle du rekomendera denna kod:

CREATE PROCEDURE dbo.sp_ProductSearch3
@searchstring1 varchar(100),
@searchstring2 varchar(100),
@searchstring3 varchar(1), 
@searchstring4 varchar(10)
AS

DECLARE
@count int,
@currentid int,
@currentword varchar(100),
@searchword varchar(100),
@QryString varchar(500),
@beginprice int,
@endprice int,
@strSql varchar(100)

set nocount on

/*************************/
if @searchstring3 = '1'
begin
	select @beginprice = 0
	select @endprice = 249
end
if @searchstring3 = '2'
begin
	select @beginprice = 250
	select @endprice = 499
end
if @searchstring3 = '3'
begin
	select @beginprice = 500
	select @endprice = 999
end
if @searchstring3 = '4'
begin
	select @beginprice = 1000
	select @endprice = 100000
end

/*********************/

if @searchstring1 = ''
begin
	select @searchstring1 = ' '
end

/* Store customer search requests */

if @searchstring1 <> ' '
begin
	insert into SearchRequest (searchfor, searchdate)
	values (@searchstring1, getdate()) 
end

/******************************************************************************************************************************/
/* For Testing purposes */

/*	select @searchstring1 = ''
	select @beginprice = 1000
	select @endprice = 100000
	select @searchstring2 = '0'
*/
/*****************************************************************************************************************************/

create table #temp (
tempid		int,
searchword	varchar(30)
)

select @count = 1

if CHARINDEX(' ',@searchstring1) = 0
begin
	insert into #temp (tempid, searchword)
		values (@count, @searchstring1)	
end

WHILE (select CHARINDEX(' ',@searchstring1)) <> 0

BEGIN
	select @searchword = substring(@searchstring1,1,CHARINDEX(' ',@searchstring1))
	insert into #temp (tempid, searchword)
		values (@count, @searchword)
	select @count = @count + 1
	select @searchstring1 = rtrim(ltrim(substring(@searchstring1,charindex(' ',@searchstring1),len(@searchstring1))))
	if charindex(' ',@searchstring1) = 0
	begin
		insert into #temp (tempid, searchword)
			values (@count, @searchstring1)
		BREAK
	end
	CONTINUE
END

create table #productlist (
imagename	varchar(15),
productnumber	varchar(15),
productname		varchar(256),
productdescription	varchar(2048),
departmentid	varchar(5),
categoryid	varchar(5),
sellprice		money,
ok_fl		varchar(1),
AlsoIn		varchar(1000)
)

while @count <> 0
begin
	select @currentid = @count
	if exists(select * from #temp where tempid = @currentid)
	begin
		select @currentword = '%'+ltrim(rtrim((select searchword from #temp where tempid = @currentid)))+'%'

		insert into #productlist
		select replace(replace(replace(i.ProductNumber,'#',''),'/',''),'-',''), i.ProductNumber,ProductName, ProductDescription, DepartmentID, CategoryID, SellPrice, 'y', AlsoIn
		from inventory i, ProductAlsoAvailableIn am
		where i.ProductNumber not in (select productnumber from #productlist)
		/*	and (productname like @currentword   */
		and (i.ProductNumber like @currentword
			or productdescription like @currentword
			or productName like @currentword)
		and SellPrice is not null
		and Discontinued = 0
		and i.productnumber = am.productnumber
		order by SellPrice
	end

	select @count = @count - 1
	continue
end

set @strSql = 'delete from #productlist '
set @strSql = @strSql + 'where categoryid not in ' + @searchstring2
if len(@searchstring2) > 0
begin
	exec(@strSql)
end

/*
if @searchstring2 <> 0 and @searchstring2 is not null
begin
	delete from #productlist
	where categoryid <> @searchstring2
end
*/

if @searchstring3 <> '0' and @searchstring3 <> ''
begin
	delete from #productlist
	where SellPrice not between @beginprice and @endprice
end

if @searchstring4 <> 0 and @searchstring4 is not null
begin
	delete from #productlist
	where departmentid <> @searchstring4
end

select * from #productlist
GO
LarsGMedlem sedan dec. 200012 464 inlägg
#6

Jaha, du får försöka bryta ner det i mindre bitar och se var konstanden ligger. Några saker

i.ProductNumber like @currentword

är ett exempel där det blir en sekventiell läsning då @currentword inleds med % Du kan ju jämföra vad som händer om du tar bort det inledande %-tecknet.

Den while-loop som du har där borde gå att byta ut mot en join med #temp.

Vilka index finns på tabellerna?

GimboMedlem sedan dec. 20001 626 inlägg
#7

vad menar du med vilka index finns pa tabellerna? har inget annat som ror sig utover denna sp, this is it om du inte menar ngt annat nu? ar valdigt tacksam for din hjalp LarsG

och du menar val inleds med @-tecknet och inte %-tecknet ?

LarsGMedlem sedan dec. 200012 464 inlägg
#8

och du menar val inleds med @-tecknet och inte %-tecknet ?

Nja, jag menade variabelns värde.

vad menar du med vilka index finns pa tabellerna?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/createdb/cm_8_des_05_2ri0.asp

GimboMedlem sedan dec. 20001 626 inlägg
#9

ok tog bort den inledande %-tecknet, men sokningen blir inte exakt da, enligt artikeln du postade (?), sokningen fungerar pa sa vis att jag har 3st dropdown dar man valjer olika varden ur och gor sin sokning mer precis.

GimboMedlem sedan dec. 20001 626 inlägg
#10

men det funkar fint nu efter att jag tagit bort inledande %-tecknet helt plotsligt, ska jag noja mig med detta, eller tror du att detta problem med timeout kan komma att uppsta igen?

LarsGMedlem sedan dec. 200012 464 inlägg
#11

Jo, jag vet att det inte blir exakt men avsikten är att försöka isolera problemet. Börja att göra sökningen i en tabell med några villkor. Om det inte går bra lägg till index. Därefter kan du lägga till att du gör en join (de kolumner som används i join-villkoret är typiskt indexerade).

Det finns även hjälpmedel för att analysera frågor

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_set-set_93sk.asp

GimboMedlem sedan dec. 20001 626 inlägg
#12

ok, man tackar for hjalpen LarsG

GimboMedlem sedan dec. 20001 626 inlägg
#13

har en fraga, just nu fungerar proceduren pa sa satt vid sokning sa skapas en tillfalligtabell med all produkter o darefter eliminerar jag de som inte ingar i sokningen, och plockar ut de som det sokes efter, gar det pa ngt vis att gora om denna procedur sa att de de soker sa skall den finna det man soker efter istallet for att skapa en tabell med alla produkter o darefter radera de som inte inga ri sokningen

130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)