我有一个数据库表“TABLE_A”,其中包含一个可以为空的字符串字段“field_x”,上面有非聚集索引。一个问题
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
) 对性能没有帮助。
我通过查看 Interactive SQL 中的 Plan Viewer 来收集性能统计信息。当该表中有 field_x 的一些数据时,逻辑 I/O、物理 I/O 和 CPU 非常接近于零。当所有值都为 NULL 时,I/O 和 CPU 值类似于扫描整个表。
查询执行计划显示正在使用索引:
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 上观察到了它。
谢谢您的帮助。