Оптимизация производительности выполнения запросов (SQL Server Compact). Оптимизация ms sql запросов


Оптимизация производительности выполнения запросов (SQL Server Compact)

Создание эффективных индексов является одним из наиболее действенных способов повышения производительности при обработке запросов. Применение эффективных индексов помогает находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов.

Чтобы создавать эффективные индексы, необходимо знать методику использования данных, типы запросов и частоту их исполнения, а также понимать, каким образом обработчик запросов использует индексы для ускорения поиска данных.

Чтобы принять правильное решение о создании индексов, следует проанализировать важные запросы, исполнение которых оказывает наибольшее влияние на производительность, с целью создания индексов, ускоряющих выполнение именно этих запросов. После создания индекса необходимо выполнить запрос снова и оценить изменение производительности. Если производительность не повысилась, индекс следует удалить.

Как и большинство других методов оптимизации, данный метод не лишен недостатков. Например, увеличение количества индексов может ускорить выполнение запросов, содержащих команду SELECT. Однако команды управления данными (INSERT, UPDATE и DELETE) будут выполняться при этом значительно медленнее, поскольку при каждой операции необходимо будет изменять большее число индексов. Поэтому в тех случаях, когда большая часть запросов содержит инструкцию SELECT, создание дополнительных индексов может повысить скорость обработки запросов. Однако, если приложение выполняет большое количество операций по управлению данными, количество индексов не следует увеличивать без необходимости.

SQL Server Compact 3.5 поддерживает класс событий showplan, помогающий оценивать и оптимизировать запросы. SQL Server Compact 3.5 использует ту же схему класса showplan, что и SQL Server 2008 R2, но поддерживает SQL Server Compact 3.5 не все операторы. Дополнительные сведения о схеме Microsoft Showplan Schema см. по адресу http://schemas.microsoft.com/sqlserver/2004/07/showplan/.

Следующие несколько разделов содержат дополнительные сведения о создании эффективных индексов.

Создание индексов с высокой избирательностью

В большинстве случаев индексирование по столбцам, используемым в предложениях WHERE важных запросов, повышает производительность при обработке таких запросов. Однако в действительности это определяется степенью избирательности индекса. Избирательность представляет собой отношение количества выбранных строк к общему количеству строк. Если это отношение мало, значит, индекс обладает высокой избирательностью. Он позволяет отбросить большую часть строк и значительно уменьшает размер результирующего набора. Подобный индекс является эффективным. Индекс, не обладающий избирательностью, не является эффективным.

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

Чтобы определить избирательность индекса, следует выполнить для таблиц SQL Server Compact 3.5 хранимую процедуру sp_show_statistics. Например, чтобы оценить избирательность столбцов Customer ID и Ship Via, можно выполнить следующие хранимые процедуры.

sp_show_statistics_steps 'orders', 'customer id';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

ALFKI               0            7                   0

ANATR               0            4                   0

ANTON               0           13                   0

AROUT               0           14                   0

BERGS               0           23                   0

BLAUS               0            8                   0

BLONP               0           14                   0

BOLID               0            7                   0

BONAP               0           19                   0

BOTTM               0           20                   0

BSBEV               0           12                   0

CACTU               0            6                   0

CENTC               0            3                   0

CHOPS               0           12                   0

COMMI               0            5                   0

CONSH               0            4                   0

DRACD               0            9                   0

DUMON               0            8                   0

EASTC               0           13                   0

ERNSH               0           33                   0

(90 rows affected)

и

sp_show_statistics_steps 'orders', 'reference3';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

1               0            320                   0

2               0            425                   0

3               0            333                   0

(3 rows affected)

Результаты показывают, что столбец Customer ID имеет значительно более низкую степень повторяемости. Это означает, что индекс по данному столбцу будет иметь большую избирательность, чем индекс по столбцу Ship Via.

Дополнительные сведения об использовании этих хранимых процедур см. в разделах sp_show_statistics (SQL Server Compact 3.5), sp_show_statistics_steps (SQL Server Compact 3.5) и sp_show_statistics_columns (SQL Server Compact).

Создание многостолбцовых индексов

Многостолбцовые индексы являются дальнейшим развитием одностолбцовых индексов. Они используются для вычисления критериев фильтра, соответствующих набору префиксов ключевых столбцов. Например, комбинированный индекс CREATE INDEX Idx_Emp_Name ON Employees ("Last Name" ASC, "First Name" ASC) помогает исполнять следующие запросы.

Однако при исполнении следующего запроса этот индекс не поможет.

При создании многостолбцового индекса столбцы с наибольшей избирательностью должны находиться как можно ближе к левому краю ключа. Это позволяет повысить избирательность подобного индекса при обработке нескольких выражений.

Отказ от индексирования небольших таблиц

Небольшая таблица — это таблица, содержимое которой полностью помещается на одной странице данных (или на небольшом количестве страниц). Следует избегать индексирования небольших таблиц, поскольку, как правило, для таких таблиц более эффективно применять просмотр. Это уменьшает затраты на загрузку и обработку страниц индексов. Отказ от создания индексов для совсем небольших таблиц исключает возможность выбора соответствующего индекса оптимизатором.

SQL Server Compact 3.5 хранит данные на страницах размером по 4 КБ. Количество страниц можно приблизительно оценить по следующей формуле (фактическое число страниц может быть несколько больше, поскольку ядро хранилища данных использует дополнительные ресурсы).

<суммарный размер столбцов в байтах> * <число строк>

<число страниц> = -----------------------------------------------------------------

4096

Предположим, что таблица имеет следующую структуру.

Имя столбца

Тип (размер)

Order ID

INTEGER (4 байта)

Product ID

INTEGER (4 байта)

Цена единицы

MONEY (8 байт)

Количество

SMALLINT (2 байта)

Скидка

REAL (4 байта)

В таблице 2820 строк. В соответствии с формулой, для хранения данных этой таблицы необходимо приблизительно 16 страниц:

<число страниц> = ((4 + 4 + 8 + 2 + 4) * 2820) / 4096 = 15,15 страниц

msdn.microsoft.com

Оптимизация производительности выполнения запросов (SQL Server Compact)

Создание эффективных индексов является одним из наиболее действенных способов повышения производительности при обработке запросов. Применение эффективных индексов помогает находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов.

Чтобы создавать эффективные индексы, необходимо знать методику использования данных, типы запросов и частоту их исполнения, а также понимать, каким образом обработчик запросов использует индексы для ускорения поиска данных.

Чтобы принять правильное решение о создании индексов, следует проанализировать важные запросы, исполнение которых оказывает наибольшее влияние на производительность, с целью создания индексов, ускоряющих выполнение именно этих запросов. После создания индекса необходимо выполнить запрос снова и оценить изменение производительности. Если производительность не повысилась, индекс следует удалить.

Как и большинство других методов оптимизации, данный метод не лишен недостатков. Например, увеличение количества индексов может ускорить выполнение запросов, содержащих команду SELECT. Однако команды управления данными (INSERT, UPDATE и DELETE) будут выполняться при этом значительно медленнее, поскольку при каждой операции необходимо будет изменять большее число индексов. Поэтому в тех случаях, когда большая часть запросов содержит инструкцию SELECT, создание дополнительных индексов может повысить скорость обработки запросов. Однако, если приложение выполняет большое количество операций по управлению данными, количество индексов не следует увеличивать без необходимости.

SQL Server Compact поддерживает класс событий showplan, помогающий оценивать и оптимизировать запросы. SQL Server Compact использует ту же схему класса showplan, что и SQL Server 2008 R2, но поддерживает SQL Server Compact не все операторы. Дополнительные сведения о схеме Microsoft Showplan Schema см. по адресу http://schemas.microsoft.com/sqlserver/2004/07/showplan/.

Следующие несколько разделов содержат дополнительные сведения о создании эффективных индексов.

Создание индексов с высокой избирательностью

В большинстве случаев индексирование по столбцам, используемым в предложениях WHERE важных запросов, повышает производительность при обработке таких запросов. Однако в действительности это определяется степенью избирательности индекса. Избирательность представляет собой отношение количества выбранных строк к общему количеству строк. Если это отношение мало, значит, индекс обладает высокой избирательностью. Он позволяет отбросить большую часть строк и значительно уменьшает размер результирующего набора. Подобный индекс является эффективным. Индекс, не обладающий избирательностью, не является эффективным.

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

Чтобы определить избирательность индекса, следует выполнить для таблиц SQL Server Compact хранимую процедуру sp_show_statistics. Например, чтобы оценить избирательность столбцов Customer ID и Ship Via, можно выполнить следующие хранимые процедуры.

sp_show_statistics_steps 'orders', 'customer id';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

ALFKI               0            7                   0

ANATR               0            4                   0

ANTON               0           13                   0

AROUT               0           14                   0

BERGS               0           23                   0

BLAUS               0            8                   0

BLONP               0           14                   0

BOLID               0            7                   0

BONAP               0           19                   0

BOTTM               0           20                   0

BSBEV               0           12                   0

CACTU               0            6                   0

CENTC               0            3                   0

CHOPS               0           12                   0

COMMI               0            5                   0

CONSH               0            4                   0

DRACD               0            9                   0

DUMON               0            8                   0

EASTC               0           13                   0

ERNSH               0           33                   0

(90 rows affected)

и

sp_show_statistics_steps 'orders', 'reference3';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

1               0            320                   0

2               0            425                   0

3               0            333                   0

(3 rows affected)

Результаты показывают, что столбец Customer ID имеет значительно более низкую степень повторяемости. Это означает, что индекс по данному столбцу будет иметь большую избирательность, чем индекс по столбцу Ship Via.

Дополнительные сведения об использовании этих хранимых процедур см. в разделах sp_show_statistics (SQL Server Compact 3.5), sp_show_statistics_steps (SQL Server Compact 3.5) и sp_show_statistics_columns (SQL Server Compact).

Создание многостолбцовых индексов

Многостолбцовые индексы являются дальнейшим развитием одностолбцовых индексов. Они используются для вычисления критериев фильтра, соответствующих набору префиксов ключевых столбцов. Например, комбинированный индекс CREATE INDEX Idx_Emp_Name ON Employees ("Last Name" ASC, "First Name" ASC) помогает исполнять следующие запросы.

Однако при исполнении следующего запроса этот индекс не поможет.

При создании многостолбцового индекса столбцы с наибольшей избирательностью должны находиться как можно ближе к левому краю ключа. Это позволяет повысить избирательность подобного индекса при обработке нескольких выражений.

Отказ от индексирования небольших таблиц

Небольшая таблица — это таблица, содержимое которой полностью помещается на одной странице данных (или на небольшом количестве страниц). Следует избегать индексирования небольших таблиц, поскольку, как правило, для таких таблиц более эффективно применять просмотр. Это уменьшает затраты на загрузку и обработку страниц индексов. Отказ от создания индексов для совсем небольших таблиц исключает возможность выбора соответствующего индекса оптимизатором.

SQL Server Compact хранит данные на страницах размером по 4 КБ. Количество страниц можно приблизительно оценить по следующей формуле (фактическое число страниц может быть несколько больше, поскольку ядро хранилища данных использует дополнительные ресурсы).

<суммарный размер столбцов в байтах> * <число строк>

<число страниц> = -----------------------------------------------------------------

4096

Предположим, что таблица имеет следующую структуру.

Имя столбца

Тип (размер)

Order ID

INTEGER (4 байта)

Product ID

INTEGER (4 байта)

Цена единицы

MONEY (8 байт)

Количество

SMALLINT (2 байта)

Скидка

REAL (4 байта)

В таблице 2820 строк. В соответствии с формулой, для хранения данных этой таблицы необходимо приблизительно 16 страниц:

<число страниц> = ((4 + 4 + 8 + 2 + 4) * 2820) / 4096 = 15,15 страниц

msdn.microsoft.com

Оптимизация производительности выполнения запросов (SQL Server Compact)

Создание эффективных индексов является одним из наиболее действенных способов повышения производительности при обработке запросов. Применение эффективных индексов помогает находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов.

Чтобы создавать эффективные индексы, необходимо знать методику использования данных, типы запросов и частоту их исполнения, а также понимать, каким образом обработчик запросов использует индексы для ускорения поиска данных.

Чтобы принять правильное решение о создании индексов, следует проанализировать важные запросы, исполнение которых оказывает наибольшее влияние на производительность, с целью создания индексов, ускоряющих выполнение именно этих запросов. После создания индекса необходимо выполнить запрос снова и оценить изменение производительности. Если производительность не повысилась, индекс следует удалить.

Как и большинство других методов оптимизации, данный метод не лишен недостатков. Например, увеличение количества индексов может ускорить выполнение запросов, содержащих команду SELECT. Однако команды управления данными (INSERT, UPDATE и DELETE) будут выполняться при этом значительно медленнее, поскольку при каждой операции необходимо будет изменять большее число индексов. Поэтому в тех случаях, когда большая часть запросов содержит инструкцию SELECT, создание дополнительных индексов может повысить скорость обработки запросов. Однако, если приложение выполняет большое количество операций по управлению данными, количество индексов не следует увеличивать без необходимости.

SQL Server Compact 3.5 поддерживает класс событий showplan, помогающий оценивать и оптимизировать запросы. SQL Server Compact 3.5 использует ту же схему класса showplan, что и SQL Server 2008, но поддерживает SQL Server Compact 3.5 не все операторы. Дополнительные сведения о схеме Microsoft Showplan Schema см. по адресу http://schemas.microsoft.com/sqlserver/2004/07/showplan/.

Следующие несколько разделов содержат дополнительные сведения о создании эффективных индексов.

Создание индексов с высокой избирательностью

В большинстве случаев индексирование по столбцам, используемым в предложениях WHERE важных запросов, повышает производительность при обработке таких запросов. Однако в действительности это определяется степенью избирательности индекса. Избирательность представляет собой отношение количества выбранных строк к общему количеству строк. Если это отношение мало, значит, индекс обладает высокой избирательностью. Он позволяет отбросить большую часть строк и значительно уменьшает размер результирующего набора. Подобный индекс является эффективным. Индекс, не обладающий избирательностью, не является эффективным.

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

Чтобы определить избирательность индекса, следует выполнить для таблиц SQL Server Compact 3.5 хранимую процедуру sp_show_statistics. Например, чтобы оценить избирательность столбцов Customer ID и Ship Via, можно выполнить следующие хранимые процедуры.

sp_show_statistics_steps 'orders', 'customer id';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

ALFKI 0 7 0

ANATR 0 4 0

ANTON 0 13 0

AROUT 0 14 0

BERGS 0 23 0

BLAUS 0 8 0

BLONP 0 14 0

BOLID 0 7 0

BONAP 0 19 0

BOTTM 0 20 0

BSBEV 0 12 0

CACTU 0 6 0

CENTC 0 3 0

CHOPS 0 12 0

COMMI 0 5 0

CONSH 0 4 0

DRACD 0 9 0

DUMON 0 8 0

EASTC 0 13 0

ERNSH 0 33 0

(90 rows affected)

и

sp_show_statistics_steps 'orders', 'reference3';

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS

------------------------------------------------------------

1 0 320 0

2 0 425 0

3 0 333 0

(3 rows affected)

Результаты показывают, что столбец Customer ID имеет значительно более низкую степень повторяемости. Это означает, что индекс по данному столбцу будет иметь большую избирательность, чем индекс по столбцу Ship Via.

Дополнительные сведения об использовании этих хранимых процедур см. в разделах sp_show_statistics (SQL Server Compact 3.5), sp_show_statistics_steps (SQL Server Compact 3.5) и sp_show_statistics_columns (SQL Server Compact).

Создание многостолбцовых индексов

Многостолбцовые индексы являются дальнейшим развитием одностолбцовых индексов. Они используются для вычисления критериев фильтра, соответствующих набору префиксов ключевых столбцов. Например, комбинированный индекс CREATE INDEX Idx_Emp_Name ON Employees ("Last Name" ASC, "First Name" ASC) помогает исполнять следующие запросы.

Однако при исполнении следующего запроса этот индекс не поможет.

При создании многостолбцового индекса столбцы с наибольшей избирательностью должны находиться как можно ближе к левому краю ключа. Это позволяет повысить избирательность подобного индекса при обработке нескольких выражений.

Отказ от индексирования небольших таблиц

Небольшая таблица — это таблица, содержимое которой полностью помещается на одной странице данных (или на небольшом количестве страниц). Следует избегать индексирования небольших таблиц, поскольку, как правило, для таких таблиц более эффективно применять просмотр. Это уменьшает затраты на загрузку и обработку страниц индексов. Отказ от создания индексов для совсем небольших таблиц исключает возможность выбора соответствующего индекса оптимизатором.

SQL Server Compact 3.5 хранит данные на страницах размером по 4 КБ. Количество страниц можно приблизительно оценить по следующей формуле (фактическое число страниц может быть несколько больше, поскольку ядро хранилища данных использует дополнительные ресурсы).

<суммарный размер столбцов в байтах> * <число строк>

<число страниц> = -----------------------------------------------------------------

4096

Предположим, что таблица имеет следующую структуру.

Имя столбца Тип (размер)

Order ID

INTEGER (4 байта)

Product ID

INTEGER (4 байта)

Цена единицы

MONEY (8 байт)

Количество

SMALLINT (2 байта)

Скидка

REAL (4 байта)

В таблице 2820 строк. В соответствии с формулой, для хранения данных этой таблицы необходимо приблизительно 16 страниц:

<число страниц> = ((4 + 4 + 8 + 2 + 4) * 2820) / 4096 = 15,15 страниц

msdn.microsoft.com

MS SQL Server кэш, планы запросов, оптимизация. Много ссылок и скрипты

Сделал такую вот подборку. Читать, пробовать, расширять кругозор. Собственно, оптимизация запросов вокруг этого и пляшет

Кэширование и повторное использование плана выполнения

DBCC FREEPROCCACHE (Transact-SQL) Удаляет все элементы из кэша планов, удаляет заданный план из кэша планов с помощью указания дескриптора плана или дескриптора SQL либо удаляет все записи кэша, связанные с указанным пулом ресурсов.

Параметры и повторное использование планов выполнения Использование параметров, включая маркеры параметров в приложениях ADO, OLE DB и ODBC, может повысить уровень использования планов выполнения.

Принудительная параметризация

Указание механизма параметризации запросов с помощью структур плана

 

Оптимизация SQL-запросов (Часть 1) В данной статье рассматриваются особенности запросов на выборку данных, виды индексов, использование планов запросов, различные подходы к оптимизации запросов.

Оптимизация SQL-запросов (Часть 2) Разработка В данной статье рассматриваются рекомендации по разработке оптимальной структуры БД

Оптимизация производительности запросов SQL Server Мацей Пилеки (Maciej Pilecki) Краткий обзор: Анализ планов выполнения Оптимизация запросов Определение запросов, нуждающихся в настройке

Семь смертных грехов программиста на T-SQL

The Side Effect Of NOLOCK

 

 

     select top 50 *

     FROM sys.dm_exec_query_stats AS QS

     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST

order by     QS.total_worker_time/QS.execution_count

 

select * from sys.dm_exec_cached_plans

 

—https://technet.microsoft.com/ru-ru/library/ms187404(v=sql.105).aspx

sys.dm_exec_cached_plans

–Âîçâðàùàåò ñòðîêó äëÿ êàæäîãî ïëàíà çàïðîñà, êýøèðóåìîãî SQL Server äëÿ áîëåå áûñòðîãî âûïîëíåíèÿ çàïðîñîâ.

–ìîæíî èñïîëüçîâàòü ñî ñëåäóþùèìè ôóíêöèÿìè äèíàìè÷åñêîãî óïðàâëåíèÿ

sys.dm_exec_sql_text

sys.dm_exec_query_plan

sys.dm_exec_plan_attributes

 

 

–SQL-òåêñò âñåõ êýøèðîâàííûõ çàïèñåé, èñïîëüçîâàííûõ áîëåå îäíîãî ðàçà.

SELECT usecounts, cacheobjtype, objtype, text

FROM sys.dm_exec_cached_plans

CROSS APPLY sys.dm_exec_sql_text(plan_handle)

WHERE usecounts > 1

ORDER BY usecounts DESC;

GO

 

 

–Âîçâðàùåíèå ïëàíîâ çàïðîñîâ äëÿ âñåõ êýøèðîâàííûõ

SELECT plan_handle, query_plan, objtype

FROM sys.dm_exec_cached_plans

CROSS APPLY sys.dm_exec_query_plan(plan_handle)

–WHERE objtype =’Trigger’;

GO

 

–ðàñïðåäåëåíèå ïàìÿòè, èñïîëüçóåìîé âñåìè ñêîìïèëèðîâàííûìè ïëàíàìè â êýøå.

SELECT plan_handle, ecp.memory_object_address AS CompiledPlan_MemoryObject,

    omo.memory_object_address, pages_allocated_count, type, page_size_in_bytes

FROM sys.dm_exec_cached_plans AS ecp

JOIN sys.dm_os_memory_objects AS omo

    ON ecp.memory_object_address = omo.memory_object_address

    OR ecp.memory_object_address = omo.parent_address

WHERE cacheobjtype = ‘Compiled Plan’;

GO

 

–SQL-òåêñò+ïëàí çàïðîñà âñåõ êýøèðîâàííûõ çàïèñåé, èñïîëüçîâàííûõ áîëåå îäíîãî ðàçà.

SELECT usecounts, cacheobjtype, objtype, text,plan_handle, query_plan, objtype

FROM sys.dm_exec_cached_plans

CROSS APPLY sys.dm_exec_sql_text(plan_handle)

CROSS APPLY sys.dm_exec_query_plan(plan_handle)

WHERE usecounts > 1

ORDER BY usecounts DESC;

GO

www.digger.dp.ua

Оптимизация моих SQL-запросов – выбор правильных индексов MS SQL Server

В вашем плане выполнения вы говорите, что поиск занимает 97% партии.

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

Этот поиск – это фактически запись, которую вы читаете, на основе указанного вами индекса.

Почему два плана выполнения выше того же? (У меня нет индекса на [компании] в данный момент)

Non-Clustered index on ([Company],[OrderNum],[Status])

Этот индекс будет учитываться только в том случае, OrderNum в вашем предложении OrderNum Company , OrderNum и Status .

Конкатенированные индексы генерируют ключ, который будет выглядеть так: 0000000000000, когда вы передаете только company он создает неполный ключ, для которого требуется использовать подстановочный знак для другого.

Это выглядело бы примерно так: такой key like 'XXX%' этой логики потребуется сканирование индекса, которое требует много времени.

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

Стоит ли добавлять [Компания] ко всем моим индексам, поскольку, похоже, он отличается от плана выполнения 0?

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

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

Должен ли я вместо этого добавить 1 единственный индекс в [Company] и сохранить исходные индексы? – но будет ли это означать, что каждый запрос будет иметь 2 запроса?

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

Стоит ли «включать» все остальные столбцы в мои индексы, чтобы избежать поиска ключей? (сделать индекс на тонну больше, но потенциально ускорить его?)

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

Последние примечания

Все индексы не равны, сравнение строки (varchar) – это не то же самое, что сравнивать числа (integer, datetime, bytes и т. Д.).

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

sqlserver.bilee.com

Оптимизация запросов MSSQL MS SQL Server

MSSQL, мне нужно передать набор параметров для запроса … есть ли способ, которым я могу сделать это одним выстрелом!

У меня есть 2 источника данных CD и VD. У меня есть данные для продуктов: Продукт A, B, C … in Data source CD i есть данные для продуктов: Продукт 1,2,3 … в источнике данных VD

ProductA такой же, как Product1 ProductB, тот же, что и Product2. Мне нужны соответствующие данные для ProductA / 1, ProductB / 2 .. из этих двух разных источников. Если у них были одинаковые названия продуктов в обоих источниках, я мог бы группировать по названию продукта, но они имеют разные названия продуктов.

Запрос 1:

SELECT CD.Description,Count(DISTINCT CD.TweetId) AS MatchingCount FROM Result_Table_CSData CD INNER JOIN Result_Table_VData VD ON CD.TweetId = VD.TweetID AND CD.Description = 'Product1' AND VD.Description = 'ProductA'

Запрос 2:

SELECT CD.Description,Count(DISTINCT CD.TweetId) AS MatchingCount FROM Result_Table_CData CD INNER JOIN Result_Table_VData VD ON CD.TweetId = VD.TweetID AND CD.Description = 'Product2' AND VD.Description = 'ProductB'

У меня есть 100 продуктов в столбце описания обеих таблиц … пожалуйста, предложите способ, чтобы я мог запускать один запрос, содержащий один запрос для каждого продукта.

Solutions Collecting From Web of "Оптимизация запросов MSSQL"

Вы хотите создать запрос, который позволит вам связать Product1 с ProductA, но, как вы сказали, такой ссылки нет. Я не знаю, насколько это возможно, но похоже, что вам нужно будет создать эту ссылку, создав таблицу, содержащую имя / идентификатор продукта из исходного CD и соответствующее имя / ID продукта из исходного VD.

CDDesc VDDesc --------- -------- Product1 ProductA Product2 ProductB

Тогда запрос будет

SELECT CD.Description,Count(DISTINCT CD.TweetId) AS MatchingCount FROM Result_Table_CSData CD INNER JOIN SourceLink SL ON (CD.Description = SL.CDDesc) INNER JOIN Result_Table_VData VD ON CD.TweetId = VD.TweetID AND (SL.VDDesc = VD.Description) SELECT CD.Description,(Count(DISTINCT CD.TweetId) + Count(DISTINCT VD.TweetId)) AS MatchingCount FROM Result_Table_CSData CD INNER JOIN Result_Table_VData VD ON CD.TweetId = VD.TweetID AND charindex(REPLACE(VD.Description,'PRODUCT',''),'ABCDEFGHIJKLMNOPQRSTUVWXYZ')=CAST(REPLACE(CD.Description,'PRODUCT','') AS INT) GROUP BY CD.Description,VD.Description

sqlserver.bilee.com

Оптимизация выбора SQL-запросов MS SQL Server

Я использую ms sqlserver 2005. У меня есть запрос, который нужно фильтровать в соответствии с датой. скажем, у меня есть таблица, содержащая номера телефонов и даты. мне нужно указать количество номеров телефонов в период времени (дата начала и дата окончания). эти номера телефонов не должны совпадать с результатом, если они появляются в прошлом. я делаю что-то вроде этого:

select (phoneNumber) from someTbl where phoneNumber not in (select phoneNumber from someTbl where date<@startDate)

Это выглядит неэффективным для меня (и это занимает слишком много времени для преформы, что приводит к некоторым побочным эффектам, которые, возможно, должны быть представлены в другом вопросе). У меня около 300K строк в someTbl, которые нужно проверить.

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

and phoneNumber not in (select pastPhoneNumber from somePastTbl)

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

Поэтому я ищу лучший способ преподносить эти 2 действия.

UPDATE я решил пойти с решением Александра и получил такой запрос:

SELECT t.number FROM tbl t WHERE t.Date > @startDate --this is a filter for different customers AND t.userId in ( SELECT UserId FROM Customer INNER JOIN UserToCustomer ON Customer.customerId = UserToCustomer.CustomerId Where customerName = @customer ) --this is the filter for past number AND NOT EXISTS ( SELECT 1 FROM pastTbl t2 WHERE t2.Numbers = t.number ) -- this is the filter for checking if the number appeared in the table before startdate AND NOT EXISTS ( SELECT * FROM tbl t3 WHERE t3.Date<@startDate and t.number=t3.number )

Благодаря Gilad

Solutions Collecting From Web of "Оптимизация выбора SQL-запросов"

Еще один вариант

SELECT t.phoneNumber FROM SomeTbl t WHERE t.date > @startDate AND NOT EXISTS ( SELECT 1 FROM SomePastTbl t2 WHERE t2.phoneNumber = t.phoneNumber )

Так как его не просто переключают меньше, чем на большее.

select phoneNumber from someTbl where date > @startDate

Рядом с фильтром somePastTbl

select s1.phoneNumber from someTbl s1 LEFT JOIN somePastTbl s2 on s1.phoneNumber = s2.phonenumber where s1.date > @startDate and s2 IS NULL

ОБНОВИТЬ

Как за комментарий:

Меньше, чем месяц начала

SELECT COUNT(s1.phoneNumber) FROM someTbl s1 LEFT JOIN somePastTbl s2 on s1.phoneNumber = s2.phonenumber where DATEADD(MONTH,-1,@startDate) < s1.date AND s1.date < @startDate and s2 IS NULL

один простой индекс

CREATE NONCLUSTERED INDEX IX_SomeTbl_date_phoneNumber ON SomeTbl ( date ASC, phoneNumber ASC )

тогда

SELECT phoneNumber FROM SomeTbl WHERE date > @startDate EXCEPT SELECT phoneNumber FROM SomePastTbl;

Вам нужны номера телефонов, минимальная дата начала которых больше даты начала. Это предполагает агрегацию на уровне номера телефона, прежде чем делать счет (или создать список).

Вот один из способов, с условием в условии having :

select COUNT(*) from (select t.phonenumber, from someTble t left outer join somePastTble pt on t.phonenumber = pt.phonenumber where pt.phonenumber is null having MIN(date) >= @startdate ) t

Вы также можете написать это с помощью оконных функций (SQL 2005 или выше). Вот версия, использующая min() :

select COUNT(distinct t.phonenumber) from (select t.*, t.phonenumber, MIN(date) over (partition by phonenumber) as mindate from someTble t ) t left outer join somePastTble pt on t.phonenumber = pt.phonenumber where pt.phonenumber is null and mindate >= @startdate

sqlserver.bilee.com


Prostoy-Site | Все права защищены © 2018 | Карта сайта