Низкая производительность запросов в поле индексированной строки, когда все значения равны NULL (база данных SYBASE)
У меня есть таблица базы данных "TABLE_A" со строковым полем, допускающим значение NULL, с некластеризованным индексом. Запрос
SELECT * FROM TABLE_A WHERE field_x = 'some value'
выполняется быстро в большинстве сред. В среде одного клиента все значения этого поля равны NULL, и этот запрос выполняется очень медленно.
Вопрос № 1: Есть ли способ в SYBASE оптимизировать для этого конкретного сценария? Кажется, что-то, что SYBASE уже должен обработать.
Вопрос № 2: есть ли способ оптимизировать этот запрос? Отфильтровывая NULLS (как в
SELECT * FROM TABLE_A WHERE field_x IS NOT NULL
) НЕ помогает с производительностью.
Я собрал статистику производительности, посмотрев Plan Viewer в Interactive SQL. Когда в этой таблице есть некоторые данные для field_x, тогда логический ввод-вывод, физический ввод-вывод и ЦП очень близки к нулю. Когда все значения равны NULL, значения ввода-вывода и ЦП аналогичны сканированию всей таблицы.
План выполнения запроса показывает, что индекс используется:
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is SELECT.
1 operator(s) under root
|ROOT:EMIT Operator (VA = 1)
|
| |SCAN Operator (VA = 0)
| | FROM TABLE
| | TABLE_A
| | Index : INDEX_X
| | Forward Scan.
| | Positioning by key.
| | Keys are:
| | field_x ASC
| | Using I/O Size 16 Kbytes for index leaf pages.
| | With LRU Buffer Replacement Strategy for index leaf pages.
| | Using I/O Size 16 Kbytes for data pages.
| | With MRU Buffer Replacement Strategy for data pages.
Кроме того, я не уверен, что эта проблема воспроизводима для других баз данных, но я наблюдал это на SYBASE ASE 15.
Спасибо за помощь.
1 ответ
Если у них в массиве имеется огромный перекос данных с нулевыми данными, вы можете посмотреть на sp_modifystats, чтобы сказать оптимизатору игнорировать перекос данных (т. Е. Массу пустых значений).
Информация здесь:
Не следует использовать без значительного тестирования, и имейте в виду, что вам нужно повторно модифицировать после каждого запуска статистики обновлений в таблице.