Выборка из indexes view не использует индекс

denis_8158
Дата: 23.02.2010 12:17:49
Всем привет!

Кто может подсказать почему выборка из indexes view не использует, созданный на этот view, кластерный индекс?

индекс
create unique clustered index IDX_TaxPayersDiffVersions_view ON TaxPayersDiffVersions_view(tpId, toId)

Сам запрос
select top 1 tpId from TaxPayersDiffVersions_view 

Запрос выполняется более 10 минут

План запроса
  |--Top(TOP EXPRESSION:((1)))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([tp].[personId], [us].[confVersion], [Expr1009]) OPTIMIZED WITH UNORDERED PREFETCH)
            |--Nested Loops(Inner Join, OUTER REFERENCES:([us].[tpId], [Expr1008]) OPTIMIZED WITH UNORDERED PREFETCH)
            |    |--Nested Loops(Inner Join, OUTER REFERENCES:([us].[toId]))
            |    |    |--Clustered Index Scan(OBJECT:([INISRK].[dbo].[TPUsage].[UQ__TPUsage__756D6ECB] AS [us]), WHERE:([INISRK].[dbo].[TPUsage].[toId] as [us].[toId]<>0x006500000001))
            |    |    |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[TaxOrgs].[PK__TaxOrgs__1367E606] AS [toav]), SEEK:([toav].[id]=[INISRK].[dbo].[TPUsage].[toId] as [us].[toId]),  WHERE:([INISRK].[dbo].[TaxOrgs].[isClosed] as [toav].[isClosed]=(0)) ORDERED FORWARD)
            |    |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[TaxPayers].[PK__TaxPayers__69FBBC1F] AS [tp]), SEEK:([tp].[id]=[INISRK].[dbo].[TPUsage].[tpId] as [us].[tpId]) ORDERED FORWARD)
            |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[Persons].[PK_Persons_id] AS [p]), SEEK:([p].[id]=[INISRK].[dbo].[TaxPayers].[personId] as [tp].[personId]),  WHERE:([INISRK].[dbo].[Persons].[version] as [p].[version]<>[INISRK].[dbo].[TPUsage].[confVersion] as [us].[confVersion]) ORDERED FORWARD)
Причем совершенно не понятно, почему он выбираем слияние через Nested Loops, когда в таблице больше 28 000 000 записей...


Но самое интересное, что если запрос поменять на следующий

select top 1 tpId from TaxPayersDiffVersions_view order by lastsend

План становится великолепным
  |--Top(TOP EXPRESSION:((1)))
       |--Sort(ORDER BY:([INISRK].[dbo].[TaxPayersDiffVersions_view].[lastSend] ASC))
            |--Clustered Index Scan(OBJECT:([INISRK].[dbo].[TaxPayersDiffVersions_view].[IDX_TaxPayersDiffVersions_view]))

Второй запрос выполняется несколько миллисекунд.

Такая же проблема и с запросом where tpId = xxx, казалось бы можно выполнить одну операцию seek из view, а он все равно лезет в остальные таблицы.

Так как же заставить все запросы выполняться из indexes view, а не с оригинальных таблиц?
Glory
Дата: 23.02.2010 12:19:59
denis_8158
Всем привет!

Кто может подсказать почему выборка из indexes view не использует, созданный на этот view, кластерный индекс?

Приведите select @@version для начала
denis_8158
Дата: 23.02.2010 12:21:16
Glory, извиняюсь.

Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86)
Feb 9 2007 22:47:07
Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition on Windows NT 6.0 (Build 6002: Service Pack 2)
Glory
Дата: 23.02.2010 12:22:28
select top 1 tpId from TaxPayersDiffVersions_view - это вы хотите любую случайную запись выбрать что ли ?
denis_8158
Дата: 23.02.2010 12:25:06
Glory,

Режим представляет собой синхронизацию данных между уровнями, view представляет собой сведения о расхождениях между узлами системы, соответственно алгоритм режима следующий:
берем одну запись из таблицы
запускаем синхронизацию записи
вызываем асинхронно себя же
Glory
Дата: 23.02.2010 12:27:00
denis_8158
Glory,

Режим представляет собой синхронизацию данных между уровнями, view представляет собой сведения о расхождениях между узлами системы, соответственно алгоритм режима следующий:
берем одну запись из таблицы
запускаем синхронизацию записи
вызываем асинхронно себя же

Как все это относится к логике запроса с top но без order by ?
denis_8158
Дата: 23.02.2010 12:27:39
Вот чуть другой пример

select tpid from TaxPayersDiffVersions_view  where tpId = 0x006500000001


  |--Nested Loops(Inner Join, WHERE:([INISRK].[dbo].[PMSysConf].[vBinary] as [pms].[vBinary]<>[INISRK].[dbo].[TPUsage].[toId] as [us].[toId]))
       |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[PMSysConf].[PK__PMSysConf__117F9D94] AS [pms]), SEEK:([pms].[config]=(1)) ORDERED FORWARD)
       |--Hash Match(Inner Join, HASH:([us].[toId])=([toav].[id]), RESIDUAL:([INISRK].[dbo].[TaxOrgs].[id] as [toav].[id]=[INISRK].[dbo].[TPUsage].[toId] as [us].[toId] AND [INISRK].[dbo].[Persons].[version] as [p].[version]<>[INISRK].[dbo].[TPUsage].[confVersion] as [us].[confVersion]))
            |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[TPUsage].[UQ__TPUsage__756D6ECB] AS [us]), SEEK:([us].[tpId]=0x006500000001) ORDERED FORWARD)
            |--Nested Loops(Inner Join)
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([tp].[personId]))
                 |    |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[TaxPayers].[PK__TaxPayers__69FBBC1F] AS [tp]), SEEK:([tp].[id]=0x006500000001) ORDERED FORWARD)
                 |    |--Clustered Index Seek(OBJECT:([INISRK].[dbo].[Persons].[PK_Persons_id] AS [p]), SEEK:([p].[id]=[INISRK].[dbo].[TaxPayers].[personId] as [tp].[personId]) ORDERED FORWARD)
                 |--Clustered Index Scan(OBJECT:([INISRK].[dbo].[TaxOrgs].[PK__TaxOrgs__1367E606] AS [toav]), WHERE:([INISRK].[dbo].[TaxOrgs].[isClosed] as [toav].[isClosed]=(0)))

Glory
Дата: 23.02.2010 12:29:08
denis_8158
Вот чуть другой пример


Поле tpid какого типа ?
denis_8158
Дата: 23.02.2010 12:29:32
Glory
Как все это относится к логике запроса с top но без order by ?


после синхронизации запись не попадает под это условие
[p].[version]<>[INISRK].[dbo].[TPUsage].[confVersion] as [us].[confVersion]
denis_8158
Дата: 23.02.2010 12:30:20
Glory
Поле tpid какого типа ?


binary(6) - наш уникальный идентификатор записи.