Abfrage beschleunigen, ind dem nur jeder 2/3//4 etc. Datensatz gelesen wird?



  • Hallo,

    ich möchte gern eine abfrage amchen, und da die "auflösung" quasie ne art sample scan Rate verwenden!! wenn ich bspw. eine DB habe von 100000 datensätzen welche einer Bedingung entsprechen bzw. Zeitraum, sollen aber nur bspw. 5000 zurückgegben werden als jeder 20igste Datensatz! geht sowas ?? verwende momentam MS Access, kann aber aus SqlLite o. SqlCE verwenden! Kann sowas SQL?



  • Woger soll das RDBMS wissen das DU nur jeden 20. möchtest. Sowas gibt es nicht.
    Du kannst aber z.B. begrenzen.
    ZUmindest bei MSSQL und Mysql kenne ich den Befehl

    MSSQL SELECT TOP X FROm
    MySQl SELECT * FROM wasauchimmer LIMIT 10 bzw. LIMIT 10,10



  • Wenn du eine fortlaufende ID oder ähnliches hast, kannst du einfach einen MOD machen.

    ...WHERE MOD(ID, 5) = 0 ...

    Wenn nicht, und deine Datenbank eine Random-Funktion hat, kannst du immerhin ungefähr jeden 5. Datensatz holen:

    ...WHERE RANDOM(1, 5) = 1



  • frenki schrieb:

    Wenn du eine fortlaufende ID oder ähnliches hast, kannst du einfach einen MOD machen.

    ...WHERE MOD(ID, 5) = 0 ...9

    Das wird die Abfrage aber nicht beschleunigen. Eher verlangsamen.

    Wenn nicht, und deine Datenbank eine Random-Funktion hat, kannst du immerhin ungefähr jeden 5. Datensatz holen:

    ...WHERE RANDOM(1, 5) = 1

    Autsch. 😃



  • Wieso verlangsamen? Bei meinem Netzwerk gilt: Weniger Daten über's Netz -> Schneller.



  • frenki schrieb:

    Wieso verlangsamen? Bei meinem Netzwerk gilt: Weniger Daten über's Netz -> Schneller.

    Es wird trotzdem die ganze Tabelle gelesen 😉



  • Es sein denn er verwendet einen Funktionsbasierten Index der eben das Ergebnis der modulo-Operation verwendet:
    CREATE INDEX myindex ON mytable(MOD(ID, 5))
    Der Index sollte aber sehr selektiv sein also ein Mod 100 wäre da angebrachter.
    SELECT * FROM mytable WHERE MOD(ID, 5) = 0



  • phlox81 schrieb:

    frenki schrieb:

    Wieso verlangsamen? Bei meinem Netzwerk gilt: Weniger Daten über's Netz -> Schneller.

    Es wird trotzdem die ganze Tabelle gelesen 😉

    Ihr beide habt recht. Es kommt auch auf das Szenario an:
    Bei einem langsamen, stark beanspruchtes Netzwerk wird das Datenvolumen eine größere Rolle spielen, in schnellen Netzwerken mit eher wenig Last spielt der Select eine insgesamt größere Rolle. Der Select mag die gesamte Tabelle lesen, nicht aber übers Netzwerk schicken.

    cu André



  • frenki schrieb:

    Wieso verlangsamen? Bei meinem Netzwerk gilt: Weniger Daten über's Netz -> Schneller.

    Wo ist denn schon die Netzwerkverbindung zum DB-Server der große Flaschenhals? Die sollten idR. doch bei einem brauchbaren Setup ohnehin recht breitbandig angebunden sein. Der Vergleich tut in der Regel viel, viel mehr weh, es sei denn natürlich, Du hast entsprechend indiziert.



  • witte schrieb:

    Es sein denn er verwendet einen Funktionsbasierten Index der eben das Ergebnis der modulo-Operation verwendet:
    CREATE INDEX myindex ON mytable(MOD(ID, 5))
    Der Index sollte aber sehr selektiv sein also ein Mod 100 wäre da angebrachter.
    SELECT * FROM mytable WHERE MOD(ID, 5) = 0

    Jain...

    Wenn der Query-Optimizer aus seinen Statistiken rausbekommt, dass mehr als 10% der Tabelle (der Zeilen) gebraucht werden, wird üblicherweise ein Table-Scan gemacht, auch wenn es einen passenden Index gäbe.

    Denn es dauert länger, 10% aller Datensätze über Index-Lookup zu holen, als gleich einfach die ganze Tabelle zu lesen.

    Die einzige Möglichkeit den Table-Scan zu vermeiden wäre hier ein "covering index" oder "clustered index".
    Oder eben nicht gleich 1/5 (20%) sondern eher nur < 1% der Tabelle zu lesen.



  • Deshalb schrieb ich ja dass modulo 100 angebrachter wäre um auf 1% zu kommen, mal eine Gleichverteilung der Modulo-Ergebnisse der Id-Spalte vorausgesetzt.


Anmelden zum Antworten