2016-05-04 6 views
-2

Я выполняю под запрос. Это занимает 80 секунд всего за 17 записей.sqlserver Время выполнения запроса

может любое тело сказать мне причина если знает. Я уже пробовал с индексами.

SELECT DISTINCT t.i_UserID, 
       u.vch_LoginName, 
       t.vch_PreviousEmailAddress AS 'vch_EmailAddress', 
       u.vch_DisplayName, 
       t.d_TransactionDate AS 'd_DateAdded', 
       'Old' AS 'vch_RecordStatus' 
      FROM tblEmailTransaction t 
    INNER JOIN tblUser u 
      ON t.i_UserID = u.i_UserID 
      WHERE t.vch_PreviousEmailAddress LIKE '%kala%' 
+2

Опубликуйте свой фактический план выполнения, и мы сможем увидеть, что уделило время. –

+2

'WHERE t.vch_PreviousEmailAddress Like '% kala%'' ** [Условие, отличное от SARGable] (http://stackoverflow.com/a/799604/5070879) ** – lad2025

ответ

1

Изменить параметры сортировки для vch_PreviousEmailAddress колонки на Latin1_General_100_BIN2

Создать крытую индекс:

CREATE NONCLUSTERED INDEX ix 
ON dbo.tblEmailTransaction (vch_PreviousEmailAddress) 
    INCLUDE (i_UserID, d_TransactionDate) 
GO 

И весело с этим запросом:

SELECT t.i_UserID, 
     u.vch_LoginName, 
     t.vch_PreviousEmailAddress AS vch_EmailAddress, 
     u.vch_DisplayName, 
     t.d_TransactionDate AS d_DateAdded, 
     'Old' AS vch_RecordStatus 
FROM (
    SELECT DISTINCT i_UserID, 
        vch_PreviousEmailAddress, 
        d_TransactionDate 
    FROM dbo.tblEmailTransaction 
    WHERE vch_PreviousEmailAddress LIKE '%kala%' COLLATE Latin1_General_100_BIN2 
) t 
JOIN dbo.tblUser u ON t.i_UserID = u.i_UserID 
0

Еще одна вещь, которую я нахожу полезно для решения таких проблем:

Попробуйте выполнить следующий скрипт. Он расскажет вам, какие индексы вы могли бы запросить в своей базе данных SQL Server, что сделало бы наиболее (положительное) улучшение.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT TOP 100 
    ROUND(s.avg_total_user_cost * s.avg_user_impact * (s.user_seeks + s.user_scans),0) AS 'Total Cost', 
    s.avg_user_impact, 
    d.statement AS 'Table name', 
    d.equality_columns, 
    d.inequality_columns, 
    d.included_columns, 
    'CREATE INDEX [IndexName] ON ' + d.statement + ' (' 
    + case when (d.equality_columns IS NULL OR d.inequality_columns IS NULL) 
     then ISNULL(d.equality_columns, '') + ISNULL(d.inequality_columns, '') 
     else ISNULL(d.equality_columns, '') + ', ' + ISNULL(d.inequality_columns, '') 
    end + ') ' 
    + CASE WHEN d.included_columns IS NULL THEN '' ELSE 'INCLUDE (' + d.included_columns + ')' end AS 'CREATE INDEX command' 
FROM sys.dm_db_missing_index_groups g, 
    sys.dm_db_missing_index_group_stats s, 
    sys.dm_db_missing_index_details d 
WHERE d.database_id = DB_ID() 
AND s.group_handle = g.index_group_handle 
AND d.index_handle = g.index_handle 
ORDER BY [Total Cost] DESC 

колонка правая отображает команду INDEX, которые вы должны выполнить, чтобы создать этот индекс CREATE.

Missing indexes

Это один из тех спасатель сценариев, которые я бегу на наших базах в доме когда-либо так часто.

Но да, в вашем примере это, скорее всего, скажет вам, что вам нужен индекс в поле vch_PreviousEmailAddress в вашей таблице tblEmailTransaction.

0

Вероятные узкий являются 2:

  1. Отсутствует индекс на tblEmailTransaction.i_UserID: Проверьте, если таблица имеет индекс
  2. отсутствующий индекс на tblUser.i_UserID: Проверьте, если таблица имеет индекс
  3. Как себе: Как утверждение знать, чтобы быть не хорошо в работе, как это было предложено Devart, попробуйте указать коллекцию таким образом:

    WHERE vch_PreviousEmailAddress LIKE '%kala%' COLLATE Latin1_General_100_BIN2 
    

Чтобы иметь лучшее представление о вашем запросе, Вы должны выполнить эту команду с запросом:

SET IO STATISTICS ON 

Он будет писать все IO Access, что запрос делает и мы можем увидеть, что произойдет.

Только последний вопрос? Сколько строк содержит две таблицы?

Ciao

Смежные вопросы