1

我有一个数据库表“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 上观察到了它。

谢谢您的帮助。

4

1 回答 1

0

如果他们在列中有大量空数据倾斜,您可以查看 sp_modifystats 以告诉优化器忽略数据倾斜(即大量 NULL)。

这里的信息:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36273.1572/html/sprocs/CHDGHEGE.htm

不要在没有经过大量测试的情况下使用,并且请记住,您需要在每次运行表上的更新统计信息后重新修改。

于 2016-12-21T15:17:29.947 回答