Pomalé čtení SQL ?   zodpovězená otázka

VB.NET, Databáze

Zdravím zdejší profíky. Prosím o radu. Níže uvedený zdroj (pokusný). Mi "sosá" do comboboxu seznam ID+název zakázek z DB běžící v sítí na SQL. Problém je, že načtení zhruba 900 řádků trvá kolem 4sec. Což je nepředstavitelně dlouho pro tak malou aplikaci. Resp. když ten obsah comba musím sem tam obnovit kvůli aktualizaci. Navede mě prosím někdo na rychlejší zdroj ??

Díky moc Radek

Imports System.Data.SqlClient


Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.Cursor = Cursors.AppStarting
        Dim ConString As String = "Data Source=SERVER2;Initial Catalog=SOWMAIN.MDF;Integrated Security=True;Pooling=False"

        Dim Sqldbcon As New SqlConnection(ConString)
        Dim dt As DataTable = New DataTable("Zakazky")        'tabulka s daty v paměti
        Sqldbcon.Open()
        Dim strSql As SqlCommand
        strSql = New SqlCommand("SELECT ID, CAST(Cislo AS nvarchar) + ': ' + Nazev AS PlneJmeno FROM Zakazky", Sqldbcon)
        Dim ada As New SqlDataAdapter(strSql)
        ada.Fill(dt)
        With (Me.ComboBox1)
            .DataSource = dt
            .DisplayMember = "PlneJmeno"
            .ValueMember = "ID"
        End With
        Sqldbcon.Close()
        Me.Cursor = Cursors.Default
    End Sub
End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím, jestli rychlejší, ale já používám

Imports System.Data.OleDb

do Module1 jsem si dal connectionstring, abych ho nemusel všude vypisovat

Public pwdcon As String = "Provider=SQLOLEDB;Data Source=NazevSQLserveru;Persist Security Info=True;Password=UzivatelovoHeslo;User ID=Uzivatel;Initial Catalog=NazevDatabaze"
Public oledbcon As New OleDbConnection(pwdcon)

pak v jednotlivých "formech" používám

oledbcon.open()

'kód

oledbcon.close()

a ani ne za 1s mám načteno cca 20000 záznamů...

P.S. Skutečně načítáte do ComboBoxu 900 záznamů??? K čemu je to potřeba, smím-li se zeptat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže ad1) do comba načítám zakázky pro výběr.... většinou je to filtrováno jen na aktivní zakázky (do 30 řádků), ale při editaci potřebuji i již neaktivní, což je nyní kolem 900. Nicméně, ať je nebo není to filtrované to načítání je zhruba stejně dlouhé... :-(

ad2) výše uvedené bude fungovat i když je to v sítí na MS Sql2012Express ???

Díky moc za rady.....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máš nějaký zásadní důvod pro nepoužívat Entity framework?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No jednoduchý... vůbec nic mi to neříká... :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak doporučuji vyzkoušet. Ulehčí to HODNĚ práce

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1) Zkus za název tabulky připsat with(nolock) ... bez zamykaní - jen čteš

sql dotaz bude vypadat takhle:

SELECT ID, CAST(Cislo AS nvarchar) + ': ' + Nazev AS PlneJmeno FROM Zakazky with(nolock)

2) Začni se koukat po tutoriálech Entity Frameworku ... :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak podle struktury je mi Framework nahony vzdálen. Jsem odchovanec pascalu a basic... :-D

Nějaké návrhy v původním záměru řešení ??? Bez zamykání asi raději né, je to síťové, ať nedojde ke kolizi.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Bez znalostí takto naprosto elementárních věcí jako je například EF (Entity Framework), je téměř hřích programovat v .Net. Vaše aplikace pak nikdy nevyužijí veškeré přednosti a výhody frameworku, také budou špatně napsány, což může mít, jak je aktuálně vidět, velmi negativní vliv na běh aplikace nebo obecně práce v ní.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže jsem postupným vyřazováním příkazů zjistil, že ona prodleva je způsobena samotným připojením k DB. Zkusím to přesunout jinam a na událost buttonClic provádět již jen samotný dotaz, co opravdu šlape rychle !!

Díky za rady a náměty !!!

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Načíst 900 řádků z SQL serveru nemůže trvat 4s. To není problém dotazu ale síťové nebo serverové infrastruktury (pomalé připojení, spojení nebo autentizace oproti SQL Serveru).

Zkuste:

1) diagnostikovat síť (rychlost odezvy, ztráty)

2) jiný typ autentizace

3) otestovat připojení z jiného klienta nebo pod jinými účty

4) odstranit Pooling=False z connection stringu

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky za radu....... bod 4 výrazně pomohl. Díky MOC !!!!

K čemu to slouží ??? Ta aplikace je síťová s přístupem vícerouživatelů. Nezboří mi to DB ??

Díky za radu !

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pooling=false v connection stringu je informace pro ADO.NET (objekt SQLConnection), aby se nepoužíval tzv. connection pooling.

Connection pooling je obecně velmi dobrá a chtěná věc a nikdy jsem se v praxi nesetkal s případem, kdy by ho bylo potřeba vypnout. Jde o mechanismus, že si ADO.NET automaticky udržuje dříve použitá spojení do databáze v připraveném stavu, aby connection.Open proběhlo rychle viz:

http://msdn.microsoft.com/en-us/library/...

Předpokladem je, že je connection otevřené (mezi voláním Open a Close) vždy jen po co nejmenší nutnou dobu a connection objekty se korektně uzavírají (i v případě chyby). Běžný pattern je proto použití klíčového slova using a žádné držení referencí na otevřená spojení apod.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback