如果我需要检查整个表以查看条件是否成立(例如,每个Ticket列都有一个带有某个后缀的ID)。在性能考虑的情况下对大表进行迭代
什么是一个很好的方法去实现这个,性能明智?这个表格非常大,所以如果我经历每一行,那就是很多时间触及数据库。光标很慢,所以这不会是一个优雅的解决方案
另外,对于未来,您可以随时验证您的参数,但过去这种情况并非如此。
如果我需要检查整个表以查看条件是否成立(例如,每个Ticket列都有一个带有某个后缀的ID)。在性能考虑的情况下对大表进行迭代
什么是一个很好的方法去实现这个,性能明智?这个表格非常大,所以如果我经历每一行,那就是很多时间触及数据库。光标很慢,所以这不会是一个优雅的解决方案
另外,对于未来,您可以随时验证您的参数,但过去这种情况并非如此。
伪SQL(甲骨文作品,语法等RDBMS可能会有所不同)
select * from tab where col1 not like '%suffix'
这会给你,没有你所需的后缀的所有行。
对于一个设计良好的数据库查询(对于一个有索引的数据库查询甚至会更快)将是最有效的,比尝试遍历每行或检索整个表格要好得多。 SQL'like'运算符将执行您所描述的操作。
我不确定您是否正在寻找SQL或C#中的建议。如果你想用LINQ的C#中的东西,你可以这样做
pTable.Any(pRow => pRow.Column == someValue)
你想用这些行做什么?
如果只是:
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
。
望着那@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]
关于性能和匹配后缀与LIKE运算符 - 因为后缀匹配不能使用索引,所以这会相对较慢。
如果您经常需要这样做,请修改表格以包含一个字段,该字段的TickedID
字符串反向并为其添加索引。例如,您可以添加一个触发器来执行AFTER INSERT。也可以在计算列上放置索引。
SELECT * FROM tab WHERE TicketIDReverse LIKE REVERSE('%suffix')
匹配的前缀,实际上,这样它可以使用一个索引,应该执行速度比:
SELECT * FROM tab WHERE TicketID LIKE '%suffix'
如果你做这一切的时候,创建反向计算列(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
如何在查询中创建索引?我所需要做的就是检查值(对于前缀)。谢谢 – dotnetdev 2009-06-10 17:39:16
这将是表中的一个持久列,您将使用该列在表上创建一个索引。如果它是前缀而不是后缀(LIKE'前缀%'),那么将使用该列上的索引,这是不必要的。 – 2009-06-10 18:10:54