是否可以在 Sybase 中动态强制使用索引?
Is it possible to dynamically force index usage in Sybase?
美好的一天,
根据标题,
是否可以在查询中动态强制使用某个索引?
我正在尝试做的事情的例子:
- 我有一个名为#Employees
的临时 table
- 这个 table 还没有设置索引。
- 有一个 non-temporary table 叫做 Employees
- 这个 non-temporary table 在 "Month" 列上有一个索引。
- 这是对我的环境的简化,主要是因为 Sybase 决定不使用索引,除非我强制使用它。
@index 已被前面的代码设置为 inid 或确切的索引名称。我都试过了。
不允许对 non-temporary table 进行更改。
*Table:
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.
看来您在提供提示时必须使用硬编码的索引名称。例如,如果月份列上的索引被称为 month_index
,则以下内容将起作用:
insert into #Employees
select * from Employees (index month_index)
where Month between '2016-01-01' and '2016-12-31'
但是,如果您不指定索引,那么 Sybase 可能会使用您拥有的任何单个索引作为默认值。
美好的一天,
根据标题, 是否可以在查询中动态强制使用某个索引?
我正在尝试做的事情的例子:
- 我有一个名为#Employees 的临时 table
- 这个 table 还没有设置索引。
- 有一个 non-temporary table 叫做 Employees
- 这个 non-temporary table 在 "Month" 列上有一个索引。
- 这是对我的环境的简化,主要是因为 Sybase 决定不使用索引,除非我强制使用它。
@index 已被前面的代码设置为 inid 或确切的索引名称。我都试过了。
不允许对 non-temporary table 进行更改。
*Table:
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.
看来您在提供提示时必须使用硬编码的索引名称。例如,如果月份列上的索引被称为 month_index
,则以下内容将起作用:
insert into #Employees
select * from Employees (index month_index)
where Month between '2016-01-01' and '2016-12-31'
但是,如果您不指定索引,那么 Sybase 可能会使用您拥有的任何单个索引作为默认值。