2009-06-10 42 views
0

如果我需要检查整个表以查看条件是否成立(例如,每个Ticket列都有一个带有某个后缀的ID)。在性能考虑的情况下对大表进行迭代

什么是一个很好的方法去实现这个,性能明智?这个表格非常大,所以如果我经历每一行,那就是很多时间触及数据库。光标很慢,所以这不会是一个优雅的解决方案

另外,对于未来,您可以随时验证您的参数,但过去这种情况并非如此。

回答

6

伪SQL(甲骨文作品,语法等RDBMS可能会有所不同)

select * from tab where col1 not like '%suffix' 

这会给你,没有你所需的后缀的所有行。

0

对于一个设计良好的数据库查询(对于一个有索引的数据库查询甚至会更快)将是最有效的,比尝试遍历每行或检索整个表格要好得多。 SQL'like'运算符将执行您所描述的操作。

0

我不确定您是否正在寻找SQL或C#中的建议。如果你想用LINQ的C#中的东西,你可以这样做

pTable.Any(pRow => pRow.Column == someValue) 
2

你想用这些行做什么?

如果只是:

SELECT COUNT(*) 
FROM tbl 
WHERE col NOT LIKE '%suffix' 

这可能是一个表扫描或索引扫描。

它仍然只是一个调用数据库,它最多返回一行。数据库将比其他任何方法更快地完成工作。

如果您的数据库正在改变,你需要能够定期地管理这一标准,并愿意作出折衷INSERT和UPDATE过程中一点点空间和处理,你可以使用一个持久化计算列:

CASE WHERE col LIKE '%suffix' THEN 1 ELSE 0 END 

并创建一个索引。

ALTER TABLE tbl 
ADD COLUMN IsSuffix AS (
    CASE WHERE col LIKE '%suffix' THEN 1 ELSE 0 END 
) PERSISTED NOT NULL 

然后在该列上的CREATE INDEX

+0

如何在查询中创建索引?我所需要做的就是检查值(对于前缀)。谢谢 – dotnetdev 2009-06-10 17:39:16

+0

这将是表中的一个持久列,您将使用该列在表上创建一个索引。如果它是前缀而不是后缀(LIKE'前缀%'),那么将使用该列上的索引,这是不必要的。 – 2009-06-10 18:10:54

0

望着那@Vasu Balakrishnan的解决方案产生的,如果你想知道的是,如果有任何无效的行,你可以做这样的事情的SQL:

SELECT 
    (CASE 
     WHEN EXISTS(
      SELECT NULL AS [Empty] 
      FROM [Ticket] 
      WHERE [ID] NOT LIKE '%_SUFFIX' 
      ) THEN 0 
     ELSE 1 
    END) AS [AllColumnsAreValid] 
0

关于性能和匹配后缀与LIKE运算符 - 因为后缀匹配不能使用索引,所以这会相对较慢。

如果您经常需要这样做,请修改表格以包含一个字段,该字段的TickedID字符串反向并为其添加索引。例如,您可以添加一个触发器来执行AFTER INSERT。也可以在计算列上放置索引。

SELECT * FROM tab WHERE TicketIDReverse LIKE REVERSE('%suffix') 

匹配的前缀,实际上,这样它可以使用一个索引,应该执行速度比:

SELECT * FROM tab WHERE TicketID LIKE '%suffix' 
1

如果你做这一切的时候,创建反向计算列(YourColumn ),并添加一个索引:

ALTER TABLE dbo.YourTable ADD 
    ReverseColumn AS REVERSE(YourColumn) 
GO 
CREATE NONCLUSTERED INDEX IX_YourTable_ReverseColumn ON dbo.YourTable 
    (
    ReverseColumn 
    ) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

使用这种方式:

DECLARE @Suffix varchar(10) 
SET @Suffix='abc' 

SET @Suffix=REVERSE(@Suffix)+'%' 
SELECT * FROM YourTable where ReverseColumn LIKE @Suffix 
相关问题