【问题标题】:Is it possible to dynamically force index usage in Sybase?是否可以在 Sybase 中动态强制使用索引?
【发布时间】:2016-12-03 08:40:54
【问题描述】:

早安,

根据标题, 是否可以在查询中动态强制使用某个索引?

我正在尝试做的示例:

  • 我有一个名为 #Employees 的临时表
  • 此表尚未设置索引。
  • 有一个名为Employees 的非临时表
  • 此非临时表在“月份”列上有一个索引。
  • 这是对我的环境的简化,主要源于 Sybase 决定不使用索引,除非我强制使用它。
  • @index 已被先前的代码设置为 inid 或确切的索引名称。我都试过了。

  • 不允许更改非临时表。

*表:

EmployeeID(numeric) | EmployeeName(varchar) | Month(datetime) | Sallary(int)

查询:

insert into #Employees 
select * from Employees (index @index)
where Month between 'Jan' and 'Dec'

使用这段代码,Sybase 只是说@index 附近有一个错误。

Q1: Can I do this?  
Q2: If so, how? 
Q3: If not, is there anything else I can do?

除非使用该索引,否则查询将不会完成,并且我 100% 确定地知道的 inid 在需要运行的所有服务器中并不相同,虽然我没有检查,但也不能保证索引名称本身是相同的。 我有一个查询可以根据它的列找到这个索引,我可以保证列名总是相同的。

提前致谢, ziv.

【问题讨论】:

    标签: sql sybase


    【解决方案1】:

    在提供提示时,您似乎必须使用硬编码的索引名称。例如,如果月份列上的索引被称为month_index,那么以下内容将起作用:

    insert into #Employees 
    select * from Employees (index month_index)
    where Month between '2016-01-01' and '2016-12-31'
    

    但如果您不指定索引,则 Sybase 可能会使用您拥有的任何单个 inxex 作为默认值。

    【讨论】:

    • 大家好,蒂姆,关于索引名称的使用。由于我们的研发部门继续搞乱索引,因此无法保证索引始终具有相同的名称。唯一可以保证的是,它的列将始终相同。关于日期时间的事情,我只是把'Jan'和'Dec'作为占位符。除了我确实有一个基于日期时间的 where 子句之外,它们对代码并不重要。
    • 嗯,“不”也是一个答案。我将继续等待,现在,谢谢您的时间。
    • @ziv 试试上面的动态 SQL。如果它不起作用,那么我会倾向于“不”
    • 谢谢蒂姆,但我已经尝试过了,得到了相同的结果。
    • 好的,经过一番折腾,我让它自己使用正确的索引。事实证明,如果我在动态 SQL 中运行它,即使我不指定索引,它仍然使用一个,而且它是正确的。我想既然它在事情结束时运行,它就有机会制定更好的计划......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多