LinQ Contains - Performance



  • Hallo,

    ich habe eine View mit ca. 1.5 Mio. Datensätzen. Mit LIKE '%%' auf mehrere Spalten wird die Abfrage deutlich langsam.

    Meine Abfrage sieht in SQL ungefähr so aus

    Select a,b,c,d,e,f FROM ViewX
     WHERE ISNULL(a,'') LIKE '%%' AND
      ISNULL(b,'') LIKE '%%' AND
      ISNULL(c,'') LIKE '%%' AND
      ISNULL(d,'') LIKE '%%' AND
      ISNULL(e,'') LIKE '%%' AND
      ISNULL(f,'') LIKE '%%' AND
    

    in LinQ ungefähr so (hab hier jetzt nur das Contains auf 'a' dargestellt). Die Spalten 'b' -'f' könnt ihr euch dazu denken 😉

    from output in DataContext.ViewX
     where (string.IsNullOrEmpty(_a) ? (output.a== null || output.a.Contains(_a)) : output.a.Contains(_a))
    

    Die Abfrage dauert nun über 10 sek. Gibt es an dieser Stelle noch eine Möglichkeit die Datenabfrage zu beschleunigen?



  • Welches SQL-Query wird denn daraus erzeugt? Sonderlich schön schaut das jedenfalls nicht aus...bin aber leider kein LINQ-Experte, müsste ich mir erst genauer ansehen.

    MfG SideWinder



  • (string.IsNullOrEmpty(_a) ? (output.a== null || output.a.Contains(_a)) : output.a.Contains(_a))
    

    dieses Statement soll quasi die ISNULL-Methode in SQL simulieren und bezwecken, dass auch Datenfelder mit NULL zurückgegeben werden, wenn der übergebene String leer ist.

    Die eigentliche Frage ist aber, wie man das CONTAINS mit Wildcards schneller machen kann. Das dauert ja selbst auf dem SQL Server so lange, um das Statement auszuführen. Ich gehe mal davon aus, dass ich hier nicht um die Volltextsuche herumkomme.


Anmelden zum Antworten