Search code examples
sql-serverf#type-providersf#-interactive

FSharp.Data.SqlProvider is slow


I have simple DB with 4 tables. Table Results has 18 columns. 3 of them are foreign keys. I am trying to get number of all results (about 800k) with this code:

#I @"..\packages\SQLProvider.1.1.3\lib"
#r "FSharp.Data.SqlProvider.dll" 
open FSharp.Data.Sql


let [<Literal>] ConnectionStringmdf = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=C:\Users\Me\Desktop\myDb.mdf;Integrated Security=True;Connect Timeout=10"    

type Sqlmdf = SqlDataProvider< 
              ConnectionString =   ConnectionStringmdf,
              DatabaseVendor = Common.DatabaseProviderTypes.MSSQLSERVER,
              IndividualsAmount = 1000,
              UseOptionTypes = true, 
              CaseSensitivityChange = Common.CaseSensitivityChange.ORIGINAL
              >
let dbm = Sqlmdf.GetDataContext()

printfn "Results count:\t %i" (dbm.Dbo.Results |>  Seq.length ) 

It takes about 40 seconds to get count of records in one table.

Why is it so slow? What am I doing wrong?


Solution

  • The types returned by SqlDataProvider implement IQueryable which means you can write a query expression or use Queryable.Count

    open System.Linq
    
    dbm.Dbo.Results |> Queryable.Count 
    

    or

    query { for it in dbm.Dbo.Results do
            count
          }