|
Dobrý den, mám dotaz ohledně výběru dat z MSSQL databáze. Když si do své asp.net aplikace potřebuji natáhnout data z MS SQL databáze, tak se stránka načítá několik desítek vteřin. Když poté kliknu na znovuobnovení stránky, tak se data z databáze stáhnou za méně než jednu vteřinu při dalších opakováních opět jen méně než jednu vteřinu. Poté si dám chvíli pauzu, vrátím se k PC za několik desítek minut kliknu na znovuobnovení stránky a výběr dat zase trvá několik desítek vteřin. Spojení se s databází přitom ve všech případech trvá jen několik milisekund. Jedná se sice o poměrně složitý dotaz, nicméně pokud někdy trvá výběr dat méně než vteřinu a jindy desítky vteřin, tak asi dělá něco špatně SQL server, a nebo něco dělám špatně já. Níže zasílám příklad dotazu, který spouštím. Asi to nikomu nic neřekne, ale možná mi tam někde chybí nějaký parametr, a nebo něco přebývá ... Používám MSSQL 2005 Předem děkuji za vaše nápady a připomínky. Petr
WITH TB18915 AS ( SELECT ROW_NUMBER() OVER ( ORDER BY CONVERT(VARCHAR, T0.UcetniRok) + '/' + RIGHT('0' + CONVERT(VARCHAR, T0.UcetniMes), 2) DESC, SUM(T0.[PocetChybDop]) ASC, SUM(T0.[PocetChybCelk]) ASC, SUM(T0.[PocetChybSkl]) ASC, SUM(T0.[PocetChybAdm]) ASC, SUM(T0.[PocetChybKli]) ASC, SUM((T0.PocetPri + T0.PocetVyd + T0.PocetCD)) ASC ) AS CROW, CONVERT(VARCHAR, T0.UcetniRok) + '/' + RIGHT('0' + CONVERT(VARCHAR, T0.UcetniMes), 2) AS C19, SUM((T0.PocetPri + T0.PocetVyd + T0.PocetCD)) AS C17, SUM(T0.[PocetChybKli]) AS C13, SUM(T0.[PocetChybCelk]) AS C9, SUM(T0.[PocetChybDop]) AS C10, SUM(T0.[PocetChybSkl]) AS C11, SUM(T0.[PocetChybAdm]) AS C12, (CASE WHEN SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) > 0 THEN ( CAST(SUM(T0.PocetChybKli) AS FLOAT) / CAST(SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) AS FLOAT) * 100 ) ELSE 0 END) AS C15, (CASE WHEN SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) > 0 THEN (CAST(SUM(T0.PocetChybDop + T0.PocetChybAdm + T0.PocetChybSkl + T0.PocetChybOst) AS FLOAT) / CAST(SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) AS FLOAT) * 100) ELSE 0 END) AS C16, (CASE WHEN SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) > 0 THEN (CAST(SUM(T0.PocetChybDop) AS FLOAT) / CAST(SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) AS FLOAT) * 100) ELSE 0 END) AS C20, (CASE WHEN SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) > 0 THEN (CAST(SUM(T0.PocetChybSkl) AS FLOAT) / CAST(SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) AS FLOAT) * 100) ELSE 0 END) AS C21, (CASE WHEN SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) > 0 THEN (CAST(SUM(T0.PocetChybAdm) AS FLOAT) / CAST(SUM(T0.PocetPri + T0.PocetVyd + T0.PocetCD) AS FLOAT) * 100) ELSE 0 END) AS C22 FROM ( SELECT [KlFakturM], [Aktivita], [Adresa], [DIC], [UcetniRok], [UcetniMes], [PocetObj], [PocetPri], [PocetVyd], [PocetCD], [PocetChybCelk], [PocetChybDop], [PocetChybSkl], [PocetChybAdm], [PocetChybKli], [PocetChybOst] FROM [AiwisChybovVyh2013] WITH ( NOLOCK ) UNION ALL SELECT [KlFakturM], [Aktivita], [Adresa], [DIC], [UcetniRok], [UcetniMes], [PocetObj], [PocetPri], [PocetVyd], [PocetCD], [PocetChybCelk], [PocetChybDop], [PocetChybSkl], [PocetChybAdm], [PocetChybKli], [PocetChybOst] FROM [AiwisChybovVyh2014] WITH ( NOLOCK ) UNION ALL SELECT [KlFakturM], [Aktivita], [Adresa], [DIC], [UcetniRok], [UcetniMes], [PocetObj], [PocetPri], [PocetVyd], [PocetCD], [PocetChybCelk], [PocetChybDop], [PocetChybSkl], [PocetChybAdm], [PocetChybKli], [PocetChybOst] FROM [AiwisChybovVyh2015] WITH ( NOLOCK ) ) AS T0 LEFT OUTER JOIN [CADADH201500001] AS T1 WITH ( NOLOCK ) ON ( T1.[KLIC1ADR] = T0.[Adresa] ) WHERE ( T0.[Aktivita] = 0 AND ( T0.[UcetniRok] <> 0 ) AND ( T0.[UcetniMes] <> 0 ) AND (CONVERT(VARCHAR, T0.UcetniMes) <> '') ) GROUP BY CONVERT(VARCHAR, T0.UcetniRok) + '/' + RIGHT('0' + CONVERT(VARCHAR, T0.UcetniMes), 2) ) SELECT * FROM TB18915 WHERE CROW BETWEEN 1 AND 15 ORDER BY CROW ASC OPTION ( MAXDOP 8 )
|