Seite 1 von 2

MS SQL Abfage optimieren

Verfasst: 17.02.2010 13:17
von mk-soft
Hi, brauche mal hilfe für ein Web Datenbankabruf zu optimieren.
In einer Datenbank werden alle anrufe Gespeichert. "infosystem.dbo.anrufe". Die zweite Datenbank kommt von unsere Verwaltungssoftware. In dieser sind die Rufnummer in sechs verschiedenen Spalten hinterlegt. Kann leider auch Text beinhalten. z.B. "0123456789 Handy". Außerdem können zwischen den Zahlen Leerzeichen sein.

Hier mal den CommandText für den Abruf.

Code: Alles auswählen

Dim CommandText As String = "select top 100 infosystem.dbo.anrufe.*, bedasoft.dbo.ut_adressen.name1 from infosystem.dbo.anrufe"

        CommandText = CommandText & " left join bedasoft.dbo.ut_adressen on "

        CommandText = CommandText & " (Telefon1 = infosystem.dbo.anrufe.von) or"
        CommandText = CommandText & " (Telefon2 = infosystem.dbo.anrufe.von) or"
        CommandText = CommandText & " (Telefon3 = infosystem.dbo.anrufe.von) or"
        CommandText = CommandText & " (Tel1Kurz = infosystem.dbo.anrufe.von) or"
        CommandText = CommandText & " (Tel2Kurz = infosystem.dbo.anrufe.von) or"
        CommandText = CommandText & " (Tel3Kurz = infosystem.dbo.anrufe.von)"

        'CommandText = CommandText & " (Telefon1 like ('%'+infosystem.dbo.anrufe.von+'%')) or"
        'CommandText = CommandText & " (Telefon2 like ('%'+infosystem.dbo.anrufe.von+'%')) or"
        'CommandText = CommandText & " (Telefon3 like ('%'+infosystem.dbo.anrufe.von+'%'))" ' or"
        'CommandText = CommandText & " (Tel1Kurz like ('%'+infosystem.dbo.anrufe.von+'%')) or"
        'CommandText = CommandText & " (Tel2Kurz like ('%'+infosystem.dbo.anrufe.von+'%')) or"
        'CommandText = CommandText & " (Tel3Kurz like ('%'+infosystem.dbo.anrufe.von+'%'))"
        CommandText = CommandText & " ORDER BY infosystem.dbo.anrufe.recid DESC"
Danke

P.S. Like funktioniert nicht richtig

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 14:07
von bobobo
da fehlt ne klammer um die or-geschichte , oder?

besides : das dürfte (je nach Datenumfang) sicher nicht die schnellste Abfrage sein.

öö pb ist das so aber nicht ganz, oder?

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 14:12
von bobobo
ne union abfrage erhöht zwar den Umfang der sqlAbfrage selber
beschleunigt die Ergebnislieferung aber u.U. enorm.

so in der Art (falls das geht)

Code: Alles auswählen

select d1.id as'ordercolumn' d1.dingsbums,d2,krams from dies d1 join das d2 on d1.diese=d2.dashier1
union
select d1.id as'ordercolumn' d1.dingsbums,d2,krams from dies d1 join das d2 on d1.diese=d2.dashier2
union
select d1.id as'ordercolumn' d1.dingsbums,d2,krams from dies d1 join das d2 on d1.diese=d2.dashier3
order by 'ordercolumn'

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 14:24
von Kukulkan
Hallo,

ich sehe das Problem, aber mit den Textfeldern wirst Du nicht glücklich und auch keine gute Erkennung erreichen. Ich würde eine zusätzliche Suchtabelle aufbauen:

AdressenID, Nummer

Darin würde ich die bereinigten Nummern zu den jeweiligen Adressen (ID) ablegen (erstmal in einem Batch, dann bei jedem neuen natürlich sofort). Die Nummern sollten normiert sein (zB 0049123456789). Eine Suche gestaltet sich dann viel einfacher, weil Du eine Nummer in dieser Tabelle direkt suchst (sehr schnell durch Indexe) und dann den Datensatz direkt auslesen kannst (einfacher JOIN). Ganz easy!

Volker

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 14:45
von mk-soft
Die Anrufe lade ich über CAPI-Tool in die Datenbank und sind somit genormt.

Die Rufnummern in der Adressen Datenbank müssen noch überarbeitet werden und werden aus Rufnummer + Text bestehen. Ist leider so.

Nur mit Left Join tabelle on (x like y) funktioniert nicht so richtig

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 14:55
von bobobo
sabbersabber...left join on ((abfrage) or (abfrage2) or (Abfrage3)) sabbersabber...

s.o. wegen speed

ok (ich schäm mich) .. hab's nochmal gecheckt der blöde mssql-server macht's auch ohne klammer . .aber alleine aus hygienischen gründen tät ich nicht drauf verzichten wollen

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 15:09
von mk-soft

Code: Alles auswählen

CommandText = "select top 100 infosystem.dbo.anrufe.*, bedasoft.dbo.ut_adressen.name1 from infosystem.dbo.anrufe"
        CommandText = CommandText & " left join on"
        CommandText = CommandText & " (where bedasoft.dbo.ut_adressen.Telefon1 like infosystem.dbo.anrufe.von)"
haut leider nicht hin.

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 15:37
von mk-soft
= Funktioniert

Code: Alles auswählen

CommandText = "select top 100 infosystem.dbo.anrufe.*, bedasoft.dbo.ut_adressen.name1 from infosystem.dbo.anrufe"
        CommandText = CommandText & " left join bedasoft.dbo.ut_adressen on"
        CommandText = CommandText & " (Telefon2 = von)"

Like Funktioniert nicht

Code: Alles auswählen

CommandText = "select top 100 infosystem.dbo.anrufe.*, bedasoft.dbo.ut_adressen.name1 from infosystem.dbo.anrufe"
        CommandText = CommandText & " left join bedasoft.dbo.ut_adressen on"
        CommandText = CommandText & " (Telefon2 like von)"

?

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 15:51
von Kiffi
mk-soft hat geschrieben:Like Funktioniert nicht
IMO fehlen da die entsprechenden Wildcards. Ohne
diese ist eine 'Like' gleich '='.

Grüße ... Kiffi

Re: MS SQL Abfage optimieren

Verfasst: 17.02.2010 16:35
von mk-soft
Schon gefunden :D

Code: Alles auswählen

        CommandText = "select top 150 infosystem.dbo.anrufe.recid, infosystem.dbo.anrufe.datum, infosystem.dbo.anrufe.von, bedasoft.dbo.ut_adressen.name1 as name, infosystem.dbo.anrufe.an from infosystem.dbo.anrufe"
        CommandText = CommandText & " left join bedasoft.dbo.ut_adressen on"
        CommandText = CommandText & " (Telefon1 like von+'%') or"
        CommandText = CommandText & " (Telefon2 like von+'%') or"
        CommandText = CommandText & " (Telefon3 like von+'%')"

        CommandText = CommandText & " ORDER BY infosystem.dbo.anrufe.recid DESC"
mit Union geht es nicht so gut...