我有一组数据要一次插入,比如4行.
我的表有三列:Person,Id和Office.
INSERT INTO MyTable VALUES ("John", 123, "Lloyds Office");
INSERT INTO MyTable VALUES ("Jane", 124, "Lloyds Office");
INSERT INTO MyTable VALUES ("Billy", 125, "London Office");
INSERT INTO MyTable VALUES ("Miranda", 126, "Bristol Office");
Run Code Online (Sandbox Code Playgroud)
我可以Person在一个单独的所有4行Id?
我正在尝试优化将数据插入MySQL的代码的一部分.我应该链接INSERT来制作一个巨大的多行INSERT还是更快的多个单独的INSERT?
我已经阅读了很多关于此的问题,但我找不到一个足够快的问题.我认为有更好的方法可以将大量行插入MySQL数据库
我使用以下代码将100k插入我的MySQL数据库:
public static void CSVToMySQL()
{
string ConnectionString = "server=192.168.1xxx";
string Command = "INSERT INTO User (FirstName, LastName ) VALUES (@FirstName, @LastName);";
using (MySqlConnection mConnection = new MySqlConnection(ConnectionString))
{
mConnection.Open();
for(int i =0;i< 100000;i++) //inserting 100k items
using (MySqlCommand myCmd = new MySqlCommand(Command, mConnection))
{
myCmd.CommandType = CommandType.Text;
myCmd.Parameters.AddWithValue("@FirstName", "test");
myCmd.Parameters.AddWithValue("@LastName", "test");
myCmd.ExecuteNonQuery();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这需要100k行约40秒.我怎样才能更快或更高效?
通过DataTable/DataAdapter或一次插入多行可能会更快:
INSERT INTO User (Fn, Ln) VALUES (@Fn1, @Ln1), (@Fn2, @Ln2)...
Run Code Online (Sandbox Code Playgroud)
由于安全问题,我无法将数据加载到文件和MySQLBulkLoad它.
我有一个SQL表,我想按ID选择多行.例如,我想从我的表中获取ID为1,5和9的行.
我一直在使用类似于下面的WHERE IN语句执行此操作:
SELECT [Id]
FROM [MyTable]
WHERE [Id] IN (1,5,9)
Run Code Online (Sandbox Code Playgroud)
然而,对于"IN"子句中的大量项目来说,这是非常缓慢的
下面是使用1,000,000行的表中的where in选择行的一些性能数据
Querying for 1 random keys (where in) took 0ms
Querying for 1000 random keys (where in) took 46ms
Querying for 2000 random keys (where in) took 94ms
Querying for 3000 random keys (where in) took 249ms
Querying for 4000 random keys (where in) took 316ms
Querying for 5000 random keys (where in) took 391ms
Querying for 6000 random keys (where in) took 466ms
Querying for 7000 …Run Code Online (Sandbox Code Playgroud) 我正在编写一个将数据写入SQL Server 2008r2的.NET应用程序.我有两个插入数据的选项,要么我可以创建一个大的字符串插入语句,并将其作为文本命令发送,或者我可以在.NET DataTable中收集数据,并将其作为表值参数传递.每种方法的好处和成本是什么?
(我省略了很多代码,因为我只是询问相对的好处,而不是具体的语法)
例如:
选项1:
string insert = @"insert into MyTable (id, val) values
( 1, 'a'),(2,'b'),(3,'c'),(4,'d');"
Run Code Online (Sandbox Code Playgroud)
选项2:
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("val", typeof(string));
....
create procedure uspMyProc
@tt ttMyTableType readonly
as
begin
insert into TestTable1 (id, strValue)
select myId, myVal from @tt;
end"
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我有一个Table Valued Constructor通过它选择周围的1 million记录.它将用于update另一个表.
SELECT *
FROM (VALUES (100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
.....
..... --1 million records
(100,200,300)) tc (proj_d, period_sid, val)
Run Code Online (Sandbox Code Playgroud)
这是我的原始查询:https://www.dropbox.com/s/ezomt80hsh36gws/TVC.txt?dl = 0#
当我执行上述操作时,select它只是显示查询已完成但出现错误并显示任何错误消息.
更新:尝试使用TRY/CATCH块捕获错误消息或错误号但不使用与先前映像相同的错误
BEGIN try
SELECT *
FROM (VALUES (100,200,300),
(100,200,300),
(100,200,300),
(100,200,300),
.....
..... --1 million records
(100,200,300)) tc (proj_d, period_sid, val)
END try
BEGIN catch
SELECT Error_number(),
Error_message()
END catch
Run Code Online (Sandbox Code Playgroud)
为什么它没有执行是否有表Valed构造函数的限制Select.我知道Insert它是1000,但我选择在这里.
我正在对博客文章的批处理事务进行一些性能分析,我注意到当你使用批量插入语句时,它的执行速度比等效的单个SQL语句慢得多.
插入1000行如下所示大约需要3秒
INSERT TestEntities (TestDate, TestInt, TestString) VALUES
('2011-1-1', 11, 'dsxcvzdfdfdfsa'),
('2011-1-1', 11, 'dsxcvzdfdfdfsa'),
('2011-1-1', 11, 'dsxcvzdfdfdfsa')
Run Code Online (Sandbox Code Playgroud)
插入1000行如下所示需要130ms
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa')
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa')
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa')
Run Code Online (Sandbox Code Playgroud)
这似乎只在您第一次在表上使用批量插入时发生,但它的可重现性.
另请注意,数据插入是随机的(但两个查询都相同)
编辑:
继承了我的repro案例与虚拟随机数据我用于这种情况:https://gist.github.com/2489133
这个问题不是关于处决的顺序.这只是关于ORDER BY.
在标准执行中是:
编辑:这个问题或多或少是" SQL Server在执行ORDER BY表达式时是否应用短路评估? "的问题.答案是有时候的!我还没有找到合理的理由来解释原因.请参见编辑#4.
现在假设我有这样的声明:
DECLARE @dt18YearsAgo AS DATETIME = DATEADD(YEAR,-18,GETDATE());
SELECT
Customers.Name
FROM
Customers
WHERE
Customers.DateOfBirth > @dt18YearsAgo
ORDER BY
Contacts.LastName ASC, --STATEMENT1
Contacts.FirstName ASC, --STATEMENT2
(
SELECT
MAX(PurchaseDateTime)
FROM
Purchases
WHERE
Purchases.CustomerID = Customers.CustomerID
) DESC --STATEMENT3
Run Code Online (Sandbox Code Playgroud)
这不是我试图执行的真实陈述,而只是一个例子.有三个ORDER BY语句.第三个语句仅用于姓氏和名字匹配的罕见情况.
如果没有重复的姓氏,SQL Server是否不执行ORDER BY语句#2和#3?而且,从逻辑上讲,如果没有重复的姓氏和名字,SQL Server会注意执行语句#3.
这真的是为了优化.从购买表中读取应该只是最后的手段.对于我的应用程序,从"CustomerID"分组的"Purchases"读取每个"PurchaseDateTime"效率不高.
请保留与我的问题相关的答案,而不是像购买中的CustomerID,PurchaseDateTime构建索引的建议.真正的问题是,SQL Server是否会跳过不必要的ORDER BY语句?
编辑:显然,只要有一行,SQL Server将始终执行每个语句.即使有一行,这也会给你一个除零误差:
DECLARE @dt18YearsAgo AS DATETIME = DATEADD(YEAR,-18,GETDATE());
SELECT
Customers.Name
FROM
Customers
WHERE
Customers.DateOfBirth > @dt18YearsAgo
ORDER BY
Contacts.LastName ASC, …Run Code Online (Sandbox Code Playgroud) INSERT在InnoDB中进行批量处理时,我应该使用事务吗?
START TRANSACTION;
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3);
INSERT INTO tbl_name (a,b,c) VALUES(4,5,6);
INSERT INTO tbl_name (a,b,c) VALUES(7,8,9);
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
或者结合多个查询?
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Run Code Online (Sandbox Code Playgroud)
如果重要,我使用PHP并且MySQL数据库在同一台机器上.
我得到了简单的查询,它使用表值构造函数选择一些静态值:
SELECT c_id, c_type
FROM(VALUES
('8E0D2FD7-4D25-4FE5-8E01-8E07926E3D6B', 1),
('04FB3E91-3825-4EF3-B5A4-B42FBAEEE816', 1),
('8425047F-0DBD-463E-A7FE-EAE8812834CB', 1)) AS c(c_id, c_type);
Run Code Online (Sandbox Code Playgroud)
如果你执行它,你会立即得到结果,但我的实际查询有超过 7000 对值,它在我的机器上运行超过 30 秒,而且只是简单的持续扫描。有什么办法可以改善吗?不幸的是,我不允许重写此查询(例如使用临时表)。事情就是这样,问题是我可以做些什么来提高它的性能吗?

sql-server ×6
sql ×5
mysql ×3
c# ×2
insert ×2
t-sql ×2
.net ×1
benchmarking ×1
bulkupdate ×1
performance ×1
sql-order-by ×1