簡體   English   中英

使用EF從TestStand生成的SQL數據庫中檢索數據-非常慢

[英]Retrieving data from TestStand generated SQL database using EF - extremely slow

我們的工廠有一條新的生產線,上面有很多測試儀。 這些測試人員正在運行LabView,並將其數據記錄到由TestStand生成的SQL數據庫中。

我已經用c#編寫了一個程序,並使用Entity FrameWork 6基於幾個過濾器(即日期和測試儀編號)檢索數據。

我發現需要從多個表中檢索數據的查詢運行得非常慢。

這是查詢的示例

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();
        }

在撰寫本文時,以上查詢已運行40分鍾。 我估計總共在所有5個表中檢索了336,000行。

如果我在沒有包含的情況下運行以上命令,則查詢將在幾秒鍾內完成,並檢索到500行。

只是一些額外的信息。

SQL正在SQLEXPRESS上運行-是的,我知道這不是很好,我們正計划將其移到我們的SQL Server上。

表中的所有主鍵都是GUID數據類型,關系列也是如此。

因此,基於以上內容,這是預期的嗎? 特別是與SQLEXPRESS? 還是有人懷疑其他地方有問題?

基於我的智慧,在性能方面有更好的方法嗎?

編輯:SQL事件探查器跟蹤

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'

如果尚未完成,請檢查-可以/應該為您的特定查詢創建哪些索引。 不會以任何方式對deault NI SQL數據庫進行索引或優化。 運行您的慢查詢-然后此查詢檢查可以做什么。

-- check what could be indexed
SELECT mig.*, statement AS table_name,
column_id, column_name, column_usage
FROM sys.dm_db_missing_index_details AS mid
CROSS APPLY sys.dm_db_missing_index_columns (mid.index_handle)
INNER JOIN sys.dm_db_missing_index_groups AS mig ON mig.index_handle = mid.index_handle
ORDER BY mig.index_group_handle, mig.index_handle, column_id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM