Вот моя схема таблицы
[dbo].[Action_History](
[ActionID] [int] IDENTITY(1,1) NOT NULL,
[objectID] [int] NOT NULL,
[object_mask] [varchar](max) NULL,
[description] [varchar](max) NOT NULL,
[action_by] [nchar](7) NOT NULL,
[action_date] [datetime] NOT NULL,
[response_required] [bit] NOT NULL,
[responded_date] [datetime] NULL,
[responded_by] [nchar](7) NULL,
[recurring] [bit] NULL CONSTRAINT [DF_Action_History_recurring] DEFAULT ((0)),
[actionTypeID] [int] NULL,
[target_user] [nchar](7) NULL,
[target_role] [varchar](25) NULL,
[object_type] [varchar](30) NULL, CONSTRAINT [PK_Action_History] PRIMARY KEY CLUSTERED
Вот запрос 1:
SELECT
Top(1)
ActionID, objectID, object_mask,
[description], action_by, action_date, response_required,
responded_date, responded_by, recurring, actionTypeID,
target_user, target_role, object_type
FROM
Action_History
WHERE
((objectID = 201006)
AND (responded_date is null)
AND (object_type = 'MyType'))
и Запрос 2:
SELECT
Top(1)
ActionID, objectID, object_mask,
[description], action_by, action_date, response_required,
responded_date, responded_by, recurring, actionTypeID,
target_user, target_role, object_type
FROM
Action_History
WHERE
((objectID = 201006)
AND (responded_date is null)
AND (object_type = 'Mytype')
AND (actionTypeID = 55)
AND (response_required = 1))
Запрос 1 будет загружен через 0 секундОднако запрос 2 не может вернуть результаты.Любое из этих двух последних и условных выражений в предложении where приведет к зависанию запроса.Кроме того, если у меня есть только 2-5 условных выражений (без objectID), кажется, что они работают так же быстро.
Мне нужен запрос два для работы со всеми условиями.Есть идеи?
Спасибо,
~ P
Редактировать: похоже, что второй запрос зависает, если objectID не существует, но если онзагружается ли он без проблем.
Редактировать 2: У меня есть один индекс для actionID, который, как я знаю, не очень полезен в этом случае.У меня также нет возможности в настоящий момент создавать какие-либо другие индексы (причинили им слишком высокий уровень защиты БД).
Я довольно ужасен в вещах БД - но когда я нахожу курсор на Кластерный индексСканирование из "Отображаемого оценочного плана выполнения" для двух разных запросов, которые я вижу, - это немного другой предикат, который выглядит идентично моему моему предикату - вероятно, не правильный план выполнения ...
Редактировать 3: План выполнения - они похожи, за исключением 2, где отсутствуют условные выражения.Кроме того, кажется, что мой второй запрос выполняется в одно мгновение, если есть результат.Если результата нет, он выполняется вечно (есть запись с одинаковыми значениями, за исключением того, что objectid - 201002, а не 201006).Кроме того, мы говорим меньше, чем о 4K-записях.
|--Top(TOP EXPRESSION:((1)))
|--Clustered Index Scan(OBJECT:([db].[dbo].[Action_History].[PK_Action_History]),
WHERE:([db].[dbo].[Action_History].[objectID]=(201002) AND
[db].[dbo].[Action_History].[responded_date] IS NULL AND
[db].[dbo].[Action_History].[actionTypeID]=(55) AND
[db].[dbo].[Action_History].[response_required]=(1) AND
[db].[dbo].[Action_History].[object_type]='MyType'))
Edit 4: Похоже, что мой второй запрос в нашей второй базе данных (с записью 51K) работает просто отлично.Я понятия не имею, какая разница между двумя базами данных, есть ли мысли о том, как я могу это выяснить?