我正在一个名为eselinq的Google Code项目中为.NET和LINQ编写ESE适配器.我似乎无法弄清楚的一个重要功能是如何获取为表定义的索引列表.我需要能够列出可用的索引,以便LINQ部分可以自动确定何时可以使用索引.如果可以找到适当的索引,这将允许更有效的用户查询计划.
查询索引信息有两个相关的功能:
JetGetTableIndexInfo
- 通过tableID获取索引信息JetGetIndexInfo
- 通过tableName获取索引信息这些仅在指定相关表的方式(name或tableid)方面有所不同.听起来这些会支持我想要的功能,但所有的信息级别似乎都要求我已经有一个索引来查询信息.唯一的例外是JET_IdxInfoCount
,但这仅计算存在多少索引.
JET_IdxInfo
它JET_INDEXLIST
听起来似乎有道理,但它只列出了特定索引上的列.
我知道我可以用另一种方式获取索引信息,例如对应于数据库表的.NET类型的注释,或者要求提前提供索引映射.我认为已经实施了足够的内省,以使其他所有内容无需用户提供额外信息即可开箱即用,除了这一功能.
另一种选择可能是检查系统表以查找相关的索引对象,但这意味着取决于未记录的接口.
为了满足这个问题,我想要一个支持的方法来枚举表上的索引(只是名称就足够了).
我有一个SQLCLR标量函数,它将把我需要根据需要粉碎的XmlReader传入一个内联结果集.这些XML对象是按需生成的,因此我无法使用XML索引.在结果数据集中有超过100列是常见的.考虑以下示例代码:
CREATE XML SCHEMA COLLECTION RAB AS '
<xsd:schema xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="r" type="r"/>
<xsd:complexType name="r">
<xsd:attribute name="a" type="sqltypes:int" use="required"/>
<xsd:attribute name="b" type="sqltypes:int" use="required"/>
<xsd:attribute name="c" type="sqltypes:int" use="required"/>
</xsd:complexType>
</xsd:schema>';
GO
DECLARE @D TABLE(x XML(DOCUMENT RAB) NOT NULL);
INSERT INTO @D
VALUES
('<r a="3" b="4" c="34"/>'),
('<r a="5" b="6" c="56"/>'),
('<r a="7" b="8" c="78"/>')
SELECT x.value('/r/@a', 'int') a, x.value('/r/@b', 'int') b, x.value('/r/@c', 'int') c
FROM @d a
Run Code Online (Sandbox Code Playgroud)
这将使用某些XML值填充表变量中的类型化XML列,并将属性分解为单独的列.对此的执行计划似乎过于混乱:
|--Compute Scalar(DEFINE:([Expr1009]=[Expr1008], [Expr1016]=[Expr1015], [Expr1023]=[Expr1022]))
|--Nested Loops(Inner …
Run Code Online (Sandbox Code Playgroud) System.Collections.SortedList 有一个 SetByIndex 方法,由于数据结构的性质,它很便宜,O(1)。此类的通用版本没有 SetByIndex 方法。我正在寻找 System.Collections.Generic 中 SortedList 实现的等效操作。
这两个类都使用排序数组实现字典。由于底层结构是一个数组,因此可以通过索引有效地访问条目。非通用版本还提供了一个 GetByIndex 方法,该方法通过索引(而不是键)检索值。通用 SortedList 还支持通过 .Values 属性按索引检索。当我尝试通过 .Values 属性修改元素时,我收到一个异常,提示“SortedList 嵌套类型不支持此操作,因为它们需要修改原始 SortedList。”
我不是面向对象设计的专家,但为什么不让我通过 SortedList 返回的“嵌套类型”修改值呢?
对于这个项目,我使用 .NET 4.0。我需要 SortedList 以便我可以按排序顺序遍历项目。根据分析,程序中最昂贵的调用树涉及按索引(因此按键排序)遍历一堆小型 SortedLists 中的项目并修改某些值。目前要执行该值修改步骤,我必须使用键进行分配,这涉及 log(n) 字符串比较操作来定位正确的插槽,而不是简单地按索引(即 SetByIndex)分配值,这将是零比较。我没有更改键,因此不会影响数组中值的位置。
System.String.CompareTo(string) 花费的总程序时间的 19%(不包括),几乎所有时间都来自修改值的方法。
示例代码来说明:
class Container
{
readonly System.Collections.Generic.SortedList<string, MapEntryValueType> map;
void Merge(IncomingData data)
{
for(int i=0; i < map.Count; i++)
if(data.ExamineKeyForMatch(map.Keys[i])) //O(1)
{
MapEntryValueType entry = map.Values[i]; //O(1)
entry.something = data.something;
//map.Values[i] = entry; //O(1) no can do, error "This operation is not supported..."
//map.SetByIndex(i, …
Run Code Online (Sandbox Code Playgroud) Playground(Stable Rust 1.45.0,2018 版)例如不需要外部板条箱。
type Error = Box<dyn std::error::Error>;
type Result<R=()> = std::result::Result<R, Error>;
struct Arena;
pub trait AsSized<'a> {
type AsSized: Sized + 'a;
}
impl<'a, T: Sized + 'a> AsSized<'a> for T {
type AsSized = Self;
}
impl<'a, T: AsSized<'a>> AsSized<'a> for [T] {
type AsSized = &'a [T::AsSized];
}
pub trait Format<T>: Send + Sync
where T: ?Sized
{
fn get_bytes<'a>(&self, value: &'a T, arena: &'a Arena) -> Result<&'a [u8]>;
fn get_value<'a>(&self, bytes: &'a …
Run Code Online (Sandbox Code Playgroud) 我有许多供应商提供的M-Code例程,作为更大的产品的一部分,它使用READ
并WRITE
直接与当前设备交互.我无法更改该代码.我想在系统中包含一些例程,我可以交互式地提供输入和捕获输出.
目前,这是通过打开到远程主机的TCP连接并使其成为当前设备来实现的.READ
并WRITE
确实连接到套接字.这是相当不方便的,因为它需要一个单独的服务来监听TCP套接字,并与本地作业协调以使整个过程工作.我还必须关闭nagle并跳过缓冲或连接变为延迟驱动或停止.(例如TCP OPEN选项/SEN=1
aka +Q
).不幸的是,这会导致许多1字节的TCP段,并且效率也非常低.
我宁愿通过一个过程来推动整个互动.理想情况下,我可以调用READ
,WRITE
当前设备上运行的其他功能会触发CachéCallinC接口或用户扩展模块中的某些M-Code或回调,以在后端提供所需的功能.这样,我可以按照自己的条件管理IO,而无需进行进程间协调.我无法找到一个入口点来设置它.
在Caché中是否存在用户定义的设备?
对于UNIX主机,有一种方法可以将现有文件描述符用作设备,这可能很有用,但似乎并未在Windows上实现.
有一件事我也考虑过是创建一个新的进程,有Windows重定向STDIN
并STDOUT
与SetStdHandle来管我从同一个进程中控制,用呼唤连接到缓存并让它使用它应该是默认设备STDIN
和STDOUT
.任何人都知道这是否真的有效?
windows ×2
.net-4.0 ×1
c# ×1
esent ×1
intersystems ×1
lifetime ×1
rust ×1
sql-server ×1
sqlclr ×1
xquery ×1