Мое самое большое схватывание с автосвойствами - то, что они разработаны, чтобы сэкономить время, но я часто нахожу, что должен развернуть их в полноценные свойства позже.
то, Что пропускает VS2008, , Взрываются, Автосвойство осуществляют рефакторинг.
факт мы имеем , инкапсулируют поле , осуществляют рефакторинг, пробивается, я работаю более быстрый, чтобы просто использовать общедоступные поля.
Я не ищу совета по поводу того, какие индексы создавать и т.п., я просто пытаюсь понять, почему план запроса и его выполнение так различаются для трех, казалось бы, похожих запросов.
Похоже, у вас есть два индекса:
IX_NonCluster_Config (ProductID, ServerTime)
IX_NonCluster_ProductID_CookieID_With_ServerTime (ProductID, CookieID) INCLUDE (ServerTime)
Первый индекс не охватывает CookieID
, но упорядочен на ServerTime
и, следовательно, более эффективен для менее выборочного ProductID
(то есть те, которых у вас много)
Второй индекс охватывает все столбцы, но не упорядочен, и, следовательно, более эффективен для более выборочного ProductID
(тех, которых у вас мало).
В среднем ваша мощность ProductID
такова, что SQL Server
ожидает, что второй метод будет эффективным,это то, что он использует, когда вы используете параметризованные запросы или явно предоставляете выборочные GUID
.
Однако ваш исходный GUID
считается менее избирательным, поэтому используется первый метод .
К сожалению, первый метод требует дополнительной фильтрации по CookieID
, поэтому на самом деле он менее эффективен.
Я предполагаю, что когда вы выбираете непараматеризованный маршрут, ваш guid должен быть преобразован из varchar в UniqueIdentifier, что может привести к тому, что индекс не будет использоваться, в то время как он будет использоваться с параметризованный маршрут.
Я видел, как это происходило с использованием запросов, которые имеют smalldatetime в предложении where к столбцу, который использует datetime.
Это сложно чтобы сказать, не глядя на планы выполнения , однако, если бы я собирался угадать причину, я бы сказал, что это комбинация анализа параметров и плохой статистики - в случае, когда вы жестко закодируете GUID в запросе , оптимизатор запросов пытается оптимизировать запрос для этого значения параметра. Я считаю, что то же самое происходит с параметризованным / подготовленным запросом (это называется анализом параметров - план выполнения оптимизирован для параметров, используемых при первом выполнении подготовленного оператора), однако этого определенно не происходит, когда вы объявляете параметр и используйте его в запросе.
Как я уже сказал, SQL-сервер пытается оптимизировать план выполнения для этого значения, поэтому обычно вы должны увидеть лучшие результаты. Здесь кажется, что информация, на которой он основывает свои решения, неверна / вводит в заблуждение, и вам будет лучше (по какой-то причине), когда он оптимизирует запрос для общего значения параметра.
Однако это в основном предположения - его невозможно скажите на самом деле без исполнения - если вы можете загрузить куда-нибудь план казни, то я уверен, что кто-то сможет помочь вам с истинной причиной.
Если вы укажете явное значение, SQL Server может использовать статистику этого поля, чтобы принять «лучшее» решение по плану запроса. К сожалению (как я недавно убедился), если информация, содержащаяся в статистике, вводит в заблуждение, иногда SQL Server просто делает неправильный выбор.
Если вы хотите глубже изучить эту проблему, я рекомендую вам проверить, что происходит если вы используете другие идентификаторы GUID: если он использует другой план запроса для разных конкретных идентификаторов GUID, это означает, что используются статистические данные. В этом случае вам может потребоваться sp_updatestats
и связанные команды.
РЕДАКТИРОВАТЬ : взглянуть на DBCC SHOW_STATISTICS : «Медленный» и «быстрый» "GUID, вероятно, находятся в разных сегментах гистограммы. Я' У ve была аналогичная проблема , которую я решил, добавив табличную подсказку INDEX
к SQL, которая «направляет» SQL Server к поиску «правильного» плана запроса. По сути, я посмотрел, какие индексы используются во время «быстрого» запроса, и жестко запрограммировал их в SQL. Это далеко не оптимальное или элегантное решение, но я пока не нашел лучшего ...