SQL Server 2005, кажется, берет навсегда с определенным стандартом, где пункты - PullRequest
0 голосов
/ 19 августа 2010

Вот моя схема таблицы

[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) работает просто отлично.Я понятия не имею, какая разница между двумя базами данных, есть ли мысли о том, как я могу это выяснить?

Ответы [ 4 ]

1 голос
/ 19 августа 2010

Включите отображение плана выполнения и проверьте, предлагает ли студия управления что-либо. Создайте индекс по этим столбцам.

Если это не поможет, создайте оператор CREATE TABLE и опубликуйте его здесь, чтобы проверить типы данных и индексы.

1 голос
/ 19 августа 2010

есть ли у вас индексы для actionTypeID и response_required? Сравните планы выполнения между двумя запросами

Чтобы увидеть текстовую версию плана выполнения, перед запросом выполните следующую команду:

SET SHOWPLAN_TEXT ON
GO

чтобы выключить его позже, запустите

SET SHOWPLAN_TEXT OFF
GO
0 голосов
/ 20 августа 2010

Оказывается, одна или несколько строк были повреждены, поэтому, когда база данных сканировалась в эти строки, она замерзала / зацикливалась, или что-то в этом роде.Спасибо всем за помощь.

0 голосов
/ 19 августа 2010

Добавьте индексы для любых полей, которые вы хотите использовать для критериев в предложении WHERE, сортировке или связях с другими таблицами.

Кроме того, попробуйте без верха (1). Вы можете сортировать, если вам нужен только первый результат, но он может скрывать ошибки в вашем запросе, если это ограничивает ваши результаты до 1 строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...