Различия в плане запросов SQL Server

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

то, Что пропускает VS2008, , Взрываются, Автосвойство осуществляют рефакторинг.

факт мы имеем , инкапсулируют поле , осуществляют рефакторинг, пробивается, я работаю более быстрый, чтобы просто использовать общедоступные поля.

6
задан Community 23 May 2017 в 12:01
поделиться

4 ответа

Я не ищу совета по поводу того, какие индексы создавать и т.п., я просто пытаюсь понять, почему план запроса и его выполнение так различаются для трех, казалось бы, похожих запросов.

Похоже, у вас есть два индекса:

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 , поэтому на самом деле он менее эффективен.

2
ответ дан 17 December 2019 в 02:30
поделиться

Я предполагаю, что когда вы выбираете непараматеризованный маршрут, ваш guid должен быть преобразован из varchar в UniqueIdentifier, что может привести к тому, что индекс не будет использоваться, в то время как он будет использоваться с параметризованный маршрут.

Я видел, как это происходило с использованием запросов, которые имеют smalldatetime в предложении where к столбцу, который использует datetime.

1
ответ дан 17 December 2019 в 02:30
поделиться

Это сложно чтобы сказать, не глядя на планы выполнения , однако, если бы я собирался угадать причину, я бы сказал, что это комбинация анализа параметров и плохой статистики - в случае, когда вы жестко закодируете GUID в запросе , оптимизатор запросов пытается оптимизировать запрос для этого значения параметра. Я считаю, что то же самое происходит с параметризованным / подготовленным запросом (это называется анализом параметров - план выполнения оптимизирован для параметров, используемых при первом выполнении подготовленного оператора), однако этого определенно не происходит, когда вы объявляете параметр и используйте его в запросе.

Как я уже сказал, SQL-сервер пытается оптимизировать план выполнения для этого значения, поэтому обычно вы должны увидеть лучшие результаты. Здесь кажется, что информация, на которой он основывает свои решения, неверна / вводит в заблуждение, и вам будет лучше (по какой-то причине), когда он оптимизирует запрос для общего значения параметра.

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

0
ответ дан 17 December 2019 в 02:30
поделиться

Если вы укажете явное значение, SQL Server может использовать статистику этого поля, чтобы принять «лучшее» решение по плану запроса. К сожалению (как я недавно убедился), если информация, содержащаяся в статистике, вводит в заблуждение, иногда SQL Server просто делает неправильный выбор.

Если вы хотите глубже изучить эту проблему, я рекомендую вам проверить, что происходит если вы используете другие идентификаторы GUID: если он использует другой план запроса для разных конкретных идентификаторов GUID, это означает, что используются статистические данные. В этом случае вам может потребоваться sp_updatestats и связанные команды.

РЕДАКТИРОВАТЬ : взглянуть на DBCC SHOW_STATISTICS : «Медленный» и «быстрый» "GUID, вероятно, находятся в разных сегментах гистограммы. Я' У ve была аналогичная проблема , которую я решил, добавив табличную подсказку INDEX к SQL, которая «направляет» SQL Server к поиску «правильного» плана запроса. По сути, я посмотрел, какие индексы используются во время «быстрого» запроса, и жестко запрограммировал их в SQL. Это далеко не оптимальное или элегантное решение, но я пока не нашел лучшего ...

3
ответ дан 17 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: