Почему мое соединение с SQL Server заняло бы намного больше времени со 129 записями в таблице по сравнению со 128? - PullRequest
0 голосов
/ 29 сентября 2018

Я делаю базовое соединение в SQL Server на работе.Я думал, что это заняло невероятно много времени (соединение таблицы с примерно 2000 записями в другую с примерно 500).

Вот как выглядит запрос:

select
     an.AccountNumber
    ,d.AccountCharacteristic
    ,st.TotalBalance
from AccountLevelData as d
join Statements as st
    on st.AccountNumber = d.AccountNumber 
join #AccountNumberList as an
    on an.AccountNumber = d.AccountNumber 
where st.TimePeriod = eomonth(getdate(), -1)

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

Полагаю,это связано с причудой в SQL Server или SQL Server Management Studio, но я не смог найти никаких ресурсов о том, почему и как это происходит.Я заметил, что 128 = 0b10000000, так что, может быть, это как-то связано с битами - как только число строк в таблице занимает более семи бит, чтобы представить оптимизатор запросов, что-то странное?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

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

0 голосов
/ 29 сентября 2018

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

SELECT
    an.AccountNumber
,   d.AccountCharacteristic
,   st.TotalBalance
FROM 
    #AccountNumberList an
JOIN Statements st ON st.AccountNumber = an.AccountNumber AND st.TimePeriod = eomonth(getdate(), -1)
JOIN AccountLevelData d ON d.AccountNumber  = an.AccountNumber 

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

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

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

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

...