我有一个数据库表'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上观察到它。
感谢您的帮助。
答案 0 :(得分:0)
如果列中的空数据存在大量数据偏差,则可以查看sp_modifystats以告知优化器忽略数据偏差(即NULL的质量)。
信息在这里:
如果没有重要测试,请不要使用,请记住,您需要在每次运行更新统计信息后重新修改。