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?
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
}