我希望能够在实例化类或访问字段时使用intellisense显示的文本来装饰类和方法.
例如,我想提供使用说明.
我找不到合适的装饰.我该怎么做?
我有一个关于SQL Server(或任何RDBMS)索引的最佳实践的问题.请看下表:
ProfileID int
Text nvarchar(50)
Run Code Online (Sandbox Code Playgroud)
ProfileID加入一张Profile桌子.每个配置文件都Text必须是唯一的.因此,我在两个列上都放置了一个主要封面键.精细.
但是,我也希望能够通过查询上表ProfileID.所以我也提了一个索引ProfileID.
这意味着我有一个重叠索引.我不知道这是否完全浪费,因为已经有一个封面索引,或者它是否正确,因为封面索引将是两列的散列(或者我是否误解了封面索引)?
编辑:
我按顺序创建了索引(ProfileID, Text).如果,为了论证的缘故,有3列A,B和C,它们都覆盖了所有3的覆盖索引.如果我们查询"A"或"A,B和C",它只会受益,但不会"B",或"C",或"B和C"?
我已经阅读了SQL Server 2008 OPTIMIZE FOR UNKNOWN查询提示.我明白它是如何工作的.
不过,我有个问题在那里,并在使用它.它不能在UDF中指定.它可以在存储过程中指定.但是,这篇 MSDN博客文章陈述如下:
4.将查询移入存储过程可以将其置于单独的过程上下文中,并且可以是优化器可以看到该值的好方法(注意:这也适用于SQL 2000)
在我看来,传递给存储过程的任何参数都将被"嗅探",从而帮助SQL Server编译最佳执行计划.这意味着将重新访问/重新编译缓存的计划(不确定该机制).然而,这是令人困惑的,因为它否定了OPTIMIZE FOR UNKNOWN的全部需求.
关于查询提示的MSDN文章没有涵盖我的问题.
有人可以为我解答这个问题,理想情况下是指向微软的一些东西来解决这个问题.谢谢.
我知道SQL Server可以在聚簇索引中以叶级别存储行的数据.我相信PostgreSQL不会这样做.如果是这样,它的存储范例是什么?
我的主要问题如下.考虑以下设计和数据(以T-SQL显示):
CREATE TABLE dbo.Tree
(
[Key] int NOT NULL,
ID int NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tree ADD CONSTRAINT
PK_Tree PRIMARY KEY CLUSTERED
(
[Key],
ID
) WITH (...) ON [PRIMARY]
INSERT INTO TREE ([Key], ID) VALUES (1, 1), (1, 2), (1, 3), (1, 4).
Run Code Online (Sandbox Code Playgroud)
由于这是一个以两列作为PK的btree,我更正确地说"[Key] = 1"只存储一次,而"ID = [1,2,3,4]"将是单个值btree,而每个sé都没有叶值,因为没有行列不属于PK?
如何在PostgreSQL中工作?
我有以下构造函数(作为测试):
CREATE TABLE product (id BIGSERIAL PRIMARY KEY, ext hstore);
CREATE INDEX ix_product_ext ON product USING GIN(ext);
INSERT
INTO product (id, ext)
SELECT id, ('size=>' || CEILING(10 + RANDOM() * 90) || ',mass=>' || CEILING(10 + RANDOM() * 90))::hstore
FROM generate_series(1, 100000) id;
Run Code Online (Sandbox Code Playgroud)
我有以下查询,它可以正常工作:
SELECT COUNT(id)
FROM (
SELECT id
FROM product
WHERE (ext->'size')::INT >= 41
AND (ext->'mass')::INT <= 20
) T
Run Code Online (Sandbox Code Playgroud)
但我相信正确的方法是使用@>运算符.我有以下内容,但它给出了语法错误:
SELECT COUNT(id)
FROM (
SELECT id
FROM product
WHERE ext @> 'size>=41,mass<=20'
) T
Run Code Online (Sandbox Code Playgroud)
我该怎么写呢?
我有以下方法定义(EDITED删除冗余通用):
public static T SearchAgaistValues<T>(Dictionary<string, string> input,
string key, List<T> values, Predicate<T> match, out string[] cmdParams)
Run Code Online (Sandbox Code Playgroud)
我的简化要求如下.我需要寻找input的key,如果找到,看看它的值出现在values.但是,它values是通用的(显然包含我需要匹配的字符串).因此,我看到它的方式,我必须传递谓词方法来执行匹配.
但是,Predicate<T>我所看到的每个例子都有一个硬编码的比较器.我需要将找到的key's值与每个项目进行比较values.但是,我无法传递这些值.
我无法看到如何使用基于委托的匹配方法在foreach循环之外执行此操作.
我在这里错过了什么吗?
我较早前发布了有关在C#中动态编译代码的问题,答案导致了另一个问题。
一种建议是,我使用委托,我尝试了这些委托,然后使它们运作良好。但是,他们的替补速度比直接通话慢8.4倍,这没有任何意义。
此代码有什么问题?
我的结果是.Net 4.0、64位,直接运行exe:62、514、530
public static int Execute(int i) { return i * 2; }
private void button30_Click(object sender, EventArgs e)
{
CSharpCodeProvider foo = new CSharpCodeProvider();
var res = foo.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters()
{
GenerateInMemory = true,
CompilerOptions = @"/optimize",
},
@"public class FooClass { public static int Execute(int i) { return i * 2; }}"
);
var type = res.CompiledAssembly.GetType("FooClass");
var obj = Activator.CreateInstance(type);
var method = type.GetMethod("Execute");
int i = 0, t1 = Environment.TickCount, t2; …Run Code Online (Sandbox Code Playgroud) 我想知道在任何SIMD系列指令中是否可以使用以下内容.
我有一个带有63位有效位的qword输入(从不为负).从LSB开始的每个连续7位是随机对齐到一个字节,左填充为1(除了最重要的非零字节).为了说明,为了清楚起见,我会使用字母.
结果只有有效字节,因此大小为0-9,转换为字节数组.
In: 0|kjihgfe|dcbaZYX|WVUTSRQ|PONMLKJ|IHGFEDC|BAzyxwv|utsrqpo|nmlkjih|gfedcba
Out: 0kjihgfe|1dcbaZYX|1WVUTSRQ|1PONMLKJ|1IHGFEDC|1BAzyxwv|1utsrqpo|1nmlkjih|1gfedcba
Run Code Online (Sandbox Code Playgroud)
大小= 9
In: 00|nmlkjih|gfedcba
Out: |0nmlkjih|1gfedcba
Run Code Online (Sandbox Code Playgroud)
大小= 2
我知道填充是分开的.洗牌调整是我的问题.这可能吗?
编辑2
这是我更新的代码.在单线程Core 2 Duo 2 GHz,64位上获得持续长度输入的持续46 M /秒.
private static int DecodeIS8(long j, ref byte[] result)
{
if (j <= 0)
{
return 0;
}
int size;
// neater code: gives something to break out of
while (true)
{
result[0] = (byte)((j & 0x7F) | 0x80);
size = 0;
j >>= 7;
if (j == 0) break;
result[1] = (byte)((j & 0x7F) | 0x80); …Run Code Online (Sandbox Code Playgroud) 如果针对 32 位进行编译(使用适用的寄存器重命名),下面的代码可以正常工作。但它在执行时会抛出错误(并且“警告:目标文件“project1.o”包含到符号“.data.n_tc_p$project1_orbitkeyheader64$int64$longint$$int64_shufidx”的32位绝对重定位。”编译时)。
function SwapBytes64(const Val: Int64): Int64;
{$A 16}
const
SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
movq xmm0, rcx
pshufb xmm0, SHUFIDX // throws
movq rax, xmm0
end;
end;
Run Code Online (Sandbox Code Playgroud)
我该如何纠正这个问题(最好是对齐常数)。
编辑 我也尝试使用 movdqu。
答案 这是@Jester 答案的结果:
function SwapBytes64(const Val: Int64): Int64;
const
SHUFIDX : array [0..1] of Int64 = ($0001020304050607, 0);
begin
asm
movq xmm0, rcx
movdqu xmm1, [rip+SHUFIDX]
pshufb xmm0, xmm1
movq rax, xmm0
end;
end;
Run Code Online (Sandbox Code Playgroud)
这也有效,但没有明显的速度优势:
function SwapBytes64(const Val: Int64): Int64;
const …Run Code Online (Sandbox Code Playgroud) 将RDX,R8中的两个long移动到XMM0中的最简单的方法是什么,其中RDX移动到较低的64位,R8移动到较高的64位?
MOVQ仅设置较低,0设置为较高.
我只限于SSSE3.
.net ×3
sql-server ×3
assembly ×2
c# ×2
delegates ×2
postgresql ×2
sse ×2
attributes ×1
avx ×1
b-tree ×1
c#-4.0 ×1
database ×1
decorator ×1
freepascal ×1
gwt-gin ×1
indexing ×1
intellisense ×1
lazarus ×1
performance ×1
predicates ×1
query-hints ×1
simd ×1
sql ×1
x86 ×1