We have a new production line in our factory which has a bunch of testers on. These testers are running LabView and are logging their data to an SQL database, which was generated by TestStand.
I have written a program in c# and using Entity FrameWork 6 to retrieve data based on a couple of filters i.e. date and tester number.
I am finding that querys that require retrieving data from multiple tables are running very very slow.
Here is an example of a query
using (var db = new LoggingEntities())
{
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
db.Configuration.ProxyCreationEnabled = false;
db.Database.CommandTimeout = 5000;
var Results = db.UUT_RESULT.Include("STEP_RESULT")
.Include("STEP_RESULT.STEP_NUMERICLIMIT1") .Include("STEP_RESULT.STEP_NUMERICLIMIT1.STEP_NUMERICLIMIT2")
.Include("STEP_RESULT.PROP_RESULT")
.AsNoTracking()
.Where(x => x.STATION_ID == SelectedTester && x.START_DATE_TIME.Value >= StartFilterDate && x.START_DATE_TIME.Value <= endDate).ToList();
}
At the time of writing this, the above query has been running for 40 minutes. I estimate that in total, across all 5 tables, this is retrieving 336,000 rows.
If I run the above without the includes, the query is completed in a few seconds with 500 Rows retrieved.
Just some extra info.
SQL is running on SQLEXPRESS - Yes i know this is not great and we are planning to move this onto our SQL server.
All Primary keys in the tables are GUID data type and so are the Relational Columns.
So based on the above, is this expected? especially with SQLEXPRESS? or does anyone suspect something else is wrong?
Based on what I have to work wit, is there a better was to do this, performance wise?
EDIT: SQL Profiler Trace
exec sp_executesql N'SELECT
[Project4].[C1] AS [C1],
[Project4].[ID] AS [ID],
[Project4].[STATION_ID] AS [STATION_ID],
[Project4].[BATCH_SERIAL_NUMBER] AS [BATCH_SERIAL_NUMBER],
[Project4].[TEST_SOCKET_INDEX] AS [TEST_SOCKET_INDEX],
[Project4].[UUT_SERIAL_NUMBER] AS [UUT_SERIAL_NUMBER],
[Project4].[USER_LOGIN_NAME] AS [USER_LOGIN_NAME],
[Project4].[START_DATE_TIME] AS [START_DATE_TIME],
[Project4].[EXECUTION_TIME] AS [EXECUTION_TIME],
[Project4].[UUT_STATUS] AS [UUT_STATUS],
[Project4].[UUT_ERROR_CODE] AS [UUT_ERROR_CODE],
[Project4].[UUT_ERROR_MESSAGE] AS [UUT_ERROR_MESSAGE],
[Project4].[PART_NUMBER] AS [PART_NUMBER],
[Project4].[TSR_FILE_NAME] AS [TSR_FILE_NAME],
[Project4].[TSR_FILE_ID] AS [TSR_FILE_ID],
[Project4].[TSR_FILE_CLOSED] AS [TSR_FILE_CLOSED],
[Project4].[StationType] AS [StationType],
[Project4].[C57] AS [C2],
[Project4].[C3] AS [C3],
[Project4].[C4] AS [C4],
[Project4].[C5] AS [C5],
[Project4].[C6] AS [C6],
[Project4].[C7] AS [C7],
[Project4].[C8] AS [C8],
[Project4].[C9] AS [C9],
[Project4].[C10] AS [C10],
[Project4].[C11] AS [C11],
[Project4].[C12] AS [C12],
[Project4].[C13] AS [C13],
[Project4].[C14] AS [C14],
[Project4].[C15] AS [C15],
[Project4].[C16] AS [C16],
[Project4].[C17] AS [C17],
[Project4].[C18] AS [C18],
[Project4].[C19] AS [C19],
[Project4].[C20] AS [C20],
[Project4].[C21] AS [C21],
[Project4].[C22] AS [C22],
[Project4].[C23] AS [C23],
[Project4].[C24] AS [C24],
[Project4].[C25] AS [C25],
[Project4].[C2] AS [C26],
[Project4].[C26] AS [C27],
[Project4].[C27] AS [C28],
[Project4].[C28] AS [C29],
[Project4].[C29] AS [C30],
[Project4].[C30] AS [C31],
[Project4].[C31] AS [C32],
[Project4].[C32] AS [C33],
[Project4].[C33] AS [C34],
[Project4].[C34] AS [C35],
[Project4].[C35] AS [C36],
[Project4].[C36] AS [C37],
[Project4].[C37] AS [C38],
[Project4].[C38] AS [C39],
[Project4].[C39] AS [C40],
[Project4].[C40] AS [C41],
[Project4].[C41] AS [C42],
[Project4].[C42] AS [C43],
[Project4].[C43] AS [C44],
[Project4].[C44] AS [C45],
[Project4].[C45] AS [C46],
[Project4].[C46] AS [C47],
[Project4].[C47] AS [C48],
[Project4].[C48] AS [C49],
[Project4].[C49] AS [C50],
[Project4].[C50] AS [C51],
[Project4].[C51] AS [C52],
[Project4].[C52] AS [C53],
[Project4].[C53] AS [C54],
[Project4].[C54] AS [C55],
[Project4].[C55] AS [C56],
[Project4].[C56] AS [C57]
FROM ( SELECT
[Project1].[ID] AS [ID],
[Project1].[STATION_ID] AS [STATION_ID],
[Project1].[BATCH_SERIAL_NUMBER] AS [BATCH_SERIAL_NUMBER],
[Project1].[TEST_SOCKET_INDEX] AS [TEST_SOCKET_INDEX],
[Project1].[UUT_SERIAL_NUMBER] AS [UUT_SERIAL_NUMBER],
[Project1].[USER_LOGIN_NAME] AS [USER_LOGIN_NAME],
[Project1].[START_DATE_TIME] AS [START_DATE_TIME],
[Project1].[EXECUTION_TIME] AS [EXECUTION_TIME],
[Project1].[UUT_STATUS] AS [UUT_STATUS],
[Project1].[UUT_ERROR_CODE] AS [UUT_ERROR_CODE],
[Project1].[UUT_ERROR_MESSAGE] AS [UUT_ERROR_MESSAGE],
[Project1].[PART_NUMBER] AS [PART_NUMBER],
[Project1].[TSR_FILE_NAME] AS [TSR_FILE_NAME],
[Project1].[TSR_FILE_ID] AS [TSR_FILE_ID],
[Project1].[TSR_FILE_CLOSED] AS [TSR_FILE_CLOSED],
[Project1].[StationType] AS [StationType],
[Project1].[C1] AS [C1],
[UnionAll1].[C1] AS [C2],
[UnionAll1].[C2] AS [C3],
[UnionAll1].[ID] AS [C4],
[UnionAll1].[UUT_RESULT] AS [C5],
[UnionAll1].[STEP_PARENT] AS [C6],
[UnionAll1].[ORDER_NUMBER] AS [C7],
[UnionAll1].[STEP_NAME] AS [C8],
[UnionAll1].[STEP_TYPE] AS [C9],
[UnionAll1].[STEP_GROUP] AS [C10],
[UnionAll1].[STEP_INDEX] AS [C11],
[UnionAll1].[STEP_ID] AS [C12],
[UnionAll1].[STATUS] AS [C13],
[UnionAll1].[REPORT_TEXT] AS [C14],
[UnionAll1].[ERROR_CODE] AS [C15],
[UnionAll1].[ERROR_MESSAGE] AS [C16],
[UnionAll1].[CAUSED_SEQFAIL] AS [C17],
[UnionAll1].[MODULE_TIME] AS [C18],
[UnionAll1].[TOTAL_TIME] AS [C19],
[UnionAll1].[NUM_LOOPS] AS [C20],
[UnionAll1].[NUM_PASSED] AS [C21],
[UnionAll1].[NUM_FAILED] AS [C22],
[UnionAll1].[ENDING_LOOP_INDEX] AS [C23],
[UnionAll1].[LOOP_INDEX] AS [C24],
[UnionAll1].[INTERACTIVE_EXENUM] AS [C25],
[UnionAll1].[C3] AS [C26],
[UnionAll1].[ID1] AS [C27],
[UnionAll1].[STEP_RESULT] AS [C28],
[UnionAll1].[PROP_PARENT] AS [C29],
[UnionAll1].[ORDER_NUMBER1] AS [C30],
[UnionAll1].[NAME] AS [C31],
[UnionAll1].[PATH] AS [C32],
[UnionAll1].[CATEGORY] AS [C33],
[UnionAll1].[TYPE_VALUE] AS [C34],
[UnionAll1].[TYPE_NAME] AS [C35],
[UnionAll1].[DISPLAY_FORMAT] AS [C36],
[UnionAll1].[DATA] AS [C37],
[UnionAll1].[C4] AS [C38],
[UnionAll1].[ID2] AS [C39],
[UnionAll1].[PROP_RESULT] AS [C40],
[UnionAll1].[COMP_OPERATOR] AS [C41],
[UnionAll1].[HIGH_LIMIT] AS [C42],
[UnionAll1].[LOW_LIMIT] AS [C43],
[UnionAll1].[UNITS] AS [C44],
[UnionAll1].[STATUS1] AS [C45],
[UnionAll1].[C5] AS [C46],
[UnionAll1].[C6] AS [C47],
[UnionAll1].[C7] AS [C48],
[UnionAll1].[C8] AS [C49],
[UnionAll1].[C9] AS [C50],
[UnionAll1].[C10] AS [C51],
[UnionAll1].[C11] AS [C52],
[UnionAll1].[C12] AS [C53],
[UnionAll1].[C13] AS [C54],
[UnionAll1].[C14] AS [C55],
[UnionAll1].[C15] AS [C56],
CASE WHEN ([UnionAll1].[ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C57]
FROM (SELECT
[Extent1].[ID] AS [ID],
[Extent1].[STATION_ID] AS [STATION_ID],
[Extent1].[BATCH_SERIAL_NUMBER] AS [BATCH_SERIAL_NUMBER],
[Extent1].[TEST_SOCKET_INDEX] AS [TEST_SOCKET_INDEX],
[Extent1].[UUT_SERIAL_NUMBER] AS [UUT_SERIAL_NUMBER],
[Extent1].[USER_LOGIN_NAME] AS [USER_LOGIN_NAME],
[Extent1].[START_DATE_TIME] AS [START_DATE_TIME],
[Extent1].[EXECUTION_TIME] AS [EXECUTION_TIME],
[Extent1].[UUT_STATUS] AS [UUT_STATUS],
[Extent1].[UUT_ERROR_CODE] AS [UUT_ERROR_CODE],
[Extent1].[UUT_ERROR_MESSAGE] AS [UUT_ERROR_MESSAGE],
[Extent1].[PART_NUMBER] AS [PART_NUMBER],
[Extent1].[TSR_FILE_NAME] AS [TSR_FILE_NAME],
[Extent1].[TSR_FILE_ID] AS [TSR_FILE_ID],
[Extent1].[TSR_FILE_CLOSED] AS [TSR_FILE_CLOSED],
[Extent1].[StationType] AS [StationType],
1 AS [C1]
FROM [dbo].[UUT_RESULT] AS [Extent1]
WHERE (([Extent1].[STATION_ID] = @p__linq__0) OR (([Extent1].[STATION_ID] IS NULL) AND (@p__linq__0 IS NULL))) AND ([Extent1].[START_DATE_TIME] >= @p__linq__1) AND ([Extent1].[START_DATE_TIME] <= @p__linq__2) ) AS [Project1]
OUTER APPLY (SELECT
CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1],
1 AS [C2],
[Extent2].[ID] AS [ID],
[Extent2].[UUT_RESULT] AS [UUT_RESULT],
[Extent2].[STEP_PARENT] AS [STEP_PARENT],
[Extent2].[ORDER_NUMBER] AS [ORDER_NUMBER],
[Extent2].[STEP_NAME] AS [STEP_NAME],
[Extent2].[STEP_TYPE] AS [STEP_TYPE],
[Extent2].[STEP_GROUP] AS [STEP_GROUP],
[Extent2].[STEP_INDEX] AS [STEP_INDEX],
[Extent2].[STEP_ID] AS [STEP_ID],
[Extent2].[STATUS] AS [STATUS],
[Extent2].[REPORT_TEXT] AS [REPORT_TEXT],
[Extent2].[ERROR_CODE] AS [ERROR_CODE],
[Extent2].[ERROR_MESSAGE] AS [ERROR_MESSAGE],
[Extent2].[CAUSED_SEQFAIL] AS [CAUSED_SEQFAIL],
[Extent2].[MODULE_TIME] AS [MODULE_TIME],
[Extent2].[TOTAL_TIME] AS [TOTAL_TIME],
[Extent2].[NUM_LOOPS] AS [NUM_LOOPS],
[Extent2].[NUM_PASSED] AS [NUM_PASSED],
[Extent2].[NUM_FAILED] AS [NUM_FAILED],
[Extent2].[ENDING_LOOP_INDEX] AS [ENDING_LOOP_INDEX],
[Extent2].[LOOP_INDEX] AS [LOOP_INDEX],
[Extent2].[INTERACTIVE_EXENUM] AS [INTERACTIVE_EXENUM],
CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C3],
[Join1].[ID1] AS [ID1],
[Join1].[STEP_RESULT] AS [STEP_RESULT],
[Join1].[PROP_PARENT] AS [PROP_PARENT],
[Join1].[ORDER_NUMBER] AS [ORDER_NUMBER1],
[Join1].[NAME] AS [NAME],
[Join1].[PATH] AS [PATH],
[Join1].[CATEGORY] AS [CATEGORY],
[Join1].[TYPE_VALUE] AS [TYPE_VALUE],
[Join1].[TYPE_NAME] AS [TYPE_NAME],
[Join1].[DISPLAY_FORMAT] AS [DISPLAY_FORMAT],
[Join1].[DATA] AS [DATA],
CASE WHEN ([Join1].[ID1] IS NULL) THEN CAST(NULL AS int) WHEN ([Join1].[ID2] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C4],
[Join1].[ID2] AS [ID2],
[Join1].[PROP_RESULT] AS [PROP_RESULT],
[Join1].[COMP_OPERATOR] AS [COMP_OPERATOR],
[Join1].[HIGH_LIMIT] AS [HIGH_LIMIT],
[Join1].[LOW_LIMIT] AS [LOW_LIMIT],
[Join1].[UNITS] AS [UNITS],
[Join1].[STATUS] AS [STATUS1],
CAST(NULL AS uniqueidentifier) AS [C5],
CAST(NULL AS uniqueidentifier) AS [C6],
CAST(NULL AS uniqueidentifier) AS [C7],
CAST(NULL AS int) AS [C8],
CAST(NULL AS varchar(1)) AS [C9],
CAST(NULL AS varchar(1)) AS [C10],
CAST(NULL AS int) AS [C11],
CAST(NULL AS int) AS [C12],
CAST(NULL AS varchar(1)) AS [C13],
CAST(NULL AS varchar(1)) AS [C14],
CAST(NULL AS varchar(1)) AS [C15]
FROM [dbo].[STEP_RESULT] AS [Extent2]
LEFT OUTER JOIN (SELECT [Extent3].[ID] AS [ID1], [Extent3].[STEP_RESULT] AS [STEP_RESULT], [Extent3].[PROP_PARENT] AS [PROP_PARENT], [Extent3].[ORDER_NUMBER] AS [ORDER_NUMBER], [Extent3].[NAME] AS [NAME], [Extent3].[PATH] AS [PATH], [Extent3].[CATEGORY] AS [CATEGORY], [Extent3].[TYPE_VALUE] AS [TYPE_VALUE], [Extent3].[TYPE_NAME] AS [TYPE_NAME], [Extent3].[DISPLAY_FORMAT] AS [DISPLAY_FORMAT], [Extent3].[DATA] AS [DATA], [Extent4].[ID] AS [ID2], [Extent4].[PROP_RESULT] AS [PROP_RESULT], [Extent4].[COMP_OPERATOR] AS [COMP_OPERATOR], [Extent4].[HIGH_LIMIT] AS [HIGH_LIMIT], [Extent4].[LOW_LIMIT] AS [LOW_LIMIT], [Extent4].[UNITS] AS [UNITS], [Extent4].[STATUS] AS [STATUS]
FROM [dbo].[STEP_NUMERICLIMIT1] AS [Extent3]
LEFT OUTER JOIN [dbo].[STEP_NUMERICLIMIT2] AS [Extent4] ON [Extent3].[ID] = [Extent4].[PROP_RESULT] ) AS [Join1] ON [Extent2].[ID] = [Join1].[STEP_RESULT]
WHERE [Project1].[ID] = [Extent2].[UUT_RESULT]
UNION ALL
SELECT
2 AS [C1],
2 AS [C2],
[Extent5].[ID] AS [ID],
[Extent5].[UUT_RESULT] AS [UUT_RESULT],
[Extent5].[STEP_PARENT] AS [STEP_PARENT],
[Extent5].[ORDER_NUMBER] AS [ORDER_NUMBER],
[Extent5].[STEP_NAME] AS [STEP_NAME],
[Extent5].[STEP_TYPE] AS [STEP_TYPE],
[Extent5].[STEP_GROUP] AS [STEP_GROUP],
[Extent5].[STEP_INDEX] AS [STEP_INDEX],
[Extent5].[STEP_ID] AS [STEP_ID],
[Extent5].[STATUS] AS [STATUS],
[Extent5].[REPORT_TEXT] AS [REPORT_TEXT],
[Extent5].[ERROR_CODE] AS [ERROR_CODE],
[Extent5].[ERROR_MESSAGE] AS [ERROR_MESSAGE],
[Extent5].[CAUSED_SEQFAIL] AS [CAUSED_SEQFAIL],
[Extent5].[MODULE_TIME] AS [MODULE_TIME],
[Extent5].[TOTAL_TIME] AS [TOTAL_TIME],
[Extent5].[NUM_LOOPS] AS [NUM_LOOPS],
[Extent5].[NUM_PASSED] AS [NUM_PASSED],
[Extent5].[NUM_FAILED] AS [NUM_FAILED],
[Extent5].[ENDING_LOOP_INDEX] AS [ENDING_LOOP_INDEX],
[Extent5].[LOOP_INDEX] AS [LOOP_INDEX],
[Extent5].[INTERACTIVE_EXENUM] AS [INTERACTIVE_EXENUM],
CAST(NULL AS int) AS [C3],
CAST(NULL AS uniqueidentifier) AS [C4],
CAST(NULL AS uniqueidentifier) AS [C5],
CAST(NULL AS uniqueidentifier) AS [C6],
CAST(NULL AS int) AS [C7],
CAST(NULL AS varchar(1)) AS [C8],
CAST(NULL AS varchar(1)) AS [C9],
CAST(NULL AS int) AS [C10],
CAST(NULL AS int) AS [C11],
CAST(NULL AS varchar(1)) AS [C12],
CAST(NULL AS varchar(1)) AS [C13],
CAST(NULL AS float) AS [C14],
CAST(NULL AS int) AS [C15],
CAST(NULL AS uniqueidentifier) AS [C16],
CAST(NULL AS uniqueidentifier) AS [C17],
CAST(NULL AS varchar(1)) AS [C18],
CAST(NULL AS float) AS [C19],
CAST(NULL AS float) AS [C20],
CAST(NULL AS varchar(1)) AS [C21],
CAST(NULL AS varchar(1)) AS [C22],
[Extent6].[ID] AS [ID1],
[Extent6].[STEP_RESULT] AS [STEP_RESULT],
[Extent6].[PROP_PARENT] AS [PROP_PARENT],
[Extent6].[ORDER_NUMBER] AS [ORDER_NUMBER1],
[Extent6].[NAME] AS [NAME],
[Extent6].[PATH] AS [PATH],
[Extent6].[CATEGORY] AS [CATEGORY],
[Extent6].[TYPE_VALUE] AS [TYPE_VALUE],
[Extent6].[TYPE_NAME] AS [TYPE_NAME],
[Extent6].[DISPLAY_FORMAT] AS [DISPLAY_FORMAT],
[Extent6].[DATA] AS [DATA]
FROM [dbo].[STEP_RESULT] AS [Extent5]
INNER JOIN [dbo].[PROP_RESULT] AS [Extent6] ON [Extent5].[ID] = [Extent6].[STEP_RESULT]
WHERE [Project1].[ID] = [Extent5].[UUT_RESULT]) AS [UnionAll1]
) AS [Project4]
ORDER BY [Project4].[ID] ASC, [Project4].[C57] ASC, [Project4].[C4] ASC, [Project4].[C2] ASC, [Project4].[C27] ASC, [Project4].[C38] ASC',N'@p__linq__0 varchar(8000),@p__linq__1 datetime2(7),@p__linq__2 datetime2(7)',@p__linq__0='SIDEPCBA',@p__linq__1='2017-08-03 00:00:00',@p__linq__2='2017-08-03 23:59:00'